ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.64
Committed: Sun Oct 16 20:44:18 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.63: +2 -1 lines
Log Message:
improve populatedFoo methods

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