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