ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.79
Committed: Mon Oct 17 01:54:51 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.78: +9 -1 lines
Log Message:
use CollectionImplementation

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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.Iterator;
15 import java.util.NoSuchElementException;
16 import java.util.concurrent.BlockingQueue;
17 import java.util.concurrent.CountDownLatch;
18 import java.util.concurrent.Delayed;
19 import java.util.concurrent.DelayQueue;
20 import java.util.concurrent.Executors;
21 import java.util.concurrent.ExecutorService;
22 import java.util.concurrent.TimeUnit;
23
24 import junit.framework.Test;
25
26 public class DelayQueueTest extends JSR166TestCase {
27
28 public static class Generic extends BlockingQueueTest {
29 protected BlockingQueue emptyCollection() {
30 return new DelayQueue();
31 }
32 protected PDelay makeElement(int i) {
33 return new PDelay(i);
34 }
35 }
36
37 public static void main(String[] args) {
38 main(suite(), args);
39 }
40
41 public static Test suite() {
42 class Implementation implements CollectionImplementation {
43 public Class<?> klazz() { return DelayQueue.class; }
44 public Collection emptyCollection() { return new DelayQueue(); }
45 public Object makeElement(int i) { return new PDelay(i); }
46 public boolean isConcurrent() { return true; }
47 public boolean permitsNulls() { return false; }
48 }
49 return newTestSuite(DelayQueueTest.class,
50 new Generic().testSuite(),
51 CollectionTest.testSuite(new Implementation()));
52 }
53
54 /**
55 * A delayed implementation for testing.
56 * Most tests use Pseudodelays, where delays are all elapsed
57 * (so, no blocking solely for delays) but are still ordered
58 */
59 static class PDelay implements Delayed {
60 int pseudodelay;
61 PDelay(int i) { pseudodelay = i; }
62 public int compareTo(PDelay other) {
63 int a = this.pseudodelay;
64 int b = other.pseudodelay;
65 return (a < b) ? -1 : (a > b) ? 1 : 0;
66 }
67 public int compareTo(Delayed y) {
68 return compareTo((PDelay)y);
69 }
70 public boolean equals(Object other) {
71 return (other instanceof PDelay) &&
72 this.pseudodelay == ((PDelay)other).pseudodelay;
73 }
74 // suppress [overrides] javac warning
75 public int hashCode() { return pseudodelay; }
76 public long getDelay(TimeUnit ignore) {
77 return Integer.MIN_VALUE + pseudodelay;
78 }
79 public String toString() {
80 return String.valueOf(pseudodelay);
81 }
82 }
83
84 /**
85 * Delayed implementation that actually delays
86 */
87 static class NanoDelay implements Delayed {
88 long trigger;
89 NanoDelay(long i) {
90 trigger = System.nanoTime() + i;
91 }
92 public int compareTo(NanoDelay y) {
93 long i = trigger;
94 long j = y.trigger;
95 if (i < j) return -1;
96 if (i > j) return 1;
97 return 0;
98 }
99
100 public int compareTo(Delayed y) {
101 return compareTo((NanoDelay)y);
102 }
103
104 public boolean equals(Object other) {
105 return (other instanceof NanoDelay) &&
106 this.trigger == ((NanoDelay)other).trigger;
107 }
108
109 // suppress [overrides] javac warning
110 public int hashCode() { return (int) trigger; }
111
112 public long getDelay(TimeUnit unit) {
113 long n = trigger - System.nanoTime();
114 return unit.convert(n, TimeUnit.NANOSECONDS);
115 }
116
117 public long getTriggerTime() {
118 return trigger;
119 }
120
121 public String toString() {
122 return String.valueOf(trigger);
123 }
124 }
125
126 /**
127 * Returns a new queue of given size containing consecutive
128 * PDelays 0 ... n - 1.
129 */
130 private DelayQueue<PDelay> populatedQueue(int n) {
131 DelayQueue<PDelay> q = new DelayQueue<PDelay>();
132 assertTrue(q.isEmpty());
133 for (int i = n - 1; i >= 0; i -= 2)
134 assertTrue(q.offer(new PDelay(i)));
135 for (int i = (n & 1); i < n; i += 2)
136 assertTrue(q.offer(new PDelay(i)));
137 assertFalse(q.isEmpty());
138 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
139 assertEquals(n, q.size());
140 assertEquals(new PDelay(0), q.peek());
141 return q;
142 }
143
144 /**
145 * A new queue has unbounded capacity
146 */
147 public void testConstructor1() {
148 assertEquals(Integer.MAX_VALUE, new DelayQueue().remainingCapacity());
149 }
150
151 /**
152 * Initializing from null Collection throws NPE
153 */
154 public void testConstructor3() {
155 try {
156 new DelayQueue(null);
157 shouldThrow();
158 } catch (NullPointerException success) {}
159 }
160
161 /**
162 * Initializing from Collection of null elements throws NPE
163 */
164 public void testConstructor4() {
165 try {
166 new DelayQueue(Arrays.asList(new PDelay[SIZE]));
167 shouldThrow();
168 } catch (NullPointerException success) {}
169 }
170
171 /**
172 * Initializing from Collection with some null elements throws NPE
173 */
174 public void testConstructor5() {
175 PDelay[] a = new PDelay[SIZE];
176 for (int i = 0; i < SIZE - 1; ++i)
177 a[i] = new PDelay(i);
178 try {
179 new DelayQueue(Arrays.asList(a));
180 shouldThrow();
181 } catch (NullPointerException success) {}
182 }
183
184 /**
185 * Queue contains all elements of collection used to initialize
186 */
187 public void testConstructor6() {
188 PDelay[] ints = new PDelay[SIZE];
189 for (int i = 0; i < SIZE; ++i)
190 ints[i] = new PDelay(i);
191 DelayQueue q = new DelayQueue(Arrays.asList(ints));
192 for (int i = 0; i < SIZE; ++i)
193 assertEquals(ints[i], q.poll());
194 }
195
196 /**
197 * isEmpty is true before add, false after
198 */
199 public void testEmpty() {
200 DelayQueue q = new DelayQueue();
201 assertTrue(q.isEmpty());
202 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
203 q.add(new PDelay(1));
204 assertFalse(q.isEmpty());
205 q.add(new PDelay(2));
206 q.remove();
207 q.remove();
208 assertTrue(q.isEmpty());
209 }
210
211 /**
212 * remainingCapacity() always returns Integer.MAX_VALUE
213 */
214 public void testRemainingCapacity() {
215 BlockingQueue q = populatedQueue(SIZE);
216 for (int i = 0; i < SIZE; ++i) {
217 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
218 assertEquals(SIZE - i, q.size());
219 assertTrue(q.remove() instanceof PDelay);
220 }
221 for (int i = 0; i < SIZE; ++i) {
222 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
223 assertEquals(i, q.size());
224 assertTrue(q.add(new PDelay(i)));
225 }
226 }
227
228 /**
229 * offer non-null succeeds
230 */
231 public void testOffer() {
232 DelayQueue q = new DelayQueue();
233 assertTrue(q.offer(new PDelay(0)));
234 assertTrue(q.offer(new PDelay(1)));
235 }
236
237 /**
238 * add succeeds
239 */
240 public void testAdd() {
241 DelayQueue q = new DelayQueue();
242 for (int i = 0; i < SIZE; ++i) {
243 assertEquals(i, q.size());
244 assertTrue(q.add(new PDelay(i)));
245 }
246 }
247
248 /**
249 * addAll(this) throws IAE
250 */
251 public void testAddAllSelf() {
252 DelayQueue q = populatedQueue(SIZE);
253 try {
254 q.addAll(q);
255 shouldThrow();
256 } catch (IllegalArgumentException success) {}
257 }
258
259 /**
260 * addAll of a collection with any null elements throws NPE after
261 * possibly adding some elements
262 */
263 public void testAddAll3() {
264 DelayQueue q = new DelayQueue();
265 PDelay[] a = new PDelay[SIZE];
266 for (int i = 0; i < SIZE - 1; ++i)
267 a[i] = new PDelay(i);
268 try {
269 q.addAll(Arrays.asList(a));
270 shouldThrow();
271 } catch (NullPointerException success) {}
272 }
273
274 /**
275 * Queue contains all elements of successful addAll
276 */
277 public void testAddAll5() {
278 PDelay[] empty = new PDelay[0];
279 PDelay[] ints = new PDelay[SIZE];
280 for (int i = SIZE - 1; i >= 0; --i)
281 ints[i] = new PDelay(i);
282 DelayQueue q = new DelayQueue();
283 assertFalse(q.addAll(Arrays.asList(empty)));
284 assertTrue(q.addAll(Arrays.asList(ints)));
285 for (int i = 0; i < SIZE; ++i)
286 assertEquals(ints[i], q.poll());
287 }
288
289 /**
290 * all elements successfully put are contained
291 */
292 public void testPut() {
293 DelayQueue q = new DelayQueue();
294 for (int i = 0; i < SIZE; ++i) {
295 PDelay x = new PDelay(i);
296 q.put(x);
297 assertTrue(q.contains(x));
298 }
299 assertEquals(SIZE, q.size());
300 }
301
302 /**
303 * put doesn't block waiting for take
304 */
305 public void testPutWithTake() throws InterruptedException {
306 final DelayQueue q = new DelayQueue();
307 Thread t = newStartedThread(new CheckedRunnable() {
308 public void realRun() {
309 q.put(new PDelay(0));
310 q.put(new PDelay(0));
311 q.put(new PDelay(0));
312 q.put(new PDelay(0));
313 }});
314
315 awaitTermination(t);
316 assertEquals(4, q.size());
317 }
318
319 /**
320 * timed offer does not time out
321 */
322 public void testTimedOffer() throws InterruptedException {
323 final DelayQueue q = new DelayQueue();
324 Thread t = newStartedThread(new CheckedRunnable() {
325 public void realRun() throws InterruptedException {
326 q.put(new PDelay(0));
327 q.put(new PDelay(0));
328 assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, MILLISECONDS));
329 assertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, MILLISECONDS));
330 }});
331
332 awaitTermination(t);
333 }
334
335 /**
336 * take retrieves elements in priority order
337 */
338 public void testTake() throws InterruptedException {
339 DelayQueue q = populatedQueue(SIZE);
340 for (int i = 0; i < SIZE; ++i) {
341 assertEquals(new PDelay(i), q.take());
342 }
343 }
344
345 /**
346 * Take removes existing elements until empty, then blocks interruptibly
347 */
348 public void testBlockingTake() throws InterruptedException {
349 final DelayQueue q = populatedQueue(SIZE);
350 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
351 Thread t = newStartedThread(new CheckedRunnable() {
352 public void realRun() throws InterruptedException {
353 for (int i = 0; i < SIZE; ++i) {
354 assertEquals(new PDelay(i), ((PDelay)q.take()));
355 }
356
357 Thread.currentThread().interrupt();
358 try {
359 q.take();
360 shouldThrow();
361 } catch (InterruptedException success) {}
362 assertFalse(Thread.interrupted());
363
364 pleaseInterrupt.countDown();
365 try {
366 q.take();
367 shouldThrow();
368 } catch (InterruptedException success) {}
369 assertFalse(Thread.interrupted());
370 }});
371
372 await(pleaseInterrupt);
373 assertThreadStaysAlive(t);
374 t.interrupt();
375 awaitTermination(t);
376 }
377
378 /**
379 * poll succeeds unless empty
380 */
381 public void testPoll() {
382 DelayQueue q = populatedQueue(SIZE);
383 for (int i = 0; i < SIZE; ++i) {
384 assertEquals(new PDelay(i), q.poll());
385 }
386 assertNull(q.poll());
387 }
388
389 /**
390 * timed poll with zero timeout succeeds when non-empty, else times out
391 */
392 public void testTimedPoll0() throws InterruptedException {
393 DelayQueue q = populatedQueue(SIZE);
394 for (int i = 0; i < SIZE; ++i) {
395 assertEquals(new PDelay(i), q.poll(0, MILLISECONDS));
396 }
397 assertNull(q.poll(0, MILLISECONDS));
398 }
399
400 /**
401 * timed poll with nonzero timeout succeeds when non-empty, else times out
402 */
403 public void testTimedPoll() throws InterruptedException {
404 DelayQueue q = populatedQueue(SIZE);
405 for (int i = 0; i < SIZE; ++i) {
406 long startTime = System.nanoTime();
407 assertEquals(new PDelay(i), q.poll(LONG_DELAY_MS, MILLISECONDS));
408 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
409 }
410 long startTime = System.nanoTime();
411 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
412 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
413 checkEmpty(q);
414 }
415
416 /**
417 * Interrupted timed poll throws InterruptedException instead of
418 * returning timeout status
419 */
420 public void testInterruptedTimedPoll() throws InterruptedException {
421 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
422 final DelayQueue q = populatedQueue(SIZE);
423 Thread t = newStartedThread(new CheckedRunnable() {
424 public void realRun() throws InterruptedException {
425 long startTime = System.nanoTime();
426 for (int i = 0; i < SIZE; ++i) {
427 assertEquals(new PDelay(i),
428 ((PDelay)q.poll(LONG_DELAY_MS, MILLISECONDS)));
429 }
430
431 Thread.currentThread().interrupt();
432 try {
433 q.poll(LONG_DELAY_MS, MILLISECONDS);
434 shouldThrow();
435 } catch (InterruptedException success) {}
436 assertFalse(Thread.interrupted());
437
438 pleaseInterrupt.countDown();
439 try {
440 q.poll(LONG_DELAY_MS, MILLISECONDS);
441 shouldThrow();
442 } catch (InterruptedException success) {}
443 assertFalse(Thread.interrupted());
444 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
445 }});
446
447 await(pleaseInterrupt);
448 assertThreadStaysAlive(t);
449 t.interrupt();
450 awaitTermination(t);
451 checkEmpty(q);
452 }
453
454 /**
455 * peek returns next element, or null if empty
456 */
457 public void testPeek() {
458 DelayQueue q = populatedQueue(SIZE);
459 for (int i = 0; i < SIZE; ++i) {
460 assertEquals(new PDelay(i), q.peek());
461 assertEquals(new PDelay(i), q.poll());
462 if (q.isEmpty())
463 assertNull(q.peek());
464 else
465 assertFalse(new PDelay(i).equals(q.peek()));
466 }
467 assertNull(q.peek());
468 }
469
470 /**
471 * element returns next element, or throws NSEE if empty
472 */
473 public void testElement() {
474 DelayQueue q = populatedQueue(SIZE);
475 for (int i = 0; i < SIZE; ++i) {
476 assertEquals(new PDelay(i), q.element());
477 q.poll();
478 }
479 try {
480 q.element();
481 shouldThrow();
482 } catch (NoSuchElementException success) {}
483 }
484
485 /**
486 * remove removes next element, or throws NSEE if empty
487 */
488 public void testRemove() {
489 DelayQueue q = populatedQueue(SIZE);
490 for (int i = 0; i < SIZE; ++i) {
491 assertEquals(new PDelay(i), q.remove());
492 }
493 try {
494 q.remove();
495 shouldThrow();
496 } catch (NoSuchElementException success) {}
497 }
498
499 /**
500 * contains(x) reports true when elements added but not yet removed
501 */
502 public void testContains() {
503 DelayQueue q = populatedQueue(SIZE);
504 for (int i = 0; i < SIZE; ++i) {
505 assertTrue(q.contains(new PDelay(i)));
506 q.poll();
507 assertFalse(q.contains(new PDelay(i)));
508 }
509 }
510
511 /**
512 * clear removes all elements
513 */
514 public void testClear() {
515 DelayQueue q = populatedQueue(SIZE);
516 q.clear();
517 assertTrue(q.isEmpty());
518 assertEquals(0, q.size());
519 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
520 PDelay x = new PDelay(1);
521 q.add(x);
522 assertFalse(q.isEmpty());
523 assertTrue(q.contains(x));
524 q.clear();
525 assertTrue(q.isEmpty());
526 }
527
528 /**
529 * containsAll(c) is true when c contains a subset of elements
530 */
531 public void testContainsAll() {
532 DelayQueue q = populatedQueue(SIZE);
533 DelayQueue p = new DelayQueue();
534 for (int i = 0; i < SIZE; ++i) {
535 assertTrue(q.containsAll(p));
536 assertFalse(p.containsAll(q));
537 p.add(new PDelay(i));
538 }
539 assertTrue(p.containsAll(q));
540 }
541
542 /**
543 * retainAll(c) retains only those elements of c and reports true if changed
544 */
545 public void testRetainAll() {
546 DelayQueue q = populatedQueue(SIZE);
547 DelayQueue p = populatedQueue(SIZE);
548 for (int i = 0; i < SIZE; ++i) {
549 boolean changed = q.retainAll(p);
550 if (i == 0)
551 assertFalse(changed);
552 else
553 assertTrue(changed);
554
555 assertTrue(q.containsAll(p));
556 assertEquals(SIZE - i, q.size());
557 p.remove();
558 }
559 }
560
561 /**
562 * removeAll(c) removes only those elements of c and reports true if changed
563 */
564 public void testRemoveAll() {
565 for (int i = 1; i < SIZE; ++i) {
566 DelayQueue q = populatedQueue(SIZE);
567 DelayQueue p = populatedQueue(i);
568 assertTrue(q.removeAll(p));
569 assertEquals(SIZE - i, q.size());
570 for (int j = 0; j < i; ++j) {
571 PDelay x = (PDelay)(p.remove());
572 assertFalse(q.contains(x));
573 }
574 }
575 }
576
577 /**
578 * toArray contains all elements
579 */
580 public void testToArray() throws InterruptedException {
581 DelayQueue q = populatedQueue(SIZE);
582 Object[] o = q.toArray();
583 Arrays.sort(o);
584 for (int i = 0; i < o.length; i++)
585 assertSame(o[i], q.take());
586 }
587
588 /**
589 * toArray(a) contains all elements
590 */
591 public void testToArray2() {
592 DelayQueue<PDelay> q = populatedQueue(SIZE);
593 PDelay[] ints = new PDelay[SIZE];
594 PDelay[] array = q.toArray(ints);
595 assertSame(ints, array);
596 Arrays.sort(ints);
597 for (int i = 0; i < ints.length; i++)
598 assertSame(ints[i], q.remove());
599 }
600
601 /**
602 * toArray(incompatible array type) throws ArrayStoreException
603 */
604 public void testToArray1_BadArg() {
605 DelayQueue q = populatedQueue(SIZE);
606 try {
607 q.toArray(new String[10]);
608 shouldThrow();
609 } catch (ArrayStoreException success) {}
610 }
611
612 /**
613 * iterator iterates through all elements
614 */
615 public void testIterator() {
616 DelayQueue q = populatedQueue(SIZE);
617 int i = 0;
618 Iterator it = q.iterator();
619 while (it.hasNext()) {
620 assertTrue(q.contains(it.next()));
621 ++i;
622 }
623 assertEquals(i, SIZE);
624 assertIteratorExhausted(it);
625 }
626
627 /**
628 * iterator of empty collection has no elements
629 */
630 public void testEmptyIterator() {
631 assertIteratorExhausted(new DelayQueue().iterator());
632 }
633
634 /**
635 * iterator.remove removes current element
636 */
637 public void testIteratorRemove() {
638 final DelayQueue q = new DelayQueue();
639 q.add(new PDelay(2));
640 q.add(new PDelay(1));
641 q.add(new PDelay(3));
642 Iterator it = q.iterator();
643 it.next();
644 it.remove();
645 it = q.iterator();
646 assertEquals(new PDelay(2), it.next());
647 assertEquals(new PDelay(3), it.next());
648 assertFalse(it.hasNext());
649 }
650
651 /**
652 * toString contains toStrings of elements
653 */
654 public void testToString() {
655 DelayQueue q = populatedQueue(SIZE);
656 String s = q.toString();
657 for (Object e : q)
658 assertTrue(s.contains(e.toString()));
659 }
660
661 /**
662 * timed poll transfers elements across Executor tasks
663 */
664 public void testPollInExecutor() {
665 final DelayQueue q = new DelayQueue();
666 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
667 final ExecutorService executor = Executors.newFixedThreadPool(2);
668 try (PoolCleaner cleaner = cleaner(executor)) {
669 executor.execute(new CheckedRunnable() {
670 public void realRun() throws InterruptedException {
671 assertNull(q.poll());
672 threadsStarted.await();
673 assertNotNull(q.poll(LONG_DELAY_MS, MILLISECONDS));
674 checkEmpty(q);
675 }});
676
677 executor.execute(new CheckedRunnable() {
678 public void realRun() throws InterruptedException {
679 threadsStarted.await();
680 q.put(new PDelay(1));
681 }});
682 }
683 }
684
685 /**
686 * Delayed actions do not occur until their delay elapses
687 */
688 public void testDelay() throws InterruptedException {
689 DelayQueue<NanoDelay> q = new DelayQueue<NanoDelay>();
690 for (int i = 0; i < SIZE; ++i)
691 q.add(new NanoDelay(1000000L * (SIZE - i)));
692
693 long last = 0;
694 for (int i = 0; i < SIZE; ++i) {
695 NanoDelay e = q.take();
696 long tt = e.getTriggerTime();
697 assertTrue(System.nanoTime() - tt >= 0);
698 if (i != 0)
699 assertTrue(tt >= last);
700 last = tt;
701 }
702 assertTrue(q.isEmpty());
703 }
704
705 /**
706 * peek of a non-empty queue returns non-null even if not expired
707 */
708 public void testPeekDelayed() {
709 DelayQueue q = new DelayQueue();
710 q.add(new NanoDelay(Long.MAX_VALUE));
711 assertNotNull(q.peek());
712 }
713
714 /**
715 * poll of a non-empty queue returns null if no expired elements.
716 */
717 public void testPollDelayed() {
718 DelayQueue q = new DelayQueue();
719 q.add(new NanoDelay(Long.MAX_VALUE));
720 assertNull(q.poll());
721 }
722
723 /**
724 * timed poll of a non-empty queue returns null if no expired elements.
725 */
726 public void testTimedPollDelayed() throws InterruptedException {
727 DelayQueue q = new DelayQueue();
728 q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
729 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
730 }
731
732 /**
733 * drainTo(c) empties queue into another collection c
734 */
735 public void testDrainTo() {
736 DelayQueue q = new DelayQueue();
737 PDelay[] elems = new PDelay[SIZE];
738 for (int i = 0; i < SIZE; ++i) {
739 elems[i] = new PDelay(i);
740 q.add(elems[i]);
741 }
742 ArrayList l = new ArrayList();
743 q.drainTo(l);
744 assertEquals(0, q.size());
745 for (int i = 0; i < SIZE; ++i)
746 assertEquals(elems[i], l.get(i));
747 q.add(elems[0]);
748 q.add(elems[1]);
749 assertFalse(q.isEmpty());
750 assertTrue(q.contains(elems[0]));
751 assertTrue(q.contains(elems[1]));
752 l.clear();
753 q.drainTo(l);
754 assertEquals(0, q.size());
755 assertEquals(2, l.size());
756 for (int i = 0; i < 2; ++i)
757 assertEquals(elems[i], l.get(i));
758 }
759
760 /**
761 * drainTo empties queue
762 */
763 public void testDrainToWithActivePut() throws InterruptedException {
764 final DelayQueue q = populatedQueue(SIZE);
765 Thread t = new Thread(new CheckedRunnable() {
766 public void realRun() {
767 q.put(new PDelay(SIZE + 1));
768 }});
769
770 t.start();
771 ArrayList l = new ArrayList();
772 q.drainTo(l);
773 assertTrue(l.size() >= SIZE);
774 t.join();
775 assertTrue(q.size() + l.size() >= SIZE);
776 }
777
778 /**
779 * drainTo(c, n) empties first min(n, size) elements of queue into c
780 */
781 public void testDrainToN() {
782 for (int i = 0; i < SIZE + 2; ++i) {
783 DelayQueue q = populatedQueue(SIZE);
784 ArrayList l = new ArrayList();
785 q.drainTo(l, i);
786 int k = (i < SIZE) ? i : SIZE;
787 assertEquals(SIZE - k, q.size());
788 assertEquals(k, l.size());
789 }
790 }
791
792 /**
793 * remove(null), contains(null) always return false
794 */
795 public void testNeverContainsNull() {
796 Collection<?> q = populatedQueue(SIZE);
797 assertFalse(q.contains(null));
798 assertFalse(q.remove(null));
799 }
800 }