ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.28
Committed: Tue Dec 1 06:39:23 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.27: +9 -17 lines
Log Message:
remove redundant cast warnings

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