ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.22
Committed: Sat Nov 21 19:11:53 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +1 -1 lines
Log Message:
reduce scope of check for IE in testInterruptedTimedPoll*

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