ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayBlockingQueueTest.java
Revision: 1.53
Committed: Tue Feb 21 01:54:03 2012 UTC (12 years, 2 months ago) by jsr166
Branch: MAIN
Changes since 1.52: +1 -1 lines
Log Message:
use third person in javadoc first sentence

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