ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.16
Committed: Mon Nov 16 04:57:10 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.15: +13 -13 lines
Log Message:
whitespace

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