ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.75
Committed: Sun May 14 04:14:09 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.74: +9 -0 lines
Log Message:
improve testTimedOffer

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