ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.77
Committed: Sun Jan 7 22:59:18 2018 UTC (6 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.76: +1 -2 lines
Log Message:
use <>

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