ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.37
Committed: Mon Oct 11 04:35:20 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.36: +6 -10 lines
Log Message:
optimize testDelay

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