ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayBlockingQueueTest.java
Revision: 1.77
Committed: Sun Nov 6 03:11:15 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.76: +33 -21 lines
Log Message:
minor improvements

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