ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.63
Committed: Sun Nov 23 22:27:06 2014 UTC (9 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.62: +9 -0 lines
Log Message:
add tests for contains(null), remove(null)

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