ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.34
Committed: Wed Sep 29 12:33:48 2010 UTC (13 years, 7 months ago) by dl
Branch: MAIN
Changes since 1.33: +2 -2 lines
Log Message:
Allow InterruptedException during initial checks in *TimedPollWithOffer

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 dl 1.5 * 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.20 Thread t = new Thread(new CheckedRunnable() {
494     public void realRun() throws InterruptedException {
495     try {
496 dl 1.34 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
497     assertSame(pdelay, q.poll(LONG_DELAY_MS, MILLISECONDS));
498 jsr166 1.20 q.poll(LONG_DELAY_MS, MILLISECONDS);
499     shouldThrow();
500     } catch (InterruptedException success) {}
501     }});
502    
503     t.start();
504     Thread.sleep(SMALL_DELAY_MS);
505 jsr166 1.23 assertTrue(q.offer(pdelay, SHORT_DELAY_MS, MILLISECONDS));
506 jsr166 1.20 t.interrupt();
507     t.join();
508 jsr166 1.15 }
509 dl 1.1
510    
511 dl 1.4 /**
512 dl 1.5 * peek returns next element, or null if empty
513 dl 1.4 */
514     public void testPeek() {
515 dl 1.3 DelayQueue q = populatedQueue(SIZE);
516     for (int i = 0; i < SIZE; ++i) {
517 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.peek()));
518 jsr166 1.26 assertEquals(new PDelay(i), ((PDelay)q.poll()));
519 dl 1.12 if (q.isEmpty())
520     assertNull(q.peek());
521     else
522 jsr166 1.26 assertFalse(new PDelay(i).equals(q.peek()));
523 dl 1.1 }
524 jsr166 1.18 assertNull(q.peek());
525 dl 1.1 }
526    
527 dl 1.4 /**
528 dl 1.5 * element returns next element, or throws NSEE if empty
529 dl 1.4 */
530     public void testElement() {
531 dl 1.3 DelayQueue q = populatedQueue(SIZE);
532     for (int i = 0; i < SIZE; ++i) {
533 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.element()));
534     q.poll();
535     }
536     try {
537     q.element();
538 dl 1.4 shouldThrow();
539 jsr166 1.20 } catch (NoSuchElementException success) {}
540 dl 1.1 }
541    
542 dl 1.4 /**
543 dl 1.5 * remove removes next element, or throws NSEE if empty
544 dl 1.4 */
545     public void testRemove() {
546 dl 1.3 DelayQueue q = populatedQueue(SIZE);
547     for (int i = 0; i < SIZE; ++i) {
548 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.remove()));
549     }
550     try {
551     q.remove();
552 dl 1.4 shouldThrow();
553 jsr166 1.20 } catch (NoSuchElementException success) {}
554 dl 1.1 }
555    
556 dl 1.4 /**
557 dl 1.5 * remove(x) removes x and returns true if present
558 dl 1.4 */
559     public void testRemoveElement() {
560 dl 1.3 DelayQueue q = populatedQueue(SIZE);
561     for (int i = 1; i < SIZE; i+=2) {
562 dl 1.1 assertTrue(q.remove(new PDelay(i)));
563     }
564 dl 1.3 for (int i = 0; i < SIZE; i+=2) {
565 dl 1.1 assertTrue(q.remove(new PDelay(i)));
566     assertFalse(q.remove(new PDelay(i+1)));
567     }
568 dl 1.2 assertTrue(q.isEmpty());
569 dl 1.1 }
570 jsr166 1.15
571 dl 1.4 /**
572 dl 1.5 * contains(x) reports true when elements added but not yet removed
573 dl 1.4 */
574     public void testContains() {
575 dl 1.3 DelayQueue q = populatedQueue(SIZE);
576     for (int i = 0; i < SIZE; ++i) {
577 dl 1.1 assertTrue(q.contains(new PDelay(i)));
578     q.poll();
579     assertFalse(q.contains(new PDelay(i)));
580     }
581     }
582    
583 dl 1.4 /**
584 dl 1.5 * clear removes all elements
585 dl 1.4 */
586     public void testClear() {
587 dl 1.3 DelayQueue q = populatedQueue(SIZE);
588 dl 1.1 q.clear();
589     assertTrue(q.isEmpty());
590     assertEquals(0, q.size());
591     assertEquals(NOCAP, q.remainingCapacity());
592 dl 1.11 PDelay x = new PDelay(1);
593     q.add(x);
594 dl 1.1 assertFalse(q.isEmpty());
595 dl 1.11 assertTrue(q.contains(x));
596 dl 1.1 q.clear();
597     assertTrue(q.isEmpty());
598     }
599    
600 dl 1.4 /**
601 dl 1.5 * containsAll(c) is true when c contains a subset of elements
602 dl 1.4 */
603     public void testContainsAll() {
604 dl 1.3 DelayQueue q = populatedQueue(SIZE);
605 dl 1.1 DelayQueue p = new DelayQueue();
606 dl 1.3 for (int i = 0; i < SIZE; ++i) {
607 dl 1.1 assertTrue(q.containsAll(p));
608     assertFalse(p.containsAll(q));
609     p.add(new PDelay(i));
610     }
611     assertTrue(p.containsAll(q));
612     }
613    
614 dl 1.4 /**
615 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
616 dl 1.4 */
617     public void testRetainAll() {
618 dl 1.3 DelayQueue q = populatedQueue(SIZE);
619     DelayQueue p = populatedQueue(SIZE);
620     for (int i = 0; i < SIZE; ++i) {
621 dl 1.1 boolean changed = q.retainAll(p);
622     if (i == 0)
623     assertFalse(changed);
624     else
625     assertTrue(changed);
626    
627     assertTrue(q.containsAll(p));
628 dl 1.3 assertEquals(SIZE-i, q.size());
629 dl 1.1 p.remove();
630     }
631     }
632    
633 dl 1.4 /**
634 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
635 dl 1.4 */
636     public void testRemoveAll() {
637 dl 1.3 for (int i = 1; i < SIZE; ++i) {
638     DelayQueue q = populatedQueue(SIZE);
639     DelayQueue p = populatedQueue(i);
640 dl 1.1 assertTrue(q.removeAll(p));
641 dl 1.3 assertEquals(SIZE-i, q.size());
642 dl 1.1 for (int j = 0; j < i; ++j) {
643     PDelay I = (PDelay)(p.remove());
644     assertFalse(q.contains(I));
645     }
646     }
647     }
648    
649 dl 1.4 /**
650 dl 1.5 * toArray contains all elements
651 dl 1.4 */
652 jsr166 1.20 public void testToArray() throws InterruptedException {
653 dl 1.3 DelayQueue q = populatedQueue(SIZE);
654 jsr166 1.18 Object[] o = q.toArray();
655 dl 1.1 Arrays.sort(o);
656 jsr166 1.18 for (int i = 0; i < o.length; i++)
657     assertEquals(o[i], q.take());
658 dl 1.1 }
659    
660 dl 1.4 /**
661 dl 1.5 * toArray(a) contains all elements
662 dl 1.4 */
663 jsr166 1.20 public void testToArray2() throws InterruptedException {
664 dl 1.3 DelayQueue q = populatedQueue(SIZE);
665 jsr166 1.18 PDelay[] ints = new PDelay[SIZE];
666     ints = (PDelay[])q.toArray(ints);
667 dl 1.1 Arrays.sort(ints);
668 jsr166 1.20 for (int i = 0; i < ints.length; i++)
669     assertEquals(ints[i], q.take());
670 dl 1.1 }
671 dl 1.6
672    
673     /**
674     * toArray(null) throws NPE
675     */
676     public void testToArray_BadArg() {
677 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
678 jsr166 1.18 try {
679     Object o[] = q.toArray(null);
680     shouldThrow();
681     } catch (NullPointerException success) {}
682 dl 1.6 }
683    
684     /**
685 dl 1.8 * toArray with incompatible array type throws CCE
686 dl 1.6 */
687     public void testToArray1_BadArg() {
688 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
689 jsr166 1.18 try {
690 jsr166 1.26 Object o[] = q.toArray(new String[10]);
691 jsr166 1.18 shouldThrow();
692 jsr166 1.20 } catch (ArrayStoreException success) {}
693 dl 1.6 }
694 jsr166 1.15
695 dl 1.4 /**
696 dl 1.5 * iterator iterates through all elements
697 dl 1.4 */
698     public void testIterator() {
699 dl 1.3 DelayQueue q = populatedQueue(SIZE);
700 dl 1.1 int i = 0;
701 jsr166 1.18 Iterator it = q.iterator();
702 jsr166 1.16 while (it.hasNext()) {
703 dl 1.1 assertTrue(q.contains(it.next()));
704     ++i;
705     }
706 dl 1.3 assertEquals(i, SIZE);
707 dl 1.1 }
708    
709 dl 1.4 /**
710 dl 1.5 * iterator.remove removes current element
711 dl 1.4 */
712 jsr166 1.31 public void testIteratorRemove() {
713 dl 1.1 final DelayQueue q = new DelayQueue();
714     q.add(new PDelay(2));
715     q.add(new PDelay(1));
716     q.add(new PDelay(3));
717     Iterator it = q.iterator();
718     it.next();
719     it.remove();
720     it = q.iterator();
721     assertEquals(it.next(), new PDelay(2));
722     assertEquals(it.next(), new PDelay(3));
723     assertFalse(it.hasNext());
724     }
725    
726    
727 dl 1.4 /**
728 dl 1.5 * toString contains toStrings of elements
729 dl 1.4 */
730     public void testToString() {
731 dl 1.3 DelayQueue q = populatedQueue(SIZE);
732 dl 1.1 String s = q.toString();
733 dl 1.3 for (int i = 0; i < SIZE; ++i) {
734     assertTrue(s.indexOf(String.valueOf(Integer.MIN_VALUE+i)) >= 0);
735 dl 1.1 }
736 jsr166 1.15 }
737 dl 1.1
738 dl 1.4 /**
739 dl 1.5 * offer transfers elements across Executor tasks
740 dl 1.4 */
741 dl 1.1 public void testPollInExecutor() {
742     final DelayQueue q = new DelayQueue();
743     ExecutorService executor = Executors.newFixedThreadPool(2);
744 jsr166 1.20 executor.execute(new CheckedRunnable() {
745     public void realRun() throws InterruptedException {
746 jsr166 1.27 assertNull(q.poll());
747     assertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
748     assertTrue(q.isEmpty());
749 jsr166 1.20 }});
750    
751     executor.execute(new CheckedRunnable() {
752     public void realRun() throws InterruptedException {
753     Thread.sleep(SHORT_DELAY_MS);
754     q.put(new PDelay(1));
755     }});
756 dl 1.1
757 dl 1.3 joinPool(executor);
758 dl 1.1 }
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 jsr166 1.33 assertNotNull(q.peek());
792 dl 1.12 }
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     }