ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.32
Committed: Wed Aug 25 01:44:48 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +1 -0 lines
Log Message:
whitespace

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 Thread t = new Thread(new CheckedRunnable() {
494 public void realRun() throws InterruptedException {
495 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
496 assertSame(pdelay, q.poll(LONG_DELAY_MS, MILLISECONDS));
497 try {
498 q.poll(LONG_DELAY_MS, MILLISECONDS);
499 shouldThrow();
500 } catch (InterruptedException success) {}
501 }});
502
503 t.start();
504 Thread.sleep(SMALL_DELAY_MS);
505 assertTrue(q.offer(pdelay, SHORT_DELAY_MS, MILLISECONDS));
506 t.interrupt();
507 t.join();
508 }
509
510
511 /**
512 * peek returns next element, or null if empty
513 */
514 public void testPeek() {
515 DelayQueue q = populatedQueue(SIZE);
516 for (int i = 0; i < SIZE; ++i) {
517 assertEquals(new PDelay(i), ((PDelay)q.peek()));
518 assertEquals(new PDelay(i), ((PDelay)q.poll()));
519 if (q.isEmpty())
520 assertNull(q.peek());
521 else
522 assertFalse(new PDelay(i).equals(q.peek()));
523 }
524 assertNull(q.peek());
525 }
526
527 /**
528 * element returns next element, or throws NSEE if empty
529 */
530 public void testElement() {
531 DelayQueue q = populatedQueue(SIZE);
532 for (int i = 0; i < SIZE; ++i) {
533 assertEquals(new PDelay(i), ((PDelay)q.element()));
534 q.poll();
535 }
536 try {
537 q.element();
538 shouldThrow();
539 } catch (NoSuchElementException success) {}
540 }
541
542 /**
543 * remove removes next element, or throws NSEE if empty
544 */
545 public void testRemove() {
546 DelayQueue q = populatedQueue(SIZE);
547 for (int i = 0; i < SIZE; ++i) {
548 assertEquals(new PDelay(i), ((PDelay)q.remove()));
549 }
550 try {
551 q.remove();
552 shouldThrow();
553 } catch (NoSuchElementException success) {}
554 }
555
556 /**
557 * remove(x) removes x and returns true if present
558 */
559 public void testRemoveElement() {
560 DelayQueue q = populatedQueue(SIZE);
561 for (int i = 1; i < SIZE; i+=2) {
562 assertTrue(q.remove(new PDelay(i)));
563 }
564 for (int i = 0; i < SIZE; i+=2) {
565 assertTrue(q.remove(new PDelay(i)));
566 assertFalse(q.remove(new PDelay(i+1)));
567 }
568 assertTrue(q.isEmpty());
569 }
570
571 /**
572 * contains(x) reports true when elements added but not yet removed
573 */
574 public void testContains() {
575 DelayQueue q = populatedQueue(SIZE);
576 for (int i = 0; i < SIZE; ++i) {
577 assertTrue(q.contains(new PDelay(i)));
578 q.poll();
579 assertFalse(q.contains(new PDelay(i)));
580 }
581 }
582
583 /**
584 * clear removes all elements
585 */
586 public void testClear() {
587 DelayQueue q = populatedQueue(SIZE);
588 q.clear();
589 assertTrue(q.isEmpty());
590 assertEquals(0, q.size());
591 assertEquals(NOCAP, q.remainingCapacity());
592 PDelay x = new PDelay(1);
593 q.add(x);
594 assertFalse(q.isEmpty());
595 assertTrue(q.contains(x));
596 q.clear();
597 assertTrue(q.isEmpty());
598 }
599
600 /**
601 * containsAll(c) is true when c contains a subset of elements
602 */
603 public void testContainsAll() {
604 DelayQueue q = populatedQueue(SIZE);
605 DelayQueue p = new DelayQueue();
606 for (int i = 0; i < SIZE; ++i) {
607 assertTrue(q.containsAll(p));
608 assertFalse(p.containsAll(q));
609 p.add(new PDelay(i));
610 }
611 assertTrue(p.containsAll(q));
612 }
613
614 /**
615 * retainAll(c) retains only those elements of c and reports true if changed
616 */
617 public void testRetainAll() {
618 DelayQueue q = populatedQueue(SIZE);
619 DelayQueue p = populatedQueue(SIZE);
620 for (int i = 0; i < SIZE; ++i) {
621 boolean changed = q.retainAll(p);
622 if (i == 0)
623 assertFalse(changed);
624 else
625 assertTrue(changed);
626
627 assertTrue(q.containsAll(p));
628 assertEquals(SIZE-i, q.size());
629 p.remove();
630 }
631 }
632
633 /**
634 * removeAll(c) removes only those elements of c and reports true if changed
635 */
636 public void testRemoveAll() {
637 for (int i = 1; i < SIZE; ++i) {
638 DelayQueue q = populatedQueue(SIZE);
639 DelayQueue p = populatedQueue(i);
640 assertTrue(q.removeAll(p));
641 assertEquals(SIZE-i, q.size());
642 for (int j = 0; j < i; ++j) {
643 PDelay I = (PDelay)(p.remove());
644 assertFalse(q.contains(I));
645 }
646 }
647 }
648
649 /**
650 * toArray contains all elements
651 */
652 public void testToArray() throws InterruptedException {
653 DelayQueue q = populatedQueue(SIZE);
654 Object[] o = q.toArray();
655 Arrays.sort(o);
656 for (int i = 0; i < o.length; i++)
657 assertEquals(o[i], q.take());
658 }
659
660 /**
661 * toArray(a) contains all elements
662 */
663 public void testToArray2() throws InterruptedException {
664 DelayQueue q = populatedQueue(SIZE);
665 PDelay[] ints = new PDelay[SIZE];
666 ints = (PDelay[])q.toArray(ints);
667 Arrays.sort(ints);
668 for (int i = 0; i < ints.length; i++)
669 assertEquals(ints[i], q.take());
670 }
671
672
673 /**
674 * toArray(null) throws NPE
675 */
676 public void testToArray_BadArg() {
677 DelayQueue q = populatedQueue(SIZE);
678 try {
679 Object o[] = q.toArray(null);
680 shouldThrow();
681 } catch (NullPointerException success) {}
682 }
683
684 /**
685 * toArray with incompatible array type throws CCE
686 */
687 public void testToArray1_BadArg() {
688 DelayQueue q = populatedQueue(SIZE);
689 try {
690 Object o[] = q.toArray(new String[10]);
691 shouldThrow();
692 } catch (ArrayStoreException success) {}
693 }
694
695 /**
696 * iterator iterates through all elements
697 */
698 public void testIterator() {
699 DelayQueue q = populatedQueue(SIZE);
700 int i = 0;
701 Iterator it = q.iterator();
702 while (it.hasNext()) {
703 assertTrue(q.contains(it.next()));
704 ++i;
705 }
706 assertEquals(i, SIZE);
707 }
708
709 /**
710 * iterator.remove removes current element
711 */
712 public void testIteratorRemove() {
713 final DelayQueue q = new DelayQueue();
714 q.add(new PDelay(2));
715 q.add(new PDelay(1));
716 q.add(new PDelay(3));
717 Iterator it = q.iterator();
718 it.next();
719 it.remove();
720 it = q.iterator();
721 assertEquals(it.next(), new PDelay(2));
722 assertEquals(it.next(), new PDelay(3));
723 assertFalse(it.hasNext());
724 }
725
726
727 /**
728 * toString contains toStrings of elements
729 */
730 public void testToString() {
731 DelayQueue q = populatedQueue(SIZE);
732 String s = q.toString();
733 for (int i = 0; i < SIZE; ++i) {
734 assertTrue(s.indexOf(String.valueOf(Integer.MIN_VALUE+i)) >= 0);
735 }
736 }
737
738 /**
739 * offer transfers elements across Executor tasks
740 */
741 public void testPollInExecutor() {
742 final DelayQueue q = new DelayQueue();
743 ExecutorService executor = Executors.newFixedThreadPool(2);
744 executor.execute(new CheckedRunnable() {
745 public void realRun() throws InterruptedException {
746 assertNull(q.poll());
747 assertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
748 assertTrue(q.isEmpty());
749 }});
750
751 executor.execute(new CheckedRunnable() {
752 public void realRun() throws InterruptedException {
753 Thread.sleep(SHORT_DELAY_MS);
754 q.put(new PDelay(1));
755 }});
756
757 joinPool(executor);
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 }