ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.84
Committed: Wed Jan 27 02:55:18 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.83: +2 -1 lines
Log Message:
Suppress all new errorprone "errors"

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