ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayBlockingQueueTest.java
Revision: 1.25
Committed: Sun Nov 22 00:17:37 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.24: +28 -25 lines
Log Message:
reduce scope of check for IE in testBlocking{Put,Take}*

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