ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.22
Committed: Sat Nov 21 19:11:53 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +1 -1 lines
Log Message:
reduce scope of check for IE in testInterruptedTimedPoll*

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