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

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