ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayBlockingQueueTest.java
Revision: 1.30
Committed: Wed Aug 25 01:44:48 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.29: +3 -0 lines
Log Message:
whitespace

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 /**
229 * addAll of a collection with any null elements throws NPE after
230 * possibly adding some elements
231 */
232 public void testAddAll3() {
233 try {
234 ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
235 Integer[] ints = new Integer[SIZE];
236 for (int i = 0; i < SIZE-1; ++i)
237 ints[i] = new Integer(i);
238 q.addAll(Arrays.asList(ints));
239 shouldThrow();
240 } catch (NullPointerException success) {}
241 }
242
243 /**
244 * addAll throws ISE if not enough room
245 */
246 public void testAddAll4() {
247 try {
248 ArrayBlockingQueue q = new ArrayBlockingQueue(1);
249 Integer[] ints = new Integer[SIZE];
250 for (int i = 0; i < SIZE; ++i)
251 ints[i] = new Integer(i);
252 q.addAll(Arrays.asList(ints));
253 shouldThrow();
254 } catch (IllegalStateException success) {}
255 }
256
257 /**
258 * Queue contains all elements, in traversal order, of successful addAll
259 */
260 public void testAddAll5() {
261 Integer[] empty = new Integer[0];
262 Integer[] ints = new Integer[SIZE];
263 for (int i = 0; i < SIZE; ++i)
264 ints[i] = new Integer(i);
265 ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
266 assertFalse(q.addAll(Arrays.asList(empty)));
267 assertTrue(q.addAll(Arrays.asList(ints)));
268 for (int i = 0; i < SIZE; ++i)
269 assertEquals(ints[i], q.poll());
270 }
271
272 /**
273 * put(null) throws NPE
274 */
275 public void testPutNull() throws InterruptedException {
276 try {
277 ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
278 q.put(null);
279 shouldThrow();
280 } catch (NullPointerException success) {}
281 }
282
283 /**
284 * all elements successfully put are contained
285 */
286 public void testPut() throws InterruptedException {
287 ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
288 for (int i = 0; i < SIZE; ++i) {
289 Integer I = new Integer(i);
290 q.put(I);
291 assertTrue(q.contains(I));
292 }
293 assertEquals(0, q.remainingCapacity());
294 }
295
296 /**
297 * put blocks interruptibly if full
298 */
299 public void testBlockingPut() throws InterruptedException {
300 final ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
301 Thread t = new Thread(new CheckedRunnable() {
302 public void realRun() throws InterruptedException {
303 for (int i = 0; i < SIZE; ++i)
304 q.put(i);
305 assertEquals(SIZE, q.size());
306 assertEquals(0, q.remainingCapacity());
307 try {
308 q.put(99);
309 shouldThrow();
310 } catch (InterruptedException success) {}
311 }});
312
313 t.start();
314 Thread.sleep(SHORT_DELAY_MS);
315 t.interrupt();
316 t.join();
317 assertEquals(SIZE, q.size());
318 assertEquals(0, q.remainingCapacity());
319 }
320
321 /**
322 * put blocks waiting for take when full
323 */
324 public void testPutWithTake() throws InterruptedException {
325 final int capacity = 2;
326 final ArrayBlockingQueue q = new ArrayBlockingQueue(capacity);
327 Thread t = new Thread(new CheckedRunnable() {
328 public void realRun() throws InterruptedException {
329 for (int i = 0; i < capacity + 1; i++)
330 q.put(i);
331 try {
332 q.put(99);
333 shouldThrow();
334 } catch (InterruptedException success) {}
335 }});
336
337 t.start();
338 Thread.sleep(SHORT_DELAY_MS);
339 assertEquals(q.remainingCapacity(), 0);
340 assertEquals(0, q.take());
341 Thread.sleep(SHORT_DELAY_MS);
342 t.interrupt();
343 t.join();
344 assertEquals(q.remainingCapacity(), 0);
345 }
346
347 /**
348 * timed offer times out if full and elements not taken
349 */
350 public void testTimedOffer() throws InterruptedException {
351 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
352 Thread t = new Thread(new CheckedRunnable() {
353 public void realRun() throws InterruptedException {
354 q.put(new Object());
355 q.put(new Object());
356 assertFalse(q.offer(new Object(), SHORT_DELAY_MS/2, MILLISECONDS));
357 try {
358 q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
359 shouldThrow();
360 } catch (InterruptedException success) {}
361 }});
362
363 t.start();
364 Thread.sleep(SHORT_DELAY_MS);
365 t.interrupt();
366 t.join();
367 }
368
369 /**
370 * take retrieves elements in FIFO order
371 */
372 public void testTake() throws InterruptedException {
373 ArrayBlockingQueue q = populatedQueue(SIZE);
374 for (int i = 0; i < SIZE; ++i) {
375 assertEquals(i, q.take());
376 }
377 }
378
379 /**
380 * take blocks interruptibly when empty
381 */
382 public void testTakeFromEmpty() throws InterruptedException {
383 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
384 Thread t = new ThreadShouldThrow(InterruptedException.class) {
385 public void realRun() throws InterruptedException {
386 q.take();
387 }};
388
389 t.start();
390 Thread.sleep(SHORT_DELAY_MS);
391 t.interrupt();
392 t.join();
393 }
394
395 /**
396 * Take removes existing elements until empty, then blocks interruptibly
397 */
398 public void testBlockingTake() throws InterruptedException {
399 final ArrayBlockingQueue q = populatedQueue(SIZE);
400 Thread t = new Thread(new CheckedRunnable() {
401 public void realRun() throws InterruptedException {
402 for (int i = 0; i < SIZE; ++i) {
403 assertEquals(i, q.take());
404 }
405 try {
406 q.take();
407 shouldThrow();
408 } catch (InterruptedException success) {}
409 }});
410
411 t.start();
412 Thread.sleep(SHORT_DELAY_MS);
413 t.interrupt();
414 t.join();
415 }
416
417
418 /**
419 * poll succeeds unless empty
420 */
421 public void testPoll() {
422 ArrayBlockingQueue q = populatedQueue(SIZE);
423 for (int i = 0; i < SIZE; ++i) {
424 assertEquals(i, q.poll());
425 }
426 assertNull(q.poll());
427 }
428
429 /**
430 * timed pool with zero timeout succeeds when non-empty, else times out
431 */
432 public void testTimedPoll0() throws InterruptedException {
433 ArrayBlockingQueue q = populatedQueue(SIZE);
434 for (int i = 0; i < SIZE; ++i) {
435 assertEquals(i, q.poll(0, MILLISECONDS));
436 }
437 assertNull(q.poll(0, MILLISECONDS));
438 }
439
440 /**
441 * timed pool with nonzero timeout succeeds when non-empty, else times out
442 */
443 public void testTimedPoll() throws InterruptedException {
444 ArrayBlockingQueue q = populatedQueue(SIZE);
445 for (int i = 0; i < SIZE; ++i) {
446 assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
447 }
448 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
449 }
450
451 /**
452 * Interrupted timed poll throws InterruptedException instead of
453 * returning timeout status
454 */
455 public void testInterruptedTimedPoll() throws InterruptedException {
456 Thread t = new Thread(new CheckedRunnable() {
457 public void realRun() throws InterruptedException {
458 ArrayBlockingQueue q = populatedQueue(SIZE);
459 for (int i = 0; i < SIZE; ++i) {
460 assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));;
461 }
462 try {
463 q.poll(SMALL_DELAY_MS, MILLISECONDS);
464 shouldThrow();
465 } catch (InterruptedException success) {}
466 }});
467
468 t.start();
469 Thread.sleep(SHORT_DELAY_MS);
470 t.interrupt();
471 t.join();
472 }
473
474 /**
475 * timed poll before a delayed offer fails; after offer succeeds;
476 * on interruption throws
477 */
478 public void testTimedPollWithOffer() throws InterruptedException {
479 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
480 Thread t = new Thread(new CheckedRunnable() {
481 public void realRun() throws InterruptedException {
482 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
483 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
484 try {
485 q.poll(LONG_DELAY_MS, MILLISECONDS);
486 shouldThrow();
487 } catch (InterruptedException success) {}
488 }});
489
490 t.start();
491 Thread.sleep(SMALL_DELAY_MS);
492 assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
493 t.interrupt();
494 t.join();
495 }
496
497
498 /**
499 * peek returns next element, or null if empty
500 */
501 public void testPeek() {
502 ArrayBlockingQueue q = populatedQueue(SIZE);
503 for (int i = 0; i < SIZE; ++i) {
504 assertEquals(i, q.peek());
505 assertEquals(i, q.poll());
506 assertTrue(q.peek() == null ||
507 !q.peek().equals(i));
508 }
509 assertNull(q.peek());
510 }
511
512 /**
513 * element returns next element, or throws NSEE if empty
514 */
515 public void testElement() {
516 ArrayBlockingQueue q = populatedQueue(SIZE);
517 for (int i = 0; i < SIZE; ++i) {
518 assertEquals(i, q.element());
519 assertEquals(i, q.poll());
520 }
521 try {
522 q.element();
523 shouldThrow();
524 } catch (NoSuchElementException success) {}
525 }
526
527 /**
528 * remove removes next element, or throws NSEE if empty
529 */
530 public void testRemove() {
531 ArrayBlockingQueue q = populatedQueue(SIZE);
532 for (int i = 0; i < SIZE; ++i) {
533 assertEquals(i, q.remove());
534 }
535 try {
536 q.remove();
537 shouldThrow();
538 } catch (NoSuchElementException success) {}
539 }
540
541 /**
542 * remove(x) removes x and returns true if present
543 */
544 public void testRemoveElement() {
545 ArrayBlockingQueue q = populatedQueue(SIZE);
546 for (int i = 1; i < SIZE; i+=2) {
547 assertTrue(q.remove(new Integer(i)));
548 }
549 for (int i = 0; i < SIZE; i+=2) {
550 assertTrue(q.remove(new Integer(i)));
551 assertFalse(q.remove(new Integer(i+1)));
552 }
553 assertTrue(q.isEmpty());
554 }
555
556 /**
557 * contains(x) reports true when elements added but not yet removed
558 */
559 public void testContains() {
560 ArrayBlockingQueue q = populatedQueue(SIZE);
561 for (int i = 0; i < SIZE; ++i) {
562 assertTrue(q.contains(new Integer(i)));
563 assertEquals(i, q.poll());
564 assertFalse(q.contains(new Integer(i)));
565 }
566 }
567
568 /**
569 * clear removes all elements
570 */
571 public void testClear() {
572 ArrayBlockingQueue q = populatedQueue(SIZE);
573 q.clear();
574 assertTrue(q.isEmpty());
575 assertEquals(0, q.size());
576 assertEquals(SIZE, q.remainingCapacity());
577 q.add(one);
578 assertFalse(q.isEmpty());
579 assertTrue(q.contains(one));
580 q.clear();
581 assertTrue(q.isEmpty());
582 }
583
584 /**
585 * containsAll(c) is true when c contains a subset of elements
586 */
587 public void testContainsAll() {
588 ArrayBlockingQueue q = populatedQueue(SIZE);
589 ArrayBlockingQueue p = new ArrayBlockingQueue(SIZE);
590 for (int i = 0; i < SIZE; ++i) {
591 assertTrue(q.containsAll(p));
592 assertFalse(p.containsAll(q));
593 p.add(new Integer(i));
594 }
595 assertTrue(p.containsAll(q));
596 }
597
598 /**
599 * retainAll(c) retains only those elements of c and reports true if changed
600 */
601 public void testRetainAll() {
602 ArrayBlockingQueue q = populatedQueue(SIZE);
603 ArrayBlockingQueue p = populatedQueue(SIZE);
604 for (int i = 0; i < SIZE; ++i) {
605 boolean changed = q.retainAll(p);
606 if (i == 0)
607 assertFalse(changed);
608 else
609 assertTrue(changed);
610
611 assertTrue(q.containsAll(p));
612 assertEquals(SIZE-i, q.size());
613 p.remove();
614 }
615 }
616
617 /**
618 * removeAll(c) removes only those elements of c and reports true if changed
619 */
620 public void testRemoveAll() {
621 for (int i = 1; i < SIZE; ++i) {
622 ArrayBlockingQueue q = populatedQueue(SIZE);
623 ArrayBlockingQueue p = populatedQueue(i);
624 assertTrue(q.removeAll(p));
625 assertEquals(SIZE-i, q.size());
626 for (int j = 0; j < i; ++j) {
627 Integer I = (Integer)(p.remove());
628 assertFalse(q.contains(I));
629 }
630 }
631 }
632
633 /**
634 * toArray contains all elements
635 */
636 public void testToArray() throws InterruptedException {
637 ArrayBlockingQueue q = populatedQueue(SIZE);
638 Object[] o = q.toArray();
639 for (int i = 0; i < o.length; i++)
640 assertEquals(o[i], q.take());
641 }
642
643 /**
644 * toArray(a) contains all elements
645 */
646 public void testToArray2() throws InterruptedException {
647 ArrayBlockingQueue q = populatedQueue(SIZE);
648 Integer[] ints = new Integer[SIZE];
649 ints = (Integer[])q.toArray(ints);
650 for (int i = 0; i < ints.length; i++)
651 assertEquals(ints[i], q.take());
652 }
653
654 /**
655 * toArray(null) throws NPE
656 */
657 public void testToArray_BadArg() {
658 ArrayBlockingQueue q = populatedQueue(SIZE);
659 try {
660 Object o[] = q.toArray(null);
661 shouldThrow();
662 } catch (NullPointerException success) {}
663 }
664
665 /**
666 * toArray with incompatible array type throws CCE
667 */
668 public void testToArray1_BadArg() {
669 ArrayBlockingQueue q = populatedQueue(SIZE);
670 try {
671 Object o[] = q.toArray(new String[10]);
672 shouldThrow();
673 } catch (ArrayStoreException success) {}
674 }
675
676
677 /**
678 * iterator iterates through all elements
679 */
680 public void testIterator() throws InterruptedException {
681 ArrayBlockingQueue q = populatedQueue(SIZE);
682 Iterator it = q.iterator();
683 while (it.hasNext()) {
684 assertEquals(it.next(), q.take());
685 }
686 }
687
688 /**
689 * iterator.remove removes current element
690 */
691 public void testIteratorRemove() {
692 final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
693 q.add(two);
694 q.add(one);
695 q.add(three);
696
697 Iterator it = q.iterator();
698 it.next();
699 it.remove();
700
701 it = q.iterator();
702 assertSame(it.next(), one);
703 assertSame(it.next(), three);
704 assertFalse(it.hasNext());
705 }
706
707 /**
708 * iterator ordering is FIFO
709 */
710 public void testIteratorOrdering() {
711 final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
712 q.add(one);
713 q.add(two);
714 q.add(three);
715
716 assertEquals("queue should be full", 0, q.remainingCapacity());
717
718 int k = 0;
719 for (Iterator it = q.iterator(); it.hasNext();) {
720 assertEquals(++k, it.next());
721 }
722 assertEquals(3, k);
723 }
724
725 /**
726 * Modifications do not cause iterators to fail
727 */
728 public void testWeaklyConsistentIteration() {
729 final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
730 q.add(one);
731 q.add(two);
732 q.add(three);
733 for (Iterator it = q.iterator(); it.hasNext();) {
734 q.remove();
735 it.next();
736 }
737 assertEquals(0, q.size());
738 }
739
740
741 /**
742 * toString contains toStrings of elements
743 */
744 public void testToString() {
745 ArrayBlockingQueue q = populatedQueue(SIZE);
746 String s = q.toString();
747 for (int i = 0; i < SIZE; ++i) {
748 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
749 }
750 }
751
752
753 /**
754 * offer transfers elements across Executor tasks
755 */
756 public void testOfferInExecutor() {
757 final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
758 q.add(one);
759 q.add(two);
760 ExecutorService executor = Executors.newFixedThreadPool(2);
761 executor.execute(new CheckedRunnable() {
762 public void realRun() throws InterruptedException {
763 assertFalse(q.offer(three));
764 assertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
765 assertEquals(0, q.remainingCapacity());
766 }});
767
768 executor.execute(new CheckedRunnable() {
769 public void realRun() throws InterruptedException {
770 Thread.sleep(SMALL_DELAY_MS);
771 assertSame(one, q.take());
772 }});
773
774 joinPool(executor);
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 assertNull(q.poll());
786 assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
787 assertTrue(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 }