ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.71
Committed: Sat Apr 25 04:55:30 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.70: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.7 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.47 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.15 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.64 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.util.ArrayList;
12 jsr166 1.53 import java.util.Arrays;
13 jsr166 1.63 import java.util.Collection;
14 jsr166 1.53 import java.util.Iterator;
15     import java.util.NoSuchElementException;
16     import java.util.concurrent.BlockingQueue;
17     import java.util.concurrent.CountDownLatch;
18     import java.util.concurrent.Delayed;
19     import java.util.concurrent.DelayQueue;
20     import java.util.concurrent.Executors;
21     import java.util.concurrent.ExecutorService;
22     import java.util.concurrent.TimeUnit;
23 jsr166 1.64
24     import junit.framework.Test;
25 dl 1.1
26 dl 1.3 public class DelayQueueTest extends JSR166TestCase {
27 jsr166 1.53
28     public static class Generic extends BlockingQueueTest {
29     protected BlockingQueue emptyCollection() {
30     return new DelayQueue();
31     }
32     protected PDelay makeElement(int i) {
33     return new PDelay(i);
34     }
35     }
36    
37 dl 1.1 public static void main(String[] args) {
38 jsr166 1.71 main(suite(), args);
39 dl 1.1 }
40    
41     public static Test suite() {
42 jsr166 1.53 return newTestSuite(DelayQueueTest.class,
43     new Generic().testSuite());
44 dl 1.1 }
45    
46 dl 1.4 /**
47 dl 1.8 * A delayed implementation for testing.
48 jsr166 1.28 * Most tests use Pseudodelays, where delays are all elapsed
49 dl 1.4 * (so, no blocking solely for delays) but are still ordered
50 jsr166 1.15 */
51     static class PDelay implements Delayed {
52 dl 1.1 int pseudodelay;
53 jsr166 1.55 PDelay(int i) { pseudodelay = i; }
54     public int compareTo(PDelay other) {
55     int a = this.pseudodelay;
56     int b = other.pseudodelay;
57     return (a < b) ? -1 : (a > b) ? 1 : 0;
58 dl 1.1 }
59 dl 1.10 public int compareTo(Delayed y) {
60 jsr166 1.28 return compareTo((PDelay)y);
61 dl 1.1 }
62     public boolean equals(Object other) {
63 jsr166 1.55 return (other instanceof PDelay) &&
64     this.pseudodelay == ((PDelay)other).pseudodelay;
65 dl 1.1 }
66 jsr166 1.61 // suppress [overrides] javac warning
67     public int hashCode() { return pseudodelay; }
68 dl 1.1 public long getDelay(TimeUnit ignore) {
69 jsr166 1.55 return Integer.MIN_VALUE + pseudodelay;
70 dl 1.1 }
71     public String toString() {
72     return String.valueOf(pseudodelay);
73     }
74     }
75    
76 dl 1.4 /**
77     * Delayed implementation that actually delays
78     */
79 jsr166 1.15 static class NanoDelay implements Delayed {
80 dl 1.4 long trigger;
81 jsr166 1.15 NanoDelay(long i) {
82 dl 1.4 trigger = System.nanoTime() + i;
83     }
84 dl 1.10 public int compareTo(NanoDelay y) {
85 dl 1.4 long i = trigger;
86 jsr166 1.28 long j = y.trigger;
87 dl 1.4 if (i < j) return -1;
88     if (i > j) return 1;
89     return 0;
90     }
91    
92 dl 1.10 public int compareTo(Delayed y) {
93 jsr166 1.28 return compareTo((NanoDelay)y);
94 dl 1.4 }
95    
96     public boolean equals(Object other) {
97 jsr166 1.28 return equals((NanoDelay)other);
98 dl 1.4 }
99     public boolean equals(NanoDelay other) {
100 jsr166 1.28 return other.trigger == trigger;
101 dl 1.4 }
102    
103 jsr166 1.61 // suppress [overrides] javac warning
104     public int hashCode() { return (int) trigger; }
105    
106 dl 1.4 public long getDelay(TimeUnit unit) {
107     long n = trigger - System.nanoTime();
108     return unit.convert(n, TimeUnit.NANOSECONDS);
109     }
110    
111     public long getTriggerTime() {
112     return trigger;
113     }
114    
115     public String toString() {
116     return String.valueOf(trigger);
117     }
118     }
119 dl 1.1
120     /**
121 jsr166 1.60 * Returns a new queue of given size containing consecutive
122 dl 1.1 * PDelays 0 ... n.
123     */
124 jsr166 1.45 private DelayQueue<PDelay> populatedQueue(int n) {
125     DelayQueue<PDelay> q = new DelayQueue<PDelay>();
126 dl 1.1 assertTrue(q.isEmpty());
127 jsr166 1.65 for (int i = n-1; i >= 0; i -= 2)
128 jsr166 1.18 assertTrue(q.offer(new PDelay(i)));
129 jsr166 1.65 for (int i = (n & 1); i < n; i += 2)
130 jsr166 1.18 assertTrue(q.offer(new PDelay(i)));
131 dl 1.1 assertFalse(q.isEmpty());
132 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
133 jsr166 1.18 assertEquals(n, q.size());
134 dl 1.1 return q;
135     }
136 jsr166 1.15
137 dl 1.4 /**
138 dl 1.5 * A new queue has unbounded capacity
139 dl 1.4 */
140     public void testConstructor1() {
141 jsr166 1.70 assertEquals(Integer.MAX_VALUE, new DelayQueue().remainingCapacity());
142 dl 1.1 }
143    
144 dl 1.4 /**
145 dl 1.5 * Initializing from null Collection throws NPE
146 dl 1.4 */
147     public void testConstructor3() {
148 dl 1.1 try {
149 jsr166 1.69 new DelayQueue(null);
150 dl 1.4 shouldThrow();
151 jsr166 1.20 } catch (NullPointerException success) {}
152 dl 1.1 }
153    
154 dl 1.4 /**
155 dl 1.5 * Initializing from Collection of null elements throws NPE
156 dl 1.4 */
157     public void testConstructor4() {
158 dl 1.1 try {
159 dl 1.3 PDelay[] ints = new PDelay[SIZE];
160 jsr166 1.69 new DelayQueue(Arrays.asList(ints));
161 dl 1.4 shouldThrow();
162 jsr166 1.20 } catch (NullPointerException success) {}
163 dl 1.1 }
164    
165 dl 1.4 /**
166 dl 1.5 * Initializing from Collection with some null elements throws NPE
167 dl 1.4 */
168     public void testConstructor5() {
169 dl 1.1 try {
170 dl 1.3 PDelay[] ints = new PDelay[SIZE];
171     for (int i = 0; i < SIZE-1; ++i)
172 dl 1.1 ints[i] = new PDelay(i);
173 jsr166 1.69 new DelayQueue(Arrays.asList(ints));
174 dl 1.4 shouldThrow();
175 jsr166 1.20 } catch (NullPointerException success) {}
176 dl 1.1 }
177    
178 dl 1.4 /**
179 dl 1.5 * Queue contains all elements of collection used to initialize
180 dl 1.4 */
181     public void testConstructor6() {
182 jsr166 1.21 PDelay[] ints = new PDelay[SIZE];
183     for (int i = 0; i < SIZE; ++i)
184     ints[i] = new PDelay(i);
185     DelayQueue q = new DelayQueue(Arrays.asList(ints));
186     for (int i = 0; i < SIZE; ++i)
187     assertEquals(ints[i], q.poll());
188 dl 1.1 }
189    
190 dl 1.4 /**
191 dl 1.5 * isEmpty is true before add, false after
192 dl 1.4 */
193 dl 1.1 public void testEmpty() {
194     DelayQueue q = new DelayQueue();
195     assertTrue(q.isEmpty());
196 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
197 dl 1.1 q.add(new PDelay(1));
198     assertFalse(q.isEmpty());
199     q.add(new PDelay(2));
200     q.remove();
201     q.remove();
202     assertTrue(q.isEmpty());
203     }
204    
205 dl 1.4 /**
206 jsr166 1.70 * remainingCapacity() always returns Integer.MAX_VALUE
207 dl 1.4 */
208     public void testRemainingCapacity() {
209 jsr166 1.70 BlockingQueue q = populatedQueue(SIZE);
210 dl 1.3 for (int i = 0; i < SIZE; ++i) {
211 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
212 dl 1.3 assertEquals(SIZE-i, q.size());
213 jsr166 1.70 assertTrue(q.remove() instanceof PDelay);
214 dl 1.1 }
215 dl 1.3 for (int i = 0; i < SIZE; ++i) {
216 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
217 dl 1.1 assertEquals(i, q.size());
218 jsr166 1.70 assertTrue(q.add(new PDelay(i)));
219 dl 1.1 }
220     }
221    
222 dl 1.4 /**
223 dl 1.5 * offer non-null succeeds
224 dl 1.4 */
225 dl 1.1 public void testOffer() {
226     DelayQueue q = new DelayQueue();
227     assertTrue(q.offer(new PDelay(0)));
228     assertTrue(q.offer(new PDelay(1)));
229     }
230    
231 dl 1.4 /**
232 dl 1.5 * add succeeds
233 dl 1.4 */
234     public void testAdd() {
235 dl 1.1 DelayQueue q = new DelayQueue();
236 dl 1.3 for (int i = 0; i < SIZE; ++i) {
237 dl 1.1 assertEquals(i, q.size());
238     assertTrue(q.add(new PDelay(i)));
239     }
240     }
241    
242 dl 1.4 /**
243 dl 1.6 * addAll(this) throws IAE
244     */
245     public void testAddAllSelf() {
246     try {
247     DelayQueue q = populatedQueue(SIZE);
248     q.addAll(q);
249     shouldThrow();
250 jsr166 1.20 } catch (IllegalArgumentException success) {}
251 dl 1.6 }
252    
253 dl 1.4 /**
254 dl 1.5 * addAll of a collection with any null elements throws NPE after
255     * possibly adding some elements
256 dl 1.4 */
257     public void testAddAll3() {
258 dl 1.1 try {
259     DelayQueue q = new DelayQueue();
260 dl 1.3 PDelay[] ints = new PDelay[SIZE];
261     for (int i = 0; i < SIZE-1; ++i)
262 dl 1.1 ints[i] = new PDelay(i);
263     q.addAll(Arrays.asList(ints));
264 dl 1.4 shouldThrow();
265 jsr166 1.20 } catch (NullPointerException success) {}
266 dl 1.1 }
267    
268 dl 1.4 /**
269 dl 1.5 * Queue contains all elements of successful addAll
270 dl 1.4 */
271     public void testAddAll5() {
272 jsr166 1.21 PDelay[] empty = new PDelay[0];
273     PDelay[] ints = new PDelay[SIZE];
274     for (int i = SIZE-1; i >= 0; --i)
275     ints[i] = new PDelay(i);
276     DelayQueue q = new DelayQueue();
277     assertFalse(q.addAll(Arrays.asList(empty)));
278     assertTrue(q.addAll(Arrays.asList(ints)));
279     for (int i = 0; i < SIZE; ++i)
280     assertEquals(ints[i], q.poll());
281 dl 1.1 }
282    
283 dl 1.4 /**
284 dl 1.5 * all elements successfully put are contained
285 dl 1.4 */
286 jsr166 1.48 public void testPut() {
287     DelayQueue q = new DelayQueue();
288     for (int i = 0; i < SIZE; ++i) {
289 jsr166 1.66 PDelay x = new PDelay(i);
290     q.put(x);
291     assertTrue(q.contains(x));
292 jsr166 1.48 }
293     assertEquals(SIZE, q.size());
294 dl 1.1 }
295    
296 dl 1.4 /**
297 dl 1.5 * put doesn't block waiting for take
298 dl 1.4 */
299 jsr166 1.20 public void testPutWithTake() throws InterruptedException {
300 dl 1.1 final DelayQueue q = new DelayQueue();
301 jsr166 1.50 Thread t = newStartedThread(new CheckedRunnable() {
302 jsr166 1.20 public void realRun() {
303     q.put(new PDelay(0));
304     q.put(new PDelay(0));
305     q.put(new PDelay(0));
306     q.put(new PDelay(0));
307     }});
308    
309 jsr166 1.50 awaitTermination(t);
310     assertEquals(4, q.size());
311 dl 1.1 }
312    
313 dl 1.4 /**
314 dl 1.5 * timed offer does not time out
315 dl 1.4 */
316 jsr166 1.20 public void testTimedOffer() throws InterruptedException {
317 dl 1.1 final DelayQueue q = new DelayQueue();
318 jsr166 1.50 Thread t = newStartedThread(new CheckedRunnable() {
319 jsr166 1.20 public void realRun() throws InterruptedException {
320     q.put(new PDelay(0));
321     q.put(new PDelay(0));
322 jsr166 1.24 assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, MILLISECONDS));
323     assertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, MILLISECONDS));
324 jsr166 1.20 }});
325 jsr166 1.15
326 jsr166 1.50 awaitTermination(t);
327 dl 1.1 }
328    
329 dl 1.4 /**
330 dl 1.5 * take retrieves elements in priority order
331 dl 1.4 */
332 jsr166 1.20 public void testTake() throws InterruptedException {
333     DelayQueue q = populatedQueue(SIZE);
334     for (int i = 0; i < SIZE; ++i) {
335 jsr166 1.67 assertEquals(new PDelay(i), q.take());
336 jsr166 1.18 }
337 dl 1.1 }
338    
339 dl 1.4 /**
340 dl 1.5 * Take removes existing elements until empty, then blocks interruptibly
341 dl 1.4 */
342 jsr166 1.20 public void testBlockingTake() throws InterruptedException {
343 jsr166 1.25 final DelayQueue q = populatedQueue(SIZE);
344 jsr166 1.50 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
345     Thread t = newStartedThread(new CheckedRunnable() {
346 jsr166 1.20 public void realRun() throws InterruptedException {
347     for (int i = 0; i < SIZE; ++i) {
348 jsr166 1.25 assertEquals(new PDelay(i), ((PDelay)q.take()));
349 jsr166 1.20 }
350 jsr166 1.50
351     Thread.currentThread().interrupt();
352     try {
353     q.take();
354     shouldThrow();
355     } catch (InterruptedException success) {}
356     assertFalse(Thread.interrupted());
357    
358     pleaseInterrupt.countDown();
359 jsr166 1.25 try {
360     q.take();
361     shouldThrow();
362     } catch (InterruptedException success) {}
363 jsr166 1.50 assertFalse(Thread.interrupted());
364 jsr166 1.25 }});
365 jsr166 1.20
366 jsr166 1.50 await(pleaseInterrupt);
367     assertThreadStaysAlive(t);
368 jsr166 1.20 t.interrupt();
369 jsr166 1.50 awaitTermination(t);
370 dl 1.1 }
371    
372 dl 1.4 /**
373 dl 1.5 * poll succeeds unless empty
374 dl 1.4 */
375     public void testPoll() {
376 dl 1.3 DelayQueue q = populatedQueue(SIZE);
377     for (int i = 0; i < SIZE; ++i) {
378 jsr166 1.67 assertEquals(new PDelay(i), q.poll());
379 dl 1.1 }
380 jsr166 1.18 assertNull(q.poll());
381 dl 1.1 }
382    
383 dl 1.4 /**
384 jsr166 1.41 * timed poll with zero timeout succeeds when non-empty, else times out
385 dl 1.4 */
386 jsr166 1.20 public void testTimedPoll0() throws InterruptedException {
387     DelayQueue q = populatedQueue(SIZE);
388     for (int i = 0; i < SIZE; ++i) {
389 jsr166 1.67 assertEquals(new PDelay(i), q.poll(0, MILLISECONDS));
390 jsr166 1.18 }
391 jsr166 1.20 assertNull(q.poll(0, MILLISECONDS));
392 dl 1.1 }
393    
394 dl 1.4 /**
395 jsr166 1.41 * timed poll with nonzero timeout succeeds when non-empty, else times out
396 dl 1.4 */
397 jsr166 1.20 public void testTimedPoll() throws InterruptedException {
398     DelayQueue q = populatedQueue(SIZE);
399     for (int i = 0; i < SIZE; ++i) {
400 jsr166 1.51 long startTime = System.nanoTime();
401 jsr166 1.67 assertEquals(new PDelay(i), q.poll(LONG_DELAY_MS, MILLISECONDS));
402 jsr166 1.51 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
403 jsr166 1.18 }
404 jsr166 1.51 long startTime = System.nanoTime();
405     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
406     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
407     checkEmpty(q);
408 dl 1.1 }
409    
410 dl 1.4 /**
411 dl 1.5 * Interrupted timed poll throws InterruptedException instead of
412     * returning timeout status
413 dl 1.4 */
414 jsr166 1.20 public void testInterruptedTimedPoll() throws InterruptedException {
415 jsr166 1.50 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
416     Thread t = newStartedThread(new CheckedRunnable() {
417 jsr166 1.20 public void realRun() throws InterruptedException {
418     DelayQueue q = populatedQueue(SIZE);
419     for (int i = 0; i < SIZE; ++i) {
420     assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
421     }
422 jsr166 1.50
423     Thread.currentThread().interrupt();
424     try {
425     q.poll(LONG_DELAY_MS, MILLISECONDS);
426     shouldThrow();
427     } catch (InterruptedException success) {}
428     assertFalse(Thread.interrupted());
429    
430     pleaseInterrupt.countDown();
431 jsr166 1.20 try {
432 jsr166 1.50 q.poll(LONG_DELAY_MS, MILLISECONDS);
433 jsr166 1.20 shouldThrow();
434     } catch (InterruptedException success) {}
435 jsr166 1.50 assertFalse(Thread.interrupted());
436 jsr166 1.20 }});
437    
438 jsr166 1.50 await(pleaseInterrupt);
439     assertThreadStaysAlive(t);
440 jsr166 1.20 t.interrupt();
441 jsr166 1.50 awaitTermination(t);
442 dl 1.1 }
443    
444 dl 1.4 /**
445 dl 1.5 * peek returns next element, or null if empty
446 dl 1.4 */
447     public void testPeek() {
448 dl 1.3 DelayQueue q = populatedQueue(SIZE);
449     for (int i = 0; i < SIZE; ++i) {
450 jsr166 1.67 assertEquals(new PDelay(i), q.peek());
451     assertEquals(new PDelay(i), q.poll());
452 dl 1.12 if (q.isEmpty())
453     assertNull(q.peek());
454     else
455 jsr166 1.26 assertFalse(new PDelay(i).equals(q.peek()));
456 dl 1.1 }
457 jsr166 1.18 assertNull(q.peek());
458 dl 1.1 }
459    
460 dl 1.4 /**
461 dl 1.5 * element returns next element, or throws NSEE if empty
462 dl 1.4 */
463     public void testElement() {
464 dl 1.3 DelayQueue q = populatedQueue(SIZE);
465     for (int i = 0; i < SIZE; ++i) {
466 jsr166 1.67 assertEquals(new PDelay(i), q.element());
467 dl 1.1 q.poll();
468     }
469     try {
470     q.element();
471 dl 1.4 shouldThrow();
472 jsr166 1.20 } catch (NoSuchElementException success) {}
473 dl 1.1 }
474    
475 dl 1.4 /**
476 dl 1.5 * remove removes next element, or throws NSEE if empty
477 dl 1.4 */
478     public void testRemove() {
479 dl 1.3 DelayQueue q = populatedQueue(SIZE);
480     for (int i = 0; i < SIZE; ++i) {
481 jsr166 1.67 assertEquals(new PDelay(i), q.remove());
482 dl 1.1 }
483     try {
484     q.remove();
485 dl 1.4 shouldThrow();
486 jsr166 1.20 } catch (NoSuchElementException success) {}
487 dl 1.1 }
488    
489 dl 1.4 /**
490 dl 1.5 * contains(x) reports true when elements added but not yet removed
491 dl 1.4 */
492     public void testContains() {
493 dl 1.3 DelayQueue q = populatedQueue(SIZE);
494     for (int i = 0; i < SIZE; ++i) {
495 dl 1.1 assertTrue(q.contains(new PDelay(i)));
496     q.poll();
497     assertFalse(q.contains(new PDelay(i)));
498     }
499     }
500    
501 dl 1.4 /**
502 dl 1.5 * clear removes all elements
503 dl 1.4 */
504     public void testClear() {
505 dl 1.3 DelayQueue q = populatedQueue(SIZE);
506 dl 1.1 q.clear();
507     assertTrue(q.isEmpty());
508     assertEquals(0, q.size());
509 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
510 dl 1.11 PDelay x = new PDelay(1);
511     q.add(x);
512 dl 1.1 assertFalse(q.isEmpty());
513 dl 1.11 assertTrue(q.contains(x));
514 dl 1.1 q.clear();
515     assertTrue(q.isEmpty());
516     }
517    
518 dl 1.4 /**
519 dl 1.5 * containsAll(c) is true when c contains a subset of elements
520 dl 1.4 */
521     public void testContainsAll() {
522 dl 1.3 DelayQueue q = populatedQueue(SIZE);
523 dl 1.1 DelayQueue p = new DelayQueue();
524 dl 1.3 for (int i = 0; i < SIZE; ++i) {
525 dl 1.1 assertTrue(q.containsAll(p));
526     assertFalse(p.containsAll(q));
527     p.add(new PDelay(i));
528     }
529     assertTrue(p.containsAll(q));
530     }
531    
532 dl 1.4 /**
533 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
534 dl 1.4 */
535     public void testRetainAll() {
536 dl 1.3 DelayQueue q = populatedQueue(SIZE);
537     DelayQueue p = populatedQueue(SIZE);
538     for (int i = 0; i < SIZE; ++i) {
539 dl 1.1 boolean changed = q.retainAll(p);
540     if (i == 0)
541     assertFalse(changed);
542     else
543     assertTrue(changed);
544    
545     assertTrue(q.containsAll(p));
546 dl 1.3 assertEquals(SIZE-i, q.size());
547 dl 1.1 p.remove();
548     }
549     }
550    
551 dl 1.4 /**
552 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
553 dl 1.4 */
554     public void testRemoveAll() {
555 dl 1.3 for (int i = 1; i < SIZE; ++i) {
556     DelayQueue q = populatedQueue(SIZE);
557     DelayQueue p = populatedQueue(i);
558 dl 1.1 assertTrue(q.removeAll(p));
559 dl 1.3 assertEquals(SIZE-i, q.size());
560 dl 1.1 for (int j = 0; j < i; ++j) {
561 jsr166 1.66 PDelay x = (PDelay)(p.remove());
562     assertFalse(q.contains(x));
563 dl 1.1 }
564     }
565     }
566    
567 dl 1.4 /**
568 dl 1.5 * toArray contains all elements
569 dl 1.4 */
570 jsr166 1.20 public void testToArray() throws InterruptedException {
571 dl 1.3 DelayQueue q = populatedQueue(SIZE);
572 jsr166 1.18 Object[] o = q.toArray();
573 dl 1.1 Arrays.sort(o);
574 jsr166 1.18 for (int i = 0; i < o.length; i++)
575 jsr166 1.44 assertSame(o[i], q.take());
576 dl 1.1 }
577    
578 dl 1.4 /**
579 dl 1.5 * toArray(a) contains all elements
580 dl 1.4 */
581 jsr166 1.44 public void testToArray2() {
582 jsr166 1.45 DelayQueue<PDelay> q = populatedQueue(SIZE);
583 jsr166 1.18 PDelay[] ints = new PDelay[SIZE];
584 jsr166 1.45 PDelay[] array = q.toArray(ints);
585     assertSame(ints, array);
586 dl 1.1 Arrays.sort(ints);
587 jsr166 1.20 for (int i = 0; i < ints.length; i++)
588 jsr166 1.44 assertSame(ints[i], q.remove());
589 dl 1.1 }
590 dl 1.6
591     /**
592 jsr166 1.42 * toArray(incompatible array type) throws ArrayStoreException
593 dl 1.6 */
594     public void testToArray1_BadArg() {
595 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
596 jsr166 1.18 try {
597 jsr166 1.42 q.toArray(new String[10]);
598 jsr166 1.18 shouldThrow();
599 jsr166 1.20 } catch (ArrayStoreException success) {}
600 dl 1.6 }
601 jsr166 1.15
602 dl 1.4 /**
603 dl 1.5 * iterator iterates through all elements
604 dl 1.4 */
605     public void testIterator() {
606 dl 1.3 DelayQueue q = populatedQueue(SIZE);
607 dl 1.1 int i = 0;
608 jsr166 1.18 Iterator it = q.iterator();
609 jsr166 1.16 while (it.hasNext()) {
610 dl 1.1 assertTrue(q.contains(it.next()));
611     ++i;
612     }
613 dl 1.3 assertEquals(i, SIZE);
614 jsr166 1.68 assertIteratorExhausted(it);
615     }
616    
617     /**
618     * iterator of empty collection has no elements
619     */
620     public void testEmptyIterator() {
621     assertIteratorExhausted(new DelayQueue().iterator());
622 dl 1.1 }
623    
624 dl 1.4 /**
625 dl 1.5 * iterator.remove removes current element
626 dl 1.4 */
627 jsr166 1.31 public void testIteratorRemove() {
628 dl 1.1 final DelayQueue q = new DelayQueue();
629     q.add(new PDelay(2));
630     q.add(new PDelay(1));
631     q.add(new PDelay(3));
632     Iterator it = q.iterator();
633     it.next();
634     it.remove();
635     it = q.iterator();
636 jsr166 1.58 assertEquals(new PDelay(2), it.next());
637     assertEquals(new PDelay(3), it.next());
638 dl 1.1 assertFalse(it.hasNext());
639     }
640    
641 dl 1.4 /**
642 dl 1.5 * toString contains toStrings of elements
643 dl 1.4 */
644     public void testToString() {
645 dl 1.3 DelayQueue q = populatedQueue(SIZE);
646 dl 1.1 String s = q.toString();
647 jsr166 1.55 for (Object e : q)
648     assertTrue(s.contains(e.toString()));
649 jsr166 1.15 }
650 dl 1.1
651 dl 1.4 /**
652 jsr166 1.50 * timed poll transfers elements across Executor tasks
653 dl 1.4 */
654 dl 1.1 public void testPollInExecutor() {
655     final DelayQueue q = new DelayQueue();
656 jsr166 1.50 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
657 dl 1.1 ExecutorService executor = Executors.newFixedThreadPool(2);
658 jsr166 1.20 executor.execute(new CheckedRunnable() {
659     public void realRun() throws InterruptedException {
660 jsr166 1.27 assertNull(q.poll());
661 jsr166 1.50 threadsStarted.await();
662 jsr166 1.62 assertNotNull(q.poll(LONG_DELAY_MS, MILLISECONDS));
663 jsr166 1.50 checkEmpty(q);
664 jsr166 1.20 }});
665    
666     executor.execute(new CheckedRunnable() {
667     public void realRun() throws InterruptedException {
668 jsr166 1.50 threadsStarted.await();
669 jsr166 1.20 q.put(new PDelay(1));
670     }});
671 dl 1.1
672 dl 1.3 joinPool(executor);
673 dl 1.1 }
674    
675 dl 1.4 /**
676 dl 1.8 * Delayed actions do not occur until their delay elapses
677 dl 1.4 */
678 jsr166 1.20 public void testDelay() throws InterruptedException {
679 jsr166 1.37 DelayQueue<NanoDelay> q = new DelayQueue<NanoDelay>();
680     for (int i = 0; i < SIZE; ++i)
681     q.add(new NanoDelay(1000000L * (SIZE - i)));
682 dl 1.1
683 jsr166 1.20 long last = 0;
684     for (int i = 0; i < SIZE; ++i) {
685 jsr166 1.37 NanoDelay e = q.take();
686 jsr166 1.20 long tt = e.getTriggerTime();
687 jsr166 1.37 assertTrue(System.nanoTime() - tt >= 0);
688 jsr166 1.20 if (i != 0)
689     assertTrue(tt >= last);
690     last = tt;
691 dl 1.1 }
692 jsr166 1.37 assertTrue(q.isEmpty());
693 dl 1.1 }
694 dl 1.6
695 dl 1.12 /**
696     * peek of a non-empty queue returns non-null even if not expired
697     */
698     public void testPeekDelayed() {
699     DelayQueue q = new DelayQueue();
700     q.add(new NanoDelay(Long.MAX_VALUE));
701 jsr166 1.33 assertNotNull(q.peek());
702 dl 1.12 }
703    
704     /**
705     * poll of a non-empty queue returns null if no expired elements.
706     */
707     public void testPollDelayed() {
708     DelayQueue q = new DelayQueue();
709     q.add(new NanoDelay(Long.MAX_VALUE));
710     assertNull(q.poll());
711     }
712 dl 1.6
713     /**
714 dl 1.13 * timed poll of a non-empty queue returns null if no expired elements.
715     */
716 jsr166 1.20 public void testTimedPollDelayed() throws InterruptedException {
717 dl 1.13 DelayQueue q = new DelayQueue();
718 dl 1.14 q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
719 jsr166 1.52 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
720 dl 1.13 }
721    
722     /**
723 dl 1.6 * drainTo(c) empties queue into another collection c
724 jsr166 1.15 */
725 dl 1.6 public void testDrainTo() {
726 dl 1.11 DelayQueue q = new DelayQueue();
727     PDelay[] elems = new PDelay[SIZE];
728     for (int i = 0; i < SIZE; ++i) {
729     elems[i] = new PDelay(i);
730     q.add(elems[i]);
731     }
732 dl 1.6 ArrayList l = new ArrayList();
733     q.drainTo(l);
734 jsr166 1.57 assertEquals(0, q.size());
735 jsr166 1.15 for (int i = 0; i < SIZE; ++i)
736 jsr166 1.58 assertEquals(elems[i], l.get(i));
737 dl 1.11 q.add(elems[0]);
738     q.add(elems[1]);
739     assertFalse(q.isEmpty());
740     assertTrue(q.contains(elems[0]));
741     assertTrue(q.contains(elems[1]));
742     l.clear();
743     q.drainTo(l);
744 jsr166 1.57 assertEquals(0, q.size());
745     assertEquals(2, l.size());
746 jsr166 1.15 for (int i = 0; i < 2; ++i)
747 jsr166 1.58 assertEquals(elems[i], l.get(i));
748 dl 1.6 }
749    
750     /**
751     * drainTo empties queue
752 jsr166 1.15 */
753 jsr166 1.20 public void testDrainToWithActivePut() throws InterruptedException {
754 dl 1.6 final DelayQueue q = populatedQueue(SIZE);
755 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
756     public void realRun() {
757     q.put(new PDelay(SIZE+1));
758     }});
759    
760     t.start();
761     ArrayList l = new ArrayList();
762     q.drainTo(l);
763     assertTrue(l.size() >= SIZE);
764     t.join();
765     assertTrue(q.size() + l.size() >= SIZE);
766 dl 1.6 }
767    
768     /**
769 jsr166 1.38 * drainTo(c, n) empties first min(n, size) elements of queue into c
770 jsr166 1.15 */
771 dl 1.6 public void testDrainToN() {
772     for (int i = 0; i < SIZE + 2; ++i) {
773     DelayQueue q = populatedQueue(SIZE);
774     ArrayList l = new ArrayList();
775     q.drainTo(l, i);
776 jsr166 1.39 int k = (i < SIZE) ? i : SIZE;
777 jsr166 1.58 assertEquals(SIZE-k, q.size());
778     assertEquals(k, l.size());
779 dl 1.6 }
780     }
781    
782 jsr166 1.63 /**
783     * remove(null), contains(null) always return false
784     */
785     public void testNeverContainsNull() {
786     Collection<?> q = populatedQueue(SIZE);
787     assertFalse(q.contains(null));
788     assertFalse(q.remove(null));
789     }
790 dl 1.1 }