ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayBlockingQueueTest.java
Revision: 1.23
Committed: Sat Nov 21 21:00:34 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.22: +8 -5 lines
Log Message:
reduce scope of check for IE in test*WithOffer*

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() {
300 int added = 0;
301 try {
302 for (int i = 0; i < SIZE; ++i) {
303 q.put(new Integer(i));
304 ++added;
305 }
306 q.put(new Integer(SIZE));
307 threadShouldThrow();
308 } catch (InterruptedException success) {
309 threadAssertEquals(added, SIZE);
310 }}});
311
312 t.start();
313 Thread.sleep(MEDIUM_DELAY_MS);
314 t.interrupt();
315 t.join();
316 }
317
318 /**
319 * put blocks waiting for take when full
320 */
321 public void testPutWithTake() throws InterruptedException {
322 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
323 Thread t = new Thread(new CheckedRunnable() {
324 public void realRun() {
325 int added = 0;
326 try {
327 q.put(new Object());
328 ++added;
329 q.put(new Object());
330 ++added;
331 q.put(new Object());
332 ++added;
333 q.put(new Object());
334 ++added;
335 threadShouldThrow();
336 } catch (InterruptedException success) {
337 threadAssertTrue(added >= 2);
338 }
339 }});
340
341 t.start();
342 Thread.sleep(SHORT_DELAY_MS);
343 q.take();
344 t.interrupt();
345 t.join();
346 }
347
348 /**
349 * timed offer times out if full and elements not taken
350 */
351 public void testTimedOffer() throws InterruptedException {
352 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
353 Thread t = new ThreadShouldThrow(InterruptedException.class) {
354 public void realRun() throws InterruptedException {
355 q.put(new Object());
356 q.put(new Object());
357 threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS/2, MILLISECONDS));
358 q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
359 }};
360
361 t.start();
362 Thread.sleep(SHORT_DELAY_MS);
363 t.interrupt();
364 t.join();
365 }
366
367 /**
368 * take retrieves elements in FIFO order
369 */
370 public void testTake() throws InterruptedException {
371 ArrayBlockingQueue q = populatedQueue(SIZE);
372 for (int i = 0; i < SIZE; ++i) {
373 assertEquals(i, ((Integer)q.take()).intValue());
374 }
375 }
376
377 /**
378 * take blocks interruptibly when empty
379 */
380 public void testTakeFromEmpty() throws InterruptedException {
381 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
382 Thread t = new ThreadShouldThrow(InterruptedException.class) {
383 public void realRun() throws InterruptedException {
384 q.take();
385 }};
386
387 t.start();
388 Thread.sleep(SHORT_DELAY_MS);
389 t.interrupt();
390 t.join();
391 }
392
393 /**
394 * Take removes existing elements until empty, then blocks interruptibly
395 */
396 public void testBlockingTake() throws InterruptedException {
397 Thread t = new ThreadShouldThrow(InterruptedException.class) {
398 public void realRun() throws InterruptedException {
399 ArrayBlockingQueue q = populatedQueue(SIZE);
400 for (int i = 0; i < SIZE; ++i) {
401 threadAssertEquals(i, ((Integer)q.take()).intValue());
402 }
403 q.take();
404 }};
405
406 t.start();
407 Thread.sleep(SHORT_DELAY_MS);
408 t.interrupt();
409 t.join();
410 }
411
412
413 /**
414 * poll succeeds unless empty
415 */
416 public void testPoll() {
417 ArrayBlockingQueue q = populatedQueue(SIZE);
418 for (int i = 0; i < SIZE; ++i) {
419 assertEquals(i, ((Integer)q.poll()).intValue());
420 }
421 assertNull(q.poll());
422 }
423
424 /**
425 * timed pool with zero timeout succeeds when non-empty, else times out
426 */
427 public void testTimedPoll0() throws InterruptedException {
428 ArrayBlockingQueue q = populatedQueue(SIZE);
429 for (int i = 0; i < SIZE; ++i) {
430 assertEquals(i, ((Integer)q.poll(0, MILLISECONDS)).intValue());
431 }
432 assertNull(q.poll(0, MILLISECONDS));
433 }
434
435 /**
436 * timed pool with nonzero timeout succeeds when non-empty, else times out
437 */
438 public void testTimedPoll() throws InterruptedException {
439 ArrayBlockingQueue q = populatedQueue(SIZE);
440 for (int i = 0; i < SIZE; ++i) {
441 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, MILLISECONDS)).intValue());
442 }
443 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
444 }
445
446 /**
447 * Interrupted timed poll throws InterruptedException instead of
448 * returning timeout status
449 */
450 public void testInterruptedTimedPoll() throws InterruptedException {
451 Thread t = new Thread(new CheckedRunnable() {
452 public void realRun() throws InterruptedException {
453 ArrayBlockingQueue q = populatedQueue(SIZE);
454 for (int i = 0; i < SIZE; ++i) {
455 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, MILLISECONDS)).intValue());
456 }
457 try {
458 q.poll(SMALL_DELAY_MS, MILLISECONDS);
459 shouldThrow();
460 } catch (InterruptedException success) {}
461 }});
462
463 t.start();
464 Thread.sleep(SHORT_DELAY_MS);
465 t.interrupt();
466 t.join();
467 }
468
469 /**
470 * timed poll before a delayed offer fails; after offer succeeds;
471 * on interruption throws
472 */
473 public void testTimedPollWithOffer() throws InterruptedException {
474 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
475 Thread t = new Thread(new CheckedRunnable() {
476 public void realRun() throws InterruptedException {
477 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
478 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
479 try {
480 q.poll(LONG_DELAY_MS, MILLISECONDS);
481 shouldThrow();
482 } catch (InterruptedException success) {}
483 }});
484
485 t.start();
486 Thread.sleep(SMALL_DELAY_MS);
487 assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
488 t.interrupt();
489 t.join();
490 }
491
492
493 /**
494 * peek returns next element, or null if empty
495 */
496 public void testPeek() {
497 ArrayBlockingQueue q = populatedQueue(SIZE);
498 for (int i = 0; i < SIZE; ++i) {
499 assertEquals(i, ((Integer)q.peek()).intValue());
500 q.poll();
501 assertTrue(q.peek() == null ||
502 i != ((Integer)q.peek()).intValue());
503 }
504 assertNull(q.peek());
505 }
506
507 /**
508 * element returns next element, or throws NSEE if empty
509 */
510 public void testElement() {
511 ArrayBlockingQueue q = populatedQueue(SIZE);
512 for (int i = 0; i < SIZE; ++i) {
513 assertEquals(i, ((Integer)q.element()).intValue());
514 q.poll();
515 }
516 try {
517 q.element();
518 shouldThrow();
519 } catch (NoSuchElementException success) {}
520 }
521
522 /**
523 * remove removes next element, or throws NSEE if empty
524 */
525 public void testRemove() {
526 ArrayBlockingQueue q = populatedQueue(SIZE);
527 for (int i = 0; i < SIZE; ++i) {
528 assertEquals(i, ((Integer)q.remove()).intValue());
529 }
530 try {
531 q.remove();
532 shouldThrow();
533 } catch (NoSuchElementException success) {}
534 }
535
536 /**
537 * remove(x) removes x and returns true if present
538 */
539 public void testRemoveElement() {
540 ArrayBlockingQueue q = populatedQueue(SIZE);
541 for (int i = 1; i < SIZE; i+=2) {
542 assertTrue(q.remove(new Integer(i)));
543 }
544 for (int i = 0; i < SIZE; i+=2) {
545 assertTrue(q.remove(new Integer(i)));
546 assertFalse(q.remove(new Integer(i+1)));
547 }
548 assertTrue(q.isEmpty());
549 }
550
551 /**
552 * contains(x) reports true when elements added but not yet removed
553 */
554 public void testContains() {
555 ArrayBlockingQueue 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 ArrayBlockingQueue 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 ArrayBlockingQueue q = populatedQueue(SIZE);
584 ArrayBlockingQueue p = new ArrayBlockingQueue(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 ArrayBlockingQueue q = populatedQueue(SIZE);
598 ArrayBlockingQueue 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 ArrayBlockingQueue q = populatedQueue(SIZE);
618 ArrayBlockingQueue p = populatedQueue(i);
619 assertTrue(q.removeAll(p));
620 assertEquals(SIZE-i, q.size());
621 for (int j = 0; j < i; ++j) {
622 Integer I = (Integer)(p.remove());
623 assertFalse(q.contains(I));
624 }
625 }
626 }
627
628 /**
629 * toArray contains all elements
630 */
631 public void testToArray() throws InterruptedException {
632 ArrayBlockingQueue q = populatedQueue(SIZE);
633 Object[] o = q.toArray();
634 for (int i = 0; i < o.length; i++)
635 assertEquals(o[i], q.take());
636 }
637
638 /**
639 * toArray(a) contains all elements
640 */
641 public void testToArray2() throws InterruptedException {
642 ArrayBlockingQueue q = populatedQueue(SIZE);
643 Integer[] ints = new Integer[SIZE];
644 ints = (Integer[])q.toArray(ints);
645 for (int i = 0; i < ints.length; i++)
646 assertEquals(ints[i], q.take());
647 }
648
649 /**
650 * toArray(null) throws NPE
651 */
652 public void testToArray_BadArg() {
653 try {
654 ArrayBlockingQueue q = populatedQueue(SIZE);
655 Object o[] = q.toArray(null);
656 shouldThrow();
657 } catch (NullPointerException success) {}
658 }
659
660 /**
661 * toArray with incompatible array type throws CCE
662 */
663 public void testToArray1_BadArg() {
664 try {
665 ArrayBlockingQueue q = populatedQueue(SIZE);
666 Object o[] = q.toArray(new String[10] );
667 shouldThrow();
668 } catch (ArrayStoreException success) {}
669 }
670
671
672 /**
673 * iterator iterates through all elements
674 */
675 public void testIterator() throws InterruptedException {
676 ArrayBlockingQueue q = populatedQueue(SIZE);
677 Iterator it = q.iterator();
678 while (it.hasNext()) {
679 assertEquals(it.next(), q.take());
680 }
681 }
682
683 /**
684 * iterator.remove removes current element
685 */
686 public void testIteratorRemove () {
687 final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
688 q.add(two);
689 q.add(one);
690 q.add(three);
691
692 Iterator it = q.iterator();
693 it.next();
694 it.remove();
695
696 it = q.iterator();
697 assertEquals(it.next(), one);
698 assertEquals(it.next(), three);
699 assertFalse(it.hasNext());
700 }
701
702 /**
703 * iterator ordering is FIFO
704 */
705 public void testIteratorOrdering() {
706 final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
707 q.add(one);
708 q.add(two);
709 q.add(three);
710
711 assertEquals("queue should be full", 0, q.remainingCapacity());
712
713 int k = 0;
714 for (Iterator it = q.iterator(); it.hasNext();) {
715 int i = ((Integer)(it.next())).intValue();
716 assertEquals(++k, i);
717 }
718 assertEquals(3, k);
719 }
720
721 /**
722 * Modifications do not cause iterators to fail
723 */
724 public void testWeaklyConsistentIteration () {
725 final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
726 q.add(one);
727 q.add(two);
728 q.add(three);
729 for (Iterator it = q.iterator(); it.hasNext();) {
730 q.remove();
731 it.next();
732 }
733 assertEquals(0, q.size());
734 }
735
736
737 /**
738 * toString contains toStrings of elements
739 */
740 public void testToString() {
741 ArrayBlockingQueue q = populatedQueue(SIZE);
742 String s = q.toString();
743 for (int i = 0; i < SIZE; ++i) {
744 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
745 }
746 }
747
748
749 /**
750 * offer transfers elements across Executor tasks
751 */
752 public void testOfferInExecutor() {
753 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
754 q.add(one);
755 q.add(two);
756 ExecutorService executor = Executors.newFixedThreadPool(2);
757 executor.execute(new CheckedRunnable() {
758 public void realRun() throws InterruptedException {
759 threadAssertFalse(q.offer(three));
760 threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
761 threadAssertEquals(0, q.remainingCapacity());
762 }});
763
764 executor.execute(new CheckedRunnable() {
765 public void realRun() throws InterruptedException {
766 Thread.sleep(SMALL_DELAY_MS);
767 threadAssertEquals(one, q.take());
768 }});
769
770 joinPool(executor);
771
772 }
773
774 /**
775 * poll retrieves elements across Executor threads
776 */
777 public void testPollInExecutor() {
778 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
779 ExecutorService executor = Executors.newFixedThreadPool(2);
780 executor.execute(new CheckedRunnable() {
781 public void realRun() throws InterruptedException {
782 threadAssertNull(q.poll());
783 threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
784 threadAssertTrue(q.isEmpty());
785 }});
786
787 executor.execute(new CheckedRunnable() {
788 public void realRun() throws InterruptedException {
789 Thread.sleep(SMALL_DELAY_MS);
790 q.put(one);
791 }});
792
793 joinPool(executor);
794 }
795
796 /**
797 * A deserialized serialized queue has same elements in same order
798 */
799 public void testSerialization() throws Exception {
800 ArrayBlockingQueue q = populatedQueue(SIZE);
801
802 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
803 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
804 out.writeObject(q);
805 out.close();
806
807 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
808 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
809 ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
810 assertEquals(q.size(), r.size());
811 while (!q.isEmpty())
812 assertEquals(q.remove(), r.remove());
813 }
814
815 /**
816 * drainTo(null) throws NPE
817 */
818 public void testDrainToNull() {
819 ArrayBlockingQueue q = populatedQueue(SIZE);
820 try {
821 q.drainTo(null);
822 shouldThrow();
823 } catch (NullPointerException success) {}
824 }
825
826 /**
827 * drainTo(this) throws IAE
828 */
829 public void testDrainToSelf() {
830 ArrayBlockingQueue q = populatedQueue(SIZE);
831 try {
832 q.drainTo(q);
833 shouldThrow();
834 } catch (IllegalArgumentException success) {}
835 }
836
837 /**
838 * drainTo(c) empties queue into another collection c
839 */
840 public void testDrainTo() {
841 ArrayBlockingQueue q = populatedQueue(SIZE);
842 ArrayList l = new ArrayList();
843 q.drainTo(l);
844 assertEquals(q.size(), 0);
845 assertEquals(l.size(), SIZE);
846 for (int i = 0; i < SIZE; ++i)
847 assertEquals(l.get(i), new Integer(i));
848 q.add(zero);
849 q.add(one);
850 assertFalse(q.isEmpty());
851 assertTrue(q.contains(zero));
852 assertTrue(q.contains(one));
853 l.clear();
854 q.drainTo(l);
855 assertEquals(q.size(), 0);
856 assertEquals(l.size(), 2);
857 for (int i = 0; i < 2; ++i)
858 assertEquals(l.get(i), new Integer(i));
859 }
860
861 /**
862 * drainTo empties full queue, unblocking a waiting put.
863 */
864 public void testDrainToWithActivePut() throws InterruptedException {
865 final ArrayBlockingQueue q = populatedQueue(SIZE);
866 Thread t = new Thread(new CheckedRunnable() {
867 public void realRun() throws InterruptedException {
868 q.put(new Integer(SIZE+1));
869 }});
870
871 t.start();
872 ArrayList l = new ArrayList();
873 q.drainTo(l);
874 assertTrue(l.size() >= SIZE);
875 for (int i = 0; i < SIZE; ++i)
876 assertEquals(l.get(i), new Integer(i));
877 t.join();
878 assertTrue(q.size() + l.size() >= SIZE);
879 }
880
881 /**
882 * drainTo(null, n) throws NPE
883 */
884 public void testDrainToNullN() {
885 ArrayBlockingQueue q = populatedQueue(SIZE);
886 try {
887 q.drainTo(null, 0);
888 shouldThrow();
889 } catch (NullPointerException success) {}
890 }
891
892 /**
893 * drainTo(this, n) throws IAE
894 */
895 public void testDrainToSelfN() {
896 ArrayBlockingQueue q = populatedQueue(SIZE);
897 try {
898 q.drainTo(q, 0);
899 shouldThrow();
900 } catch (IllegalArgumentException success) {}
901 }
902
903 /**
904 * drainTo(c, n) empties first max {n, size} elements of queue into c
905 */
906 public void testDrainToN() {
907 ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE*2);
908 for (int i = 0; i < SIZE + 2; ++i) {
909 for (int j = 0; j < SIZE; j++)
910 assertTrue(q.offer(new Integer(j)));
911 ArrayList l = new ArrayList();
912 q.drainTo(l, i);
913 int k = (i < SIZE)? i : SIZE;
914 assertEquals(l.size(), k);
915 assertEquals(q.size(), SIZE-k);
916 for (int j = 0; j < k; ++j)
917 assertEquals(l.get(j), new Integer(j));
918 while (q.poll() != null) ;
919 }
920 }
921
922 }