ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.35
Committed: Wed Oct 6 07:49:22 2010 UTC (13 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.34: +19 -6 lines
Log Message:
start of a big refactoring, with only one test refactored: testTimedPollWithOffer

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.31 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 jsr166 1.30 * remainingCapacity does not change when elements added or removed,
195 dl 1.5 * 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 jsr166 1.32
288 dl 1.4 /**
289 dl 1.5 * addAll of a collection with any null elements throws NPE after
290     * possibly adding some elements
291 dl 1.4 */
292     public void testAddAll3() {
293 dl 1.1 try {
294     DelayQueue q = new DelayQueue();
295 dl 1.3 PDelay[] ints = new PDelay[SIZE];
296     for (int i = 0; i < SIZE-1; ++i)
297 dl 1.1 ints[i] = new PDelay(i);
298     q.addAll(Arrays.asList(ints));
299 dl 1.4 shouldThrow();
300 jsr166 1.20 } catch (NullPointerException success) {}
301 dl 1.1 }
302    
303 dl 1.4 /**
304 dl 1.5 * Queue contains all elements of successful addAll
305 dl 1.4 */
306     public void testAddAll5() {
307 jsr166 1.21 PDelay[] empty = new PDelay[0];
308     PDelay[] ints = new PDelay[SIZE];
309     for (int i = SIZE-1; i >= 0; --i)
310     ints[i] = new PDelay(i);
311     DelayQueue q = new DelayQueue();
312     assertFalse(q.addAll(Arrays.asList(empty)));
313     assertTrue(q.addAll(Arrays.asList(ints)));
314     for (int i = 0; i < SIZE; ++i)
315     assertEquals(ints[i], q.poll());
316 dl 1.1 }
317    
318 dl 1.4 /**
319 dl 1.5 * put(null) throws NPE
320 dl 1.4 */
321 dl 1.1 public void testPutNull() {
322 jsr166 1.18 try {
323 dl 1.1 DelayQueue q = new DelayQueue();
324     q.put(null);
325 dl 1.4 shouldThrow();
326 jsr166 1.20 } catch (NullPointerException success) {}
327 dl 1.1 }
328    
329 dl 1.4 /**
330 dl 1.5 * all elements successfully put are contained
331 dl 1.4 */
332 dl 1.1 public void testPut() {
333 jsr166 1.20 DelayQueue q = new DelayQueue();
334     for (int i = 0; i < SIZE; ++i) {
335     PDelay I = new PDelay(i);
336     q.put(I);
337     assertTrue(q.contains(I));
338 dl 1.1 }
339 jsr166 1.20 assertEquals(SIZE, q.size());
340 dl 1.1 }
341    
342 dl 1.4 /**
343 dl 1.5 * put doesn't block waiting for take
344 dl 1.4 */
345 jsr166 1.20 public void testPutWithTake() throws InterruptedException {
346 dl 1.1 final DelayQueue q = new DelayQueue();
347 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
348     public void realRun() {
349     q.put(new PDelay(0));
350     q.put(new PDelay(0));
351     q.put(new PDelay(0));
352     q.put(new PDelay(0));
353     }});
354    
355     t.start();
356     Thread.sleep(SHORT_DELAY_MS);
357     q.take();
358     t.interrupt();
359     t.join();
360 dl 1.1 }
361    
362 dl 1.4 /**
363 dl 1.5 * timed offer does not time out
364 dl 1.4 */
365 jsr166 1.20 public void testTimedOffer() throws InterruptedException {
366 dl 1.1 final DelayQueue q = new DelayQueue();
367 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
368     public void realRun() throws InterruptedException {
369     q.put(new PDelay(0));
370     q.put(new PDelay(0));
371 jsr166 1.24 assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, MILLISECONDS));
372     assertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, MILLISECONDS));
373 jsr166 1.20 }});
374 jsr166 1.15
375 jsr166 1.20 t.start();
376     Thread.sleep(SMALL_DELAY_MS);
377     t.interrupt();
378     t.join();
379 dl 1.1 }
380    
381 dl 1.4 /**
382 dl 1.5 * take retrieves elements in priority order
383 dl 1.4 */
384 jsr166 1.20 public void testTake() throws InterruptedException {
385     DelayQueue q = populatedQueue(SIZE);
386     for (int i = 0; i < SIZE; ++i) {
387     assertEquals(new PDelay(i), ((PDelay)q.take()));
388 jsr166 1.18 }
389 dl 1.1 }
390    
391 dl 1.4 /**
392 dl 1.5 * take blocks interruptibly when empty
393 dl 1.4 */
394 jsr166 1.20 public void testTakeFromEmpty() throws InterruptedException {
395 dl 1.1 final DelayQueue q = new DelayQueue();
396 jsr166 1.20 Thread t = new ThreadShouldThrow(InterruptedException.class) {
397     public void realRun() throws InterruptedException {
398     q.take();
399     }};
400    
401     t.start();
402     Thread.sleep(SHORT_DELAY_MS);
403     t.interrupt();
404     t.join();
405 dl 1.1 }
406    
407 dl 1.4 /**
408 dl 1.5 * Take removes existing elements until empty, then blocks interruptibly
409 dl 1.4 */
410 jsr166 1.20 public void testBlockingTake() throws InterruptedException {
411 jsr166 1.25 final DelayQueue q = populatedQueue(SIZE);
412     Thread t = new Thread(new CheckedRunnable() {
413 jsr166 1.20 public void realRun() throws InterruptedException {
414     for (int i = 0; i < SIZE; ++i) {
415 jsr166 1.25 assertEquals(new PDelay(i), ((PDelay)q.take()));
416 jsr166 1.20 }
417 jsr166 1.25 try {
418     q.take();
419     shouldThrow();
420     } catch (InterruptedException success) {}
421     }});
422 jsr166 1.20
423 dl 1.1 t.start();
424 jsr166 1.20 Thread.sleep(SHORT_DELAY_MS);
425     t.interrupt();
426     t.join();
427 dl 1.1 }
428    
429    
430 dl 1.4 /**
431 dl 1.5 * poll succeeds unless empty
432 dl 1.4 */
433     public void testPoll() {
434 dl 1.3 DelayQueue q = populatedQueue(SIZE);
435     for (int i = 0; i < SIZE; ++i) {
436 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.poll()));
437     }
438 jsr166 1.18 assertNull(q.poll());
439 dl 1.1 }
440    
441 dl 1.4 /**
442 dl 1.5 * timed pool with zero timeout succeeds when non-empty, else times out
443 dl 1.4 */
444 jsr166 1.20 public void testTimedPoll0() throws InterruptedException {
445     DelayQueue q = populatedQueue(SIZE);
446     for (int i = 0; i < SIZE; ++i) {
447     assertEquals(new PDelay(i), ((PDelay)q.poll(0, MILLISECONDS)));
448 jsr166 1.18 }
449 jsr166 1.20 assertNull(q.poll(0, MILLISECONDS));
450 dl 1.1 }
451    
452 dl 1.4 /**
453 dl 1.5 * timed pool with nonzero timeout succeeds when non-empty, else times out
454 dl 1.4 */
455 jsr166 1.20 public void testTimedPoll() throws InterruptedException {
456     DelayQueue q = populatedQueue(SIZE);
457     for (int i = 0; i < SIZE; ++i) {
458     assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
459 jsr166 1.18 }
460 jsr166 1.20 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
461 dl 1.1 }
462    
463 dl 1.4 /**
464 dl 1.5 * Interrupted timed poll throws InterruptedException instead of
465     * returning timeout status
466 dl 1.4 */
467 jsr166 1.20 public void testInterruptedTimedPoll() throws InterruptedException {
468     Thread t = new Thread(new CheckedRunnable() {
469     public void realRun() throws InterruptedException {
470     DelayQueue q = populatedQueue(SIZE);
471     for (int i = 0; i < SIZE; ++i) {
472     assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
473     }
474     try {
475 jsr166 1.22 q.poll(SMALL_DELAY_MS, MILLISECONDS);
476 jsr166 1.20 shouldThrow();
477     } catch (InterruptedException success) {}
478     }});
479    
480 dl 1.1 t.start();
481 jsr166 1.20 Thread.sleep(SHORT_DELAY_MS);
482     t.interrupt();
483     t.join();
484 dl 1.1 }
485    
486 dl 1.4 /**
487 jsr166 1.35 * timed poll before a delayed offer fails; after offer succeeds;
488     * on interruption throws
489 dl 1.4 */
490 jsr166 1.20 public void testTimedPollWithOffer() throws InterruptedException {
491 dl 1.1 final DelayQueue q = new DelayQueue();
492 jsr166 1.23 final PDelay pdelay = new PDelay(0);
493 jsr166 1.35 final CheckedBarrier barrier = new CheckedBarrier(2);
494 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
495     public void realRun() throws InterruptedException {
496 jsr166 1.35 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
497    
498     barrier.await();
499     assertSame(pdelay, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
500    
501     Thread.currentThread().interrupt();
502     try {
503     q.poll(SHORT_DELAY_MS, MILLISECONDS);
504     shouldThrow();
505     } catch (InterruptedException success) {}
506    
507     barrier.await();
508 jsr166 1.20 try {
509 jsr166 1.35 q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
510 jsr166 1.20 shouldThrow();
511     } catch (InterruptedException success) {}
512     }});
513    
514     t.start();
515 jsr166 1.35 barrier.await();
516 jsr166 1.23 assertTrue(q.offer(pdelay, SHORT_DELAY_MS, MILLISECONDS));
517 jsr166 1.35 barrier.await();
518     sleep(SHORT_DELAY_MS);
519 jsr166 1.20 t.interrupt();
520     t.join();
521 jsr166 1.15 }
522 dl 1.1
523    
524 dl 1.4 /**
525 dl 1.5 * peek returns next element, or null if empty
526 dl 1.4 */
527     public void testPeek() {
528 dl 1.3 DelayQueue q = populatedQueue(SIZE);
529     for (int i = 0; i < SIZE; ++i) {
530 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.peek()));
531 jsr166 1.26 assertEquals(new PDelay(i), ((PDelay)q.poll()));
532 dl 1.12 if (q.isEmpty())
533     assertNull(q.peek());
534     else
535 jsr166 1.26 assertFalse(new PDelay(i).equals(q.peek()));
536 dl 1.1 }
537 jsr166 1.18 assertNull(q.peek());
538 dl 1.1 }
539    
540 dl 1.4 /**
541 dl 1.5 * element returns next element, or throws NSEE if empty
542 dl 1.4 */
543     public void testElement() {
544 dl 1.3 DelayQueue q = populatedQueue(SIZE);
545     for (int i = 0; i < SIZE; ++i) {
546 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.element()));
547     q.poll();
548     }
549     try {
550     q.element();
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 removes next element, or throws NSEE if empty
557 dl 1.4 */
558     public void testRemove() {
559 dl 1.3 DelayQueue q = populatedQueue(SIZE);
560     for (int i = 0; i < SIZE; ++i) {
561 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.remove()));
562     }
563     try {
564     q.remove();
565 dl 1.4 shouldThrow();
566 jsr166 1.20 } catch (NoSuchElementException success) {}
567 dl 1.1 }
568    
569 dl 1.4 /**
570 dl 1.5 * remove(x) removes x and returns true if present
571 dl 1.4 */
572     public void testRemoveElement() {
573 dl 1.3 DelayQueue q = populatedQueue(SIZE);
574     for (int i = 1; i < SIZE; i+=2) {
575 dl 1.1 assertTrue(q.remove(new PDelay(i)));
576     }
577 dl 1.3 for (int i = 0; i < SIZE; i+=2) {
578 dl 1.1 assertTrue(q.remove(new PDelay(i)));
579     assertFalse(q.remove(new PDelay(i+1)));
580     }
581 dl 1.2 assertTrue(q.isEmpty());
582 dl 1.1 }
583 jsr166 1.15
584 dl 1.4 /**
585 dl 1.5 * contains(x) reports true when elements added but not yet removed
586 dl 1.4 */
587     public void testContains() {
588 dl 1.3 DelayQueue q = populatedQueue(SIZE);
589     for (int i = 0; i < SIZE; ++i) {
590 dl 1.1 assertTrue(q.contains(new PDelay(i)));
591     q.poll();
592     assertFalse(q.contains(new PDelay(i)));
593     }
594     }
595    
596 dl 1.4 /**
597 dl 1.5 * clear removes all elements
598 dl 1.4 */
599     public void testClear() {
600 dl 1.3 DelayQueue q = populatedQueue(SIZE);
601 dl 1.1 q.clear();
602     assertTrue(q.isEmpty());
603     assertEquals(0, q.size());
604     assertEquals(NOCAP, q.remainingCapacity());
605 dl 1.11 PDelay x = new PDelay(1);
606     q.add(x);
607 dl 1.1 assertFalse(q.isEmpty());
608 dl 1.11 assertTrue(q.contains(x));
609 dl 1.1 q.clear();
610     assertTrue(q.isEmpty());
611     }
612    
613 dl 1.4 /**
614 dl 1.5 * containsAll(c) is true when c contains a subset of elements
615 dl 1.4 */
616     public void testContainsAll() {
617 dl 1.3 DelayQueue q = populatedQueue(SIZE);
618 dl 1.1 DelayQueue p = new DelayQueue();
619 dl 1.3 for (int i = 0; i < SIZE; ++i) {
620 dl 1.1 assertTrue(q.containsAll(p));
621     assertFalse(p.containsAll(q));
622     p.add(new PDelay(i));
623     }
624     assertTrue(p.containsAll(q));
625     }
626    
627 dl 1.4 /**
628 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
629 dl 1.4 */
630     public void testRetainAll() {
631 dl 1.3 DelayQueue q = populatedQueue(SIZE);
632     DelayQueue p = populatedQueue(SIZE);
633     for (int i = 0; i < SIZE; ++i) {
634 dl 1.1 boolean changed = q.retainAll(p);
635     if (i == 0)
636     assertFalse(changed);
637     else
638     assertTrue(changed);
639    
640     assertTrue(q.containsAll(p));
641 dl 1.3 assertEquals(SIZE-i, q.size());
642 dl 1.1 p.remove();
643     }
644     }
645    
646 dl 1.4 /**
647 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
648 dl 1.4 */
649     public void testRemoveAll() {
650 dl 1.3 for (int i = 1; i < SIZE; ++i) {
651     DelayQueue q = populatedQueue(SIZE);
652     DelayQueue p = populatedQueue(i);
653 dl 1.1 assertTrue(q.removeAll(p));
654 dl 1.3 assertEquals(SIZE-i, q.size());
655 dl 1.1 for (int j = 0; j < i; ++j) {
656     PDelay I = (PDelay)(p.remove());
657     assertFalse(q.contains(I));
658     }
659     }
660     }
661    
662 dl 1.4 /**
663 dl 1.5 * toArray contains all elements
664 dl 1.4 */
665 jsr166 1.20 public void testToArray() throws InterruptedException {
666 dl 1.3 DelayQueue q = populatedQueue(SIZE);
667 jsr166 1.18 Object[] o = q.toArray();
668 dl 1.1 Arrays.sort(o);
669 jsr166 1.18 for (int i = 0; i < o.length; i++)
670     assertEquals(o[i], q.take());
671 dl 1.1 }
672    
673 dl 1.4 /**
674 dl 1.5 * toArray(a) contains all elements
675 dl 1.4 */
676 jsr166 1.20 public void testToArray2() throws InterruptedException {
677 dl 1.3 DelayQueue q = populatedQueue(SIZE);
678 jsr166 1.18 PDelay[] ints = new PDelay[SIZE];
679     ints = (PDelay[])q.toArray(ints);
680 dl 1.1 Arrays.sort(ints);
681 jsr166 1.20 for (int i = 0; i < ints.length; i++)
682     assertEquals(ints[i], q.take());
683 dl 1.1 }
684 dl 1.6
685    
686     /**
687     * toArray(null) throws NPE
688     */
689     public void testToArray_BadArg() {
690 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
691 jsr166 1.18 try {
692     Object o[] = q.toArray(null);
693     shouldThrow();
694     } catch (NullPointerException success) {}
695 dl 1.6 }
696    
697     /**
698 dl 1.8 * toArray with incompatible array type throws CCE
699 dl 1.6 */
700     public void testToArray1_BadArg() {
701 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
702 jsr166 1.18 try {
703 jsr166 1.26 Object o[] = q.toArray(new String[10]);
704 jsr166 1.18 shouldThrow();
705 jsr166 1.20 } catch (ArrayStoreException success) {}
706 dl 1.6 }
707 jsr166 1.15
708 dl 1.4 /**
709 dl 1.5 * iterator iterates through all elements
710 dl 1.4 */
711     public void testIterator() {
712 dl 1.3 DelayQueue q = populatedQueue(SIZE);
713 dl 1.1 int i = 0;
714 jsr166 1.18 Iterator it = q.iterator();
715 jsr166 1.16 while (it.hasNext()) {
716 dl 1.1 assertTrue(q.contains(it.next()));
717     ++i;
718     }
719 dl 1.3 assertEquals(i, SIZE);
720 dl 1.1 }
721    
722 dl 1.4 /**
723 dl 1.5 * iterator.remove removes current element
724 dl 1.4 */
725 jsr166 1.31 public void testIteratorRemove() {
726 dl 1.1 final DelayQueue q = new DelayQueue();
727     q.add(new PDelay(2));
728     q.add(new PDelay(1));
729     q.add(new PDelay(3));
730     Iterator it = q.iterator();
731     it.next();
732     it.remove();
733     it = q.iterator();
734     assertEquals(it.next(), new PDelay(2));
735     assertEquals(it.next(), new PDelay(3));
736     assertFalse(it.hasNext());
737     }
738    
739    
740 dl 1.4 /**
741 dl 1.5 * toString contains toStrings of elements
742 dl 1.4 */
743     public void testToString() {
744 dl 1.3 DelayQueue q = populatedQueue(SIZE);
745 dl 1.1 String s = q.toString();
746 dl 1.3 for (int i = 0; i < SIZE; ++i) {
747     assertTrue(s.indexOf(String.valueOf(Integer.MIN_VALUE+i)) >= 0);
748 dl 1.1 }
749 jsr166 1.15 }
750 dl 1.1
751 dl 1.4 /**
752 dl 1.5 * offer transfers elements across Executor tasks
753 dl 1.4 */
754 dl 1.1 public void testPollInExecutor() {
755     final DelayQueue q = new DelayQueue();
756     ExecutorService executor = Executors.newFixedThreadPool(2);
757 jsr166 1.20 executor.execute(new CheckedRunnable() {
758     public void realRun() throws InterruptedException {
759 jsr166 1.27 assertNull(q.poll());
760     assertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
761     assertTrue(q.isEmpty());
762 jsr166 1.20 }});
763    
764     executor.execute(new CheckedRunnable() {
765     public void realRun() throws InterruptedException {
766     Thread.sleep(SHORT_DELAY_MS);
767     q.put(new PDelay(1));
768     }});
769 dl 1.1
770 dl 1.3 joinPool(executor);
771 dl 1.1 }
772    
773    
774 dl 1.4 /**
775 dl 1.8 * Delayed actions do not occur until their delay elapses
776 dl 1.4 */
777 jsr166 1.20 public void testDelay() throws InterruptedException {
778 dl 1.1 DelayQueue q = new DelayQueue();
779 dl 1.3 NanoDelay[] elements = new NanoDelay[SIZE];
780     for (int i = 0; i < SIZE; ++i) {
781     elements[i] = new NanoDelay(1000000000L + 1000000L * (SIZE - i));
782 dl 1.1 }
783 dl 1.3 for (int i = 0; i < SIZE; ++i) {
784 dl 1.1 q.add(elements[i]);
785     }
786    
787 jsr166 1.20 long last = 0;
788     for (int i = 0; i < SIZE; ++i) {
789     NanoDelay e = (NanoDelay)(q.take());
790     long tt = e.getTriggerTime();
791     assertTrue(tt <= System.nanoTime());
792     if (i != 0)
793     assertTrue(tt >= last);
794     last = tt;
795 dl 1.1 }
796     }
797 dl 1.6
798 dl 1.12 /**
799     * peek of a non-empty queue returns non-null even if not expired
800     */
801     public void testPeekDelayed() {
802     DelayQueue q = new DelayQueue();
803     q.add(new NanoDelay(Long.MAX_VALUE));
804 jsr166 1.33 assertNotNull(q.peek());
805 dl 1.12 }
806    
807 dl 1.13
808 dl 1.12 /**
809     * poll of a non-empty queue returns null if no expired elements.
810     */
811     public void testPollDelayed() {
812     DelayQueue q = new DelayQueue();
813     q.add(new NanoDelay(Long.MAX_VALUE));
814     assertNull(q.poll());
815     }
816 dl 1.6
817     /**
818 dl 1.13 * timed poll of a non-empty queue returns null if no expired elements.
819     */
820 jsr166 1.20 public void testTimedPollDelayed() throws InterruptedException {
821 dl 1.13 DelayQueue q = new DelayQueue();
822 dl 1.14 q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
823 jsr166 1.20 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
824 dl 1.13 }
825    
826     /**
827 dl 1.6 * drainTo(null) throws NPE
828 jsr166 1.15 */
829 dl 1.6 public void testDrainToNull() {
830     DelayQueue q = populatedQueue(SIZE);
831     try {
832     q.drainTo(null);
833     shouldThrow();
834 jsr166 1.20 } catch (NullPointerException success) {}
835 dl 1.6 }
836    
837     /**
838     * drainTo(this) throws IAE
839 jsr166 1.15 */
840 dl 1.6 public void testDrainToSelf() {
841     DelayQueue q = populatedQueue(SIZE);
842     try {
843     q.drainTo(q);
844     shouldThrow();
845 jsr166 1.20 } catch (IllegalArgumentException success) {}
846 dl 1.6 }
847    
848     /**
849     * drainTo(c) empties queue into another collection c
850 jsr166 1.15 */
851 dl 1.6 public void testDrainTo() {
852 dl 1.11 DelayQueue q = new DelayQueue();
853     PDelay[] elems = new PDelay[SIZE];
854     for (int i = 0; i < SIZE; ++i) {
855     elems[i] = new PDelay(i);
856     q.add(elems[i]);
857     }
858 dl 1.6 ArrayList l = new ArrayList();
859     q.drainTo(l);
860     assertEquals(q.size(), 0);
861 jsr166 1.15 for (int i = 0; i < SIZE; ++i)
862 dl 1.11 assertEquals(l.get(i), elems[i]);
863     q.add(elems[0]);
864     q.add(elems[1]);
865     assertFalse(q.isEmpty());
866     assertTrue(q.contains(elems[0]));
867     assertTrue(q.contains(elems[1]));
868     l.clear();
869     q.drainTo(l);
870     assertEquals(q.size(), 0);
871     assertEquals(l.size(), 2);
872 jsr166 1.15 for (int i = 0; i < 2; ++i)
873 dl 1.11 assertEquals(l.get(i), elems[i]);
874 dl 1.6 }
875    
876     /**
877     * drainTo empties queue
878 jsr166 1.15 */
879 jsr166 1.20 public void testDrainToWithActivePut() throws InterruptedException {
880 dl 1.6 final DelayQueue q = populatedQueue(SIZE);
881 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
882     public void realRun() {
883     q.put(new PDelay(SIZE+1));
884     }});
885    
886     t.start();
887     ArrayList l = new ArrayList();
888     q.drainTo(l);
889     assertTrue(l.size() >= SIZE);
890     t.join();
891     assertTrue(q.size() + l.size() >= SIZE);
892 dl 1.6 }
893    
894     /**
895     * drainTo(null, n) throws NPE
896 jsr166 1.15 */
897 dl 1.6 public void testDrainToNullN() {
898     DelayQueue q = populatedQueue(SIZE);
899     try {
900     q.drainTo(null, 0);
901     shouldThrow();
902 jsr166 1.20 } catch (NullPointerException success) {}
903 dl 1.6 }
904    
905     /**
906     * drainTo(this, n) throws IAE
907 jsr166 1.15 */
908 dl 1.6 public void testDrainToSelfN() {
909     DelayQueue q = populatedQueue(SIZE);
910     try {
911     q.drainTo(q, 0);
912     shouldThrow();
913 jsr166 1.20 } catch (IllegalArgumentException success) {}
914 dl 1.6 }
915    
916     /**
917     * drainTo(c, n) empties first max {n, size} elements of queue into c
918 jsr166 1.15 */
919 dl 1.6 public void testDrainToN() {
920     for (int i = 0; i < SIZE + 2; ++i) {
921     DelayQueue q = populatedQueue(SIZE);
922     ArrayList l = new ArrayList();
923     q.drainTo(l, i);
924     int k = (i < SIZE)? i : SIZE;
925     assertEquals(q.size(), SIZE-k);
926     assertEquals(l.size(), k);
927     }
928     }
929    
930 dl 1.1
931     }