ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.47
Committed: Tue Mar 15 19:47:06 2011 UTC (13 years, 1 month ago) by jsr166
Branch: MAIN
Changes since 1.46: +1 -1 lines
Log Message:
Update Creative Commons license URL in legal notices

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.7 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.47 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.15 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     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 jsr166 1.45 private DelayQueue<PDelay> populatedQueue(int n) {
113     DelayQueue<PDelay> q = new DelayQueue<PDelay>();
114 dl 1.1 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.40 public void testTakeFromEmptyBlocksInterruptibly()
395     throws InterruptedException {
396     final BlockingQueue q = new DelayQueue();
397     final CountDownLatch threadStarted = new CountDownLatch(1);
398     Thread t = newStartedThread(new CheckedRunnable() {
399     public void realRun() {
400     long t0 = System.nanoTime();
401     threadStarted.countDown();
402     try {
403     q.take();
404     shouldThrow();
405 jsr166 1.46 } catch (InterruptedException success) {}
406 jsr166 1.40 assertTrue(millisElapsedSince(t0) >= SHORT_DELAY_MS);
407     }});
408     threadStarted.await();
409 jsr166 1.20 Thread.sleep(SHORT_DELAY_MS);
410 jsr166 1.40 assertTrue(t.isAlive());
411 jsr166 1.20 t.interrupt();
412 jsr166 1.40 awaitTermination(t, MEDIUM_DELAY_MS);
413     assertFalse(t.isAlive());
414 dl 1.1 }
415    
416 dl 1.4 /**
417 dl 1.5 * Take removes existing elements until empty, then blocks interruptibly
418 dl 1.4 */
419 jsr166 1.20 public void testBlockingTake() throws InterruptedException {
420 jsr166 1.25 final DelayQueue q = populatedQueue(SIZE);
421     Thread t = new Thread(new CheckedRunnable() {
422 jsr166 1.20 public void realRun() throws InterruptedException {
423     for (int i = 0; i < SIZE; ++i) {
424 jsr166 1.25 assertEquals(new PDelay(i), ((PDelay)q.take()));
425 jsr166 1.20 }
426 jsr166 1.25 try {
427     q.take();
428     shouldThrow();
429     } catch (InterruptedException success) {}
430     }});
431 jsr166 1.20
432 dl 1.1 t.start();
433 jsr166 1.20 Thread.sleep(SHORT_DELAY_MS);
434     t.interrupt();
435     t.join();
436 dl 1.1 }
437    
438    
439 dl 1.4 /**
440 dl 1.5 * poll succeeds unless empty
441 dl 1.4 */
442     public void testPoll() {
443 dl 1.3 DelayQueue q = populatedQueue(SIZE);
444     for (int i = 0; i < SIZE; ++i) {
445 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.poll()));
446     }
447 jsr166 1.18 assertNull(q.poll());
448 dl 1.1 }
449    
450 dl 1.4 /**
451 jsr166 1.41 * timed poll with zero timeout succeeds when non-empty, else times out
452 dl 1.4 */
453 jsr166 1.20 public void testTimedPoll0() throws InterruptedException {
454     DelayQueue q = populatedQueue(SIZE);
455     for (int i = 0; i < SIZE; ++i) {
456     assertEquals(new PDelay(i), ((PDelay)q.poll(0, MILLISECONDS)));
457 jsr166 1.18 }
458 jsr166 1.20 assertNull(q.poll(0, MILLISECONDS));
459 dl 1.1 }
460    
461 dl 1.4 /**
462 jsr166 1.41 * timed poll with nonzero timeout succeeds when non-empty, else times out
463 dl 1.4 */
464 jsr166 1.20 public void testTimedPoll() throws InterruptedException {
465     DelayQueue q = populatedQueue(SIZE);
466     for (int i = 0; i < SIZE; ++i) {
467     assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
468 jsr166 1.18 }
469 jsr166 1.20 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
470 dl 1.1 }
471    
472 dl 1.4 /**
473 dl 1.5 * Interrupted timed poll throws InterruptedException instead of
474     * returning timeout status
475 dl 1.4 */
476 jsr166 1.20 public void testInterruptedTimedPoll() throws InterruptedException {
477     Thread t = new Thread(new CheckedRunnable() {
478     public void realRun() throws InterruptedException {
479     DelayQueue q = populatedQueue(SIZE);
480     for (int i = 0; i < SIZE; ++i) {
481     assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
482     }
483     try {
484 jsr166 1.22 q.poll(SMALL_DELAY_MS, MILLISECONDS);
485 jsr166 1.20 shouldThrow();
486     } catch (InterruptedException success) {}
487     }});
488    
489 dl 1.1 t.start();
490 jsr166 1.20 Thread.sleep(SHORT_DELAY_MS);
491     t.interrupt();
492     t.join();
493 dl 1.1 }
494    
495 dl 1.4 /**
496 jsr166 1.35 * timed poll before a delayed offer fails; after offer succeeds;
497     * on interruption throws
498 dl 1.4 */
499 jsr166 1.20 public void testTimedPollWithOffer() throws InterruptedException {
500 dl 1.1 final DelayQueue q = new DelayQueue();
501 jsr166 1.23 final PDelay pdelay = new PDelay(0);
502 jsr166 1.35 final CheckedBarrier barrier = new CheckedBarrier(2);
503 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
504     public void realRun() throws InterruptedException {
505 jsr166 1.35 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
506    
507     barrier.await();
508     assertSame(pdelay, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
509    
510     Thread.currentThread().interrupt();
511     try {
512     q.poll(SHORT_DELAY_MS, MILLISECONDS);
513     shouldThrow();
514     } catch (InterruptedException success) {}
515    
516     barrier.await();
517 jsr166 1.20 try {
518 jsr166 1.35 q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
519 jsr166 1.20 shouldThrow();
520     } catch (InterruptedException success) {}
521     }});
522    
523     t.start();
524 jsr166 1.35 barrier.await();
525 jsr166 1.23 assertTrue(q.offer(pdelay, SHORT_DELAY_MS, MILLISECONDS));
526 jsr166 1.35 barrier.await();
527     sleep(SHORT_DELAY_MS);
528 jsr166 1.20 t.interrupt();
529     t.join();
530 jsr166 1.15 }
531 dl 1.1
532    
533 dl 1.4 /**
534 dl 1.5 * peek returns next element, or null if empty
535 dl 1.4 */
536     public void testPeek() {
537 dl 1.3 DelayQueue q = populatedQueue(SIZE);
538     for (int i = 0; i < SIZE; ++i) {
539 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.peek()));
540 jsr166 1.26 assertEquals(new PDelay(i), ((PDelay)q.poll()));
541 dl 1.12 if (q.isEmpty())
542     assertNull(q.peek());
543     else
544 jsr166 1.26 assertFalse(new PDelay(i).equals(q.peek()));
545 dl 1.1 }
546 jsr166 1.18 assertNull(q.peek());
547 dl 1.1 }
548    
549 dl 1.4 /**
550 dl 1.5 * element returns next element, or throws NSEE if empty
551 dl 1.4 */
552     public void testElement() {
553 dl 1.3 DelayQueue q = populatedQueue(SIZE);
554     for (int i = 0; i < SIZE; ++i) {
555 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.element()));
556     q.poll();
557     }
558     try {
559     q.element();
560 dl 1.4 shouldThrow();
561 jsr166 1.20 } catch (NoSuchElementException success) {}
562 dl 1.1 }
563    
564 dl 1.4 /**
565 dl 1.5 * remove removes next element, or throws NSEE if empty
566 dl 1.4 */
567     public void testRemove() {
568 dl 1.3 DelayQueue q = populatedQueue(SIZE);
569     for (int i = 0; i < SIZE; ++i) {
570 dl 1.1 assertEquals(new PDelay(i), ((PDelay)q.remove()));
571     }
572     try {
573     q.remove();
574 dl 1.4 shouldThrow();
575 jsr166 1.20 } catch (NoSuchElementException success) {}
576 dl 1.1 }
577    
578 dl 1.4 /**
579 dl 1.5 * remove(x) removes x and returns true if present
580 dl 1.4 */
581     public void testRemoveElement() {
582 dl 1.3 DelayQueue q = populatedQueue(SIZE);
583     for (int i = 1; i < SIZE; i+=2) {
584 dl 1.1 assertTrue(q.remove(new PDelay(i)));
585     }
586 dl 1.3 for (int i = 0; i < SIZE; i+=2) {
587 dl 1.1 assertTrue(q.remove(new PDelay(i)));
588     assertFalse(q.remove(new PDelay(i+1)));
589     }
590 dl 1.2 assertTrue(q.isEmpty());
591 dl 1.1 }
592 jsr166 1.15
593 dl 1.4 /**
594 dl 1.5 * contains(x) reports true when elements added but not yet removed
595 dl 1.4 */
596     public void testContains() {
597 dl 1.3 DelayQueue q = populatedQueue(SIZE);
598     for (int i = 0; i < SIZE; ++i) {
599 dl 1.1 assertTrue(q.contains(new PDelay(i)));
600     q.poll();
601     assertFalse(q.contains(new PDelay(i)));
602     }
603     }
604    
605 dl 1.4 /**
606 dl 1.5 * clear removes all elements
607 dl 1.4 */
608     public void testClear() {
609 dl 1.3 DelayQueue q = populatedQueue(SIZE);
610 dl 1.1 q.clear();
611     assertTrue(q.isEmpty());
612     assertEquals(0, q.size());
613     assertEquals(NOCAP, q.remainingCapacity());
614 dl 1.11 PDelay x = new PDelay(1);
615     q.add(x);
616 dl 1.1 assertFalse(q.isEmpty());
617 dl 1.11 assertTrue(q.contains(x));
618 dl 1.1 q.clear();
619     assertTrue(q.isEmpty());
620     }
621    
622 dl 1.4 /**
623 dl 1.5 * containsAll(c) is true when c contains a subset of elements
624 dl 1.4 */
625     public void testContainsAll() {
626 dl 1.3 DelayQueue q = populatedQueue(SIZE);
627 dl 1.1 DelayQueue p = new DelayQueue();
628 dl 1.3 for (int i = 0; i < SIZE; ++i) {
629 dl 1.1 assertTrue(q.containsAll(p));
630     assertFalse(p.containsAll(q));
631     p.add(new PDelay(i));
632     }
633     assertTrue(p.containsAll(q));
634     }
635    
636 dl 1.4 /**
637 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
638 dl 1.4 */
639     public void testRetainAll() {
640 dl 1.3 DelayQueue q = populatedQueue(SIZE);
641     DelayQueue p = populatedQueue(SIZE);
642     for (int i = 0; i < SIZE; ++i) {
643 dl 1.1 boolean changed = q.retainAll(p);
644     if (i == 0)
645     assertFalse(changed);
646     else
647     assertTrue(changed);
648    
649     assertTrue(q.containsAll(p));
650 dl 1.3 assertEquals(SIZE-i, q.size());
651 dl 1.1 p.remove();
652     }
653     }
654    
655 dl 1.4 /**
656 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
657 dl 1.4 */
658     public void testRemoveAll() {
659 dl 1.3 for (int i = 1; i < SIZE; ++i) {
660     DelayQueue q = populatedQueue(SIZE);
661     DelayQueue p = populatedQueue(i);
662 dl 1.1 assertTrue(q.removeAll(p));
663 dl 1.3 assertEquals(SIZE-i, q.size());
664 dl 1.1 for (int j = 0; j < i; ++j) {
665     PDelay I = (PDelay)(p.remove());
666     assertFalse(q.contains(I));
667     }
668     }
669     }
670    
671 dl 1.4 /**
672 dl 1.5 * toArray contains all elements
673 dl 1.4 */
674 jsr166 1.20 public void testToArray() throws InterruptedException {
675 dl 1.3 DelayQueue q = populatedQueue(SIZE);
676 jsr166 1.18 Object[] o = q.toArray();
677 dl 1.1 Arrays.sort(o);
678 jsr166 1.18 for (int i = 0; i < o.length; i++)
679 jsr166 1.44 assertSame(o[i], q.take());
680 dl 1.1 }
681    
682 dl 1.4 /**
683 dl 1.5 * toArray(a) contains all elements
684 dl 1.4 */
685 jsr166 1.44 public void testToArray2() {
686 jsr166 1.45 DelayQueue<PDelay> q = populatedQueue(SIZE);
687 jsr166 1.18 PDelay[] ints = new PDelay[SIZE];
688 jsr166 1.45 PDelay[] array = q.toArray(ints);
689     assertSame(ints, array);
690 dl 1.1 Arrays.sort(ints);
691 jsr166 1.20 for (int i = 0; i < ints.length; i++)
692 jsr166 1.44 assertSame(ints[i], q.remove());
693 dl 1.1 }
694 dl 1.6
695    
696     /**
697 jsr166 1.43 * toArray(null) throws NullPointerException
698 dl 1.6 */
699 jsr166 1.43 public void testToArray_NullArg() {
700 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
701 jsr166 1.18 try {
702 jsr166 1.43 q.toArray(null);
703 jsr166 1.18 shouldThrow();
704     } catch (NullPointerException success) {}
705 dl 1.6 }
706    
707     /**
708 jsr166 1.42 * toArray(incompatible array type) throws ArrayStoreException
709 dl 1.6 */
710     public void testToArray1_BadArg() {
711 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
712 jsr166 1.18 try {
713 jsr166 1.42 q.toArray(new String[10]);
714 jsr166 1.18 shouldThrow();
715 jsr166 1.20 } catch (ArrayStoreException success) {}
716 dl 1.6 }
717 jsr166 1.15
718 dl 1.4 /**
719 dl 1.5 * iterator iterates through all elements
720 dl 1.4 */
721     public void testIterator() {
722 dl 1.3 DelayQueue q = populatedQueue(SIZE);
723 dl 1.1 int i = 0;
724 jsr166 1.18 Iterator it = q.iterator();
725 jsr166 1.16 while (it.hasNext()) {
726 dl 1.1 assertTrue(q.contains(it.next()));
727     ++i;
728     }
729 dl 1.3 assertEquals(i, SIZE);
730 dl 1.1 }
731    
732 dl 1.4 /**
733 dl 1.5 * iterator.remove removes current element
734 dl 1.4 */
735 jsr166 1.31 public void testIteratorRemove() {
736 dl 1.1 final DelayQueue q = new DelayQueue();
737     q.add(new PDelay(2));
738     q.add(new PDelay(1));
739     q.add(new PDelay(3));
740     Iterator it = q.iterator();
741     it.next();
742     it.remove();
743     it = q.iterator();
744     assertEquals(it.next(), new PDelay(2));
745     assertEquals(it.next(), new PDelay(3));
746     assertFalse(it.hasNext());
747     }
748    
749    
750 dl 1.4 /**
751 dl 1.5 * toString contains toStrings of elements
752 dl 1.4 */
753     public void testToString() {
754 dl 1.3 DelayQueue q = populatedQueue(SIZE);
755 dl 1.1 String s = q.toString();
756 dl 1.3 for (int i = 0; i < SIZE; ++i) {
757     assertTrue(s.indexOf(String.valueOf(Integer.MIN_VALUE+i)) >= 0);
758 dl 1.1 }
759 jsr166 1.15 }
760 dl 1.1
761 dl 1.4 /**
762 dl 1.5 * offer transfers elements across Executor tasks
763 dl 1.4 */
764 dl 1.1 public void testPollInExecutor() {
765     final DelayQueue q = new DelayQueue();
766     ExecutorService executor = Executors.newFixedThreadPool(2);
767 jsr166 1.20 executor.execute(new CheckedRunnable() {
768     public void realRun() throws InterruptedException {
769 jsr166 1.27 assertNull(q.poll());
770     assertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
771     assertTrue(q.isEmpty());
772 jsr166 1.20 }});
773    
774     executor.execute(new CheckedRunnable() {
775     public void realRun() throws InterruptedException {
776     Thread.sleep(SHORT_DELAY_MS);
777     q.put(new PDelay(1));
778     }});
779 dl 1.1
780 dl 1.3 joinPool(executor);
781 dl 1.1 }
782    
783    
784 dl 1.4 /**
785 dl 1.8 * Delayed actions do not occur until their delay elapses
786 dl 1.4 */
787 jsr166 1.20 public void testDelay() throws InterruptedException {
788 jsr166 1.37 DelayQueue<NanoDelay> q = new DelayQueue<NanoDelay>();
789     for (int i = 0; i < SIZE; ++i)
790     q.add(new NanoDelay(1000000L * (SIZE - i)));
791 dl 1.1
792 jsr166 1.20 long last = 0;
793     for (int i = 0; i < SIZE; ++i) {
794 jsr166 1.37 NanoDelay e = q.take();
795 jsr166 1.20 long tt = e.getTriggerTime();
796 jsr166 1.37 assertTrue(System.nanoTime() - tt >= 0);
797 jsr166 1.20 if (i != 0)
798     assertTrue(tt >= last);
799     last = tt;
800 dl 1.1 }
801 jsr166 1.37 assertTrue(q.isEmpty());
802 dl 1.1 }
803 dl 1.6
804 dl 1.12 /**
805     * peek of a non-empty queue returns non-null even if not expired
806     */
807     public void testPeekDelayed() {
808     DelayQueue q = new DelayQueue();
809     q.add(new NanoDelay(Long.MAX_VALUE));
810 jsr166 1.33 assertNotNull(q.peek());
811 dl 1.12 }
812    
813 dl 1.13
814 dl 1.12 /**
815     * poll of a non-empty queue returns null if no expired elements.
816     */
817     public void testPollDelayed() {
818     DelayQueue q = new DelayQueue();
819     q.add(new NanoDelay(Long.MAX_VALUE));
820     assertNull(q.poll());
821     }
822 dl 1.6
823     /**
824 dl 1.13 * timed poll of a non-empty queue returns null if no expired elements.
825     */
826 jsr166 1.20 public void testTimedPollDelayed() throws InterruptedException {
827 dl 1.13 DelayQueue q = new DelayQueue();
828 dl 1.14 q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
829 jsr166 1.20 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
830 dl 1.13 }
831    
832     /**
833 dl 1.6 * drainTo(null) throws NPE
834 jsr166 1.15 */
835 dl 1.6 public void testDrainToNull() {
836     DelayQueue q = populatedQueue(SIZE);
837     try {
838     q.drainTo(null);
839     shouldThrow();
840 jsr166 1.20 } catch (NullPointerException success) {}
841 dl 1.6 }
842    
843     /**
844     * drainTo(this) throws IAE
845 jsr166 1.15 */
846 dl 1.6 public void testDrainToSelf() {
847     DelayQueue q = populatedQueue(SIZE);
848     try {
849     q.drainTo(q);
850     shouldThrow();
851 jsr166 1.20 } catch (IllegalArgumentException success) {}
852 dl 1.6 }
853    
854     /**
855     * drainTo(c) empties queue into another collection c
856 jsr166 1.15 */
857 dl 1.6 public void testDrainTo() {
858 dl 1.11 DelayQueue q = new DelayQueue();
859     PDelay[] elems = new PDelay[SIZE];
860     for (int i = 0; i < SIZE; ++i) {
861     elems[i] = new PDelay(i);
862     q.add(elems[i]);
863     }
864 dl 1.6 ArrayList l = new ArrayList();
865     q.drainTo(l);
866     assertEquals(q.size(), 0);
867 jsr166 1.15 for (int i = 0; i < SIZE; ++i)
868 dl 1.11 assertEquals(l.get(i), elems[i]);
869     q.add(elems[0]);
870     q.add(elems[1]);
871     assertFalse(q.isEmpty());
872     assertTrue(q.contains(elems[0]));
873     assertTrue(q.contains(elems[1]));
874     l.clear();
875     q.drainTo(l);
876     assertEquals(q.size(), 0);
877     assertEquals(l.size(), 2);
878 jsr166 1.15 for (int i = 0; i < 2; ++i)
879 dl 1.11 assertEquals(l.get(i), elems[i]);
880 dl 1.6 }
881    
882     /**
883     * drainTo empties queue
884 jsr166 1.15 */
885 jsr166 1.20 public void testDrainToWithActivePut() throws InterruptedException {
886 dl 1.6 final DelayQueue q = populatedQueue(SIZE);
887 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
888     public void realRun() {
889     q.put(new PDelay(SIZE+1));
890     }});
891    
892     t.start();
893     ArrayList l = new ArrayList();
894     q.drainTo(l);
895     assertTrue(l.size() >= SIZE);
896     t.join();
897     assertTrue(q.size() + l.size() >= SIZE);
898 dl 1.6 }
899    
900     /**
901     * drainTo(null, n) throws NPE
902 jsr166 1.15 */
903 dl 1.6 public void testDrainToNullN() {
904     DelayQueue q = populatedQueue(SIZE);
905     try {
906     q.drainTo(null, 0);
907     shouldThrow();
908 jsr166 1.20 } catch (NullPointerException success) {}
909 dl 1.6 }
910    
911     /**
912     * drainTo(this, n) throws IAE
913 jsr166 1.15 */
914 dl 1.6 public void testDrainToSelfN() {
915     DelayQueue q = populatedQueue(SIZE);
916     try {
917     q.drainTo(q, 0);
918     shouldThrow();
919 jsr166 1.20 } catch (IllegalArgumentException success) {}
920 dl 1.6 }
921    
922     /**
923 jsr166 1.38 * drainTo(c, n) empties first min(n, size) elements of queue into c
924 jsr166 1.15 */
925 dl 1.6 public void testDrainToN() {
926     for (int i = 0; i < SIZE + 2; ++i) {
927     DelayQueue q = populatedQueue(SIZE);
928     ArrayList l = new ArrayList();
929     q.drainTo(l, i);
930 jsr166 1.39 int k = (i < SIZE) ? i : SIZE;
931 dl 1.6 assertEquals(q.size(), SIZE-k);
932     assertEquals(l.size(), k);
933     }
934     }
935    
936 dl 1.1
937     }