ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.44
Committed: Thu Nov 4 01:04:54 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.43: +4 -4 lines
Log Message:
strengthen toArray tests

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