ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayBlockingQueueTest.java
Revision: 1.27
Committed: Tue Dec 1 06:03:49 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.26: +19 -23 lines
Log Message:
Use MILLISECONDS.toNanos instead of multiplying by 1000*1000; use explicit assertEquals instead of assertTrue(...!= null); improve testPutWithTake

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