ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.28
Committed: Tue Dec 1 06:39:23 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.27: +9 -17 lines
Log Message:
remove redundant cast warnings

File Contents

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