ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.19
Committed: Sat Nov 21 19:11:53 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.18: +7 -4 lines
Log Message:
reduce scope of check for IE in testInterruptedTimedPoll*

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 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import static java.util.concurrent.TimeUnit.MILLISECONDS;
13 import java.io.*;
14
15 public class LinkedBlockingQueueTest extends JSR166TestCase {
16
17 public static void main(String[] args) {
18 junit.textui.TestRunner.run (suite());
19 }
20
21 public static Test suite() {
22 return new TestSuite(LinkedBlockingQueueTest.class);
23 }
24
25
26 /**
27 * Create a queue of given size containing consecutive
28 * Integers 0 ... n.
29 */
30 private LinkedBlockingQueue populatedQueue(int n) {
31 LinkedBlockingQueue q = new LinkedBlockingQueue(n);
32 assertTrue(q.isEmpty());
33 for (int i = 0; i < n; i++)
34 assertTrue(q.offer(new Integer(i)));
35 assertFalse(q.isEmpty());
36 assertEquals(0, q.remainingCapacity());
37 assertEquals(n, q.size());
38 return q;
39 }
40
41 /**
42 * A new queue has the indicated capacity, or Integer.MAX_VALUE if
43 * none given
44 */
45 public void testConstructor1() {
46 assertEquals(SIZE, new LinkedBlockingQueue(SIZE).remainingCapacity());
47 assertEquals(Integer.MAX_VALUE, new LinkedBlockingQueue().remainingCapacity());
48 }
49
50 /**
51 * Constructor throws IAE if capacity argument nonpositive
52 */
53 public void testConstructor2() {
54 try {
55 LinkedBlockingQueue q = new LinkedBlockingQueue(0);
56 shouldThrow();
57 } catch (IllegalArgumentException success) {}
58 }
59
60 /**
61 * Initializing from null Collection throws NPE
62 */
63 public void testConstructor3() {
64 try {
65 LinkedBlockingQueue q = new LinkedBlockingQueue(null);
66 shouldThrow();
67 } catch (NullPointerException success) {}
68 }
69
70 /**
71 * Initializing from Collection of null elements throws NPE
72 */
73 public void testConstructor4() {
74 try {
75 Integer[] ints = new Integer[SIZE];
76 LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
77 shouldThrow();
78 } catch (NullPointerException success) {}
79 }
80
81 /**
82 * Initializing from Collection with some null elements throws NPE
83 */
84 public void testConstructor5() {
85 try {
86 Integer[] ints = new Integer[SIZE];
87 for (int i = 0; i < SIZE-1; ++i)
88 ints[i] = new Integer(i);
89 LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
90 shouldThrow();
91 } catch (NullPointerException success) {}
92 }
93
94 /**
95 * Queue contains all elements of collection used to initialize
96 */
97 public void testConstructor6() {
98 Integer[] ints = new Integer[SIZE];
99 for (int i = 0; i < SIZE; ++i)
100 ints[i] = new Integer(i);
101 LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
102 for (int i = 0; i < SIZE; ++i)
103 assertEquals(ints[i], q.poll());
104 }
105
106 /**
107 * Queue transitions from empty to full when elements added
108 */
109 public void testEmptyFull() {
110 LinkedBlockingQueue q = new LinkedBlockingQueue(2);
111 assertTrue(q.isEmpty());
112 assertEquals("should have room for 2", 2, q.remainingCapacity());
113 q.add(one);
114 assertFalse(q.isEmpty());
115 q.add(two);
116 assertFalse(q.isEmpty());
117 assertEquals(0, q.remainingCapacity());
118 assertFalse(q.offer(three));
119 }
120
121 /**
122 * remainingCapacity decreases on add, increases on remove
123 */
124 public void testRemainingCapacity() {
125 LinkedBlockingQueue q = populatedQueue(SIZE);
126 for (int i = 0; i < SIZE; ++i) {
127 assertEquals(i, q.remainingCapacity());
128 assertEquals(SIZE-i, q.size());
129 q.remove();
130 }
131 for (int i = 0; i < SIZE; ++i) {
132 assertEquals(SIZE-i, q.remainingCapacity());
133 assertEquals(i, q.size());
134 q.add(new Integer(i));
135 }
136 }
137
138 /**
139 * offer(null) throws NPE
140 */
141 public void testOfferNull() {
142 try {
143 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
144 q.offer(null);
145 shouldThrow();
146 } catch (NullPointerException success) {}
147 }
148
149 /**
150 * add(null) throws NPE
151 */
152 public void testAddNull() {
153 try {
154 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
155 q.add(null);
156 shouldThrow();
157 } catch (NullPointerException success) {}
158 }
159
160 /**
161 * Offer succeeds if not full; fails if full
162 */
163 public void testOffer() {
164 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
165 assertTrue(q.offer(zero));
166 assertFalse(q.offer(one));
167 }
168
169 /**
170 * add succeeds if not full; throws ISE if full
171 */
172 public void testAdd() {
173 try {
174 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
175 for (int i = 0; i < SIZE; ++i) {
176 assertTrue(q.add(new Integer(i)));
177 }
178 assertEquals(0, q.remainingCapacity());
179 q.add(new Integer(SIZE));
180 shouldThrow();
181 } catch (IllegalStateException success) {}
182 }
183
184 /**
185 * addAll(null) throws NPE
186 */
187 public void testAddAll1() {
188 try {
189 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
190 q.addAll(null);
191 shouldThrow();
192 } catch (NullPointerException success) {}
193 }
194
195 /**
196 * addAll(this) throws IAE
197 */
198 public void testAddAllSelf() {
199 try {
200 LinkedBlockingQueue q = populatedQueue(SIZE);
201 q.addAll(q);
202 shouldThrow();
203 } catch (IllegalArgumentException success) {}
204 }
205
206 /**
207 * addAll of a collection with null elements throws NPE
208 */
209 public void testAddAll2() {
210 try {
211 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
212 Integer[] ints = new Integer[SIZE];
213 q.addAll(Arrays.asList(ints));
214 shouldThrow();
215 } catch (NullPointerException success) {}
216 }
217 /**
218 * addAll of a collection with any null elements throws NPE after
219 * possibly adding some elements
220 */
221 public void testAddAll3() {
222 try {
223 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
224 Integer[] ints = new Integer[SIZE];
225 for (int i = 0; i < SIZE-1; ++i)
226 ints[i] = new Integer(i);
227 q.addAll(Arrays.asList(ints));
228 shouldThrow();
229 } catch (NullPointerException success) {}
230 }
231 /**
232 * addAll throws ISE if not enough room
233 */
234 public void testAddAll4() {
235 try {
236 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
237 Integer[] ints = new Integer[SIZE];
238 for (int i = 0; i < SIZE; ++i)
239 ints[i] = new Integer(i);
240 q.addAll(Arrays.asList(ints));
241 shouldThrow();
242 } catch (IllegalStateException success) {}
243 }
244 /**
245 * Queue contains all elements, in traversal order, of successful addAll
246 */
247 public void testAddAll5() {
248 Integer[] empty = new Integer[0];
249 Integer[] ints = new Integer[SIZE];
250 for (int i = 0; i < SIZE; ++i)
251 ints[i] = new Integer(i);
252 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
253 assertFalse(q.addAll(Arrays.asList(empty)));
254 assertTrue(q.addAll(Arrays.asList(ints)));
255 for (int i = 0; i < SIZE; ++i)
256 assertEquals(ints[i], q.poll());
257 }
258
259 /**
260 * put(null) throws NPE
261 */
262 public void testPutNull() throws InterruptedException {
263 try {
264 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
265 q.put(null);
266 shouldThrow();
267 } catch (NullPointerException success) {}
268 }
269
270 /**
271 * all elements successfully put are contained
272 */
273 public void testPut() throws InterruptedException {
274 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
275 for (int i = 0; i < SIZE; ++i) {
276 Integer I = new Integer(i);
277 q.put(I);
278 assertTrue(q.contains(I));
279 }
280 assertEquals(0, q.remainingCapacity());
281 }
282
283 /**
284 * put blocks interruptibly if full
285 */
286 public void testBlockingPut() throws InterruptedException {
287 Thread t = new Thread(new CheckedRunnable() {
288 public void realRun() {
289 int added = 0;
290 try {
291 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
292 for (int i = 0; i < SIZE; ++i) {
293 q.put(new Integer(i));
294 ++added;
295 }
296 q.put(new Integer(SIZE));
297 threadShouldThrow();
298 } catch (InterruptedException success) {
299 threadAssertEquals(added, SIZE);
300 }
301 }});
302
303 t.start();
304 Thread.sleep(SHORT_DELAY_MS);
305 t.interrupt();
306 t.join();
307 }
308
309 /**
310 * put blocks waiting for take when full
311 */
312 public void testPutWithTake() throws InterruptedException {
313 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
314 Thread t = new Thread(new CheckedRunnable() {
315 public void realRun() {
316 int added = 0;
317 try {
318 q.put(new Object());
319 ++added;
320 q.put(new Object());
321 ++added;
322 q.put(new Object());
323 ++added;
324 q.put(new Object());
325 ++added;
326 threadShouldThrow();
327 } catch (InterruptedException success) {
328 threadAssertTrue(added >= 2);
329 }
330 }});
331
332 t.start();
333 Thread.sleep(SHORT_DELAY_MS);
334 q.take();
335 t.interrupt();
336 t.join();
337 }
338
339 /**
340 * timed offer times out if full and elements not taken
341 */
342 public void testTimedOffer() throws InterruptedException {
343 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
344 Thread t = new ThreadShouldThrow(InterruptedException.class) {
345 public void realRun() throws InterruptedException {
346 q.put(new Object());
347 q.put(new Object());
348 threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, MILLISECONDS));
349 q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
350 }};
351
352 t.start();
353 Thread.sleep(SMALL_DELAY_MS);
354 t.interrupt();
355 t.join();
356 }
357
358 /**
359 * take retrieves elements in FIFO order
360 */
361 public void testTake() throws InterruptedException {
362 LinkedBlockingQueue q = populatedQueue(SIZE);
363 for (int i = 0; i < SIZE; ++i) {
364 assertEquals(i, ((Integer)q.take()).intValue());
365 }
366 }
367
368 /**
369 * take blocks interruptibly when empty
370 */
371 public void testTakeFromEmpty() throws InterruptedException {
372 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
373 Thread t = new ThreadShouldThrow(InterruptedException.class) {
374 public void realRun() throws InterruptedException {
375 q.take();
376 }};
377
378 t.start();
379 Thread.sleep(SHORT_DELAY_MS);
380 t.interrupt();
381 t.join();
382 }
383
384 /**
385 * Take removes existing elements until empty, then blocks interruptibly
386 */
387 public void testBlockingTake() throws InterruptedException {
388 Thread t = new ThreadShouldThrow(InterruptedException.class) {
389 public void realRun() throws InterruptedException {
390 LinkedBlockingQueue q = populatedQueue(SIZE);
391 for (int i = 0; i < SIZE; ++i) {
392 assertEquals(i, ((Integer)q.take()).intValue());
393 }
394 q.take();
395 }};
396
397 t.start();
398 Thread.sleep(SHORT_DELAY_MS);
399 t.interrupt();
400 t.join();
401 }
402
403
404 /**
405 * poll succeeds unless empty
406 */
407 public void testPoll() {
408 LinkedBlockingQueue q = populatedQueue(SIZE);
409 for (int i = 0; i < SIZE; ++i) {
410 assertEquals(i, ((Integer)q.poll()).intValue());
411 }
412 assertNull(q.poll());
413 }
414
415 /**
416 * timed pool with zero timeout succeeds when non-empty, else times out
417 */
418 public void testTimedPoll0() throws InterruptedException {
419 LinkedBlockingQueue q = populatedQueue(SIZE);
420 for (int i = 0; i < SIZE; ++i) {
421 assertEquals(i, ((Integer)q.poll(0, MILLISECONDS)).intValue());
422 }
423 assertNull(q.poll(0, MILLISECONDS));
424 }
425
426 /**
427 * timed pool with nonzero timeout succeeds when non-empty, else times out
428 */
429 public void testTimedPoll() throws InterruptedException {
430 LinkedBlockingQueue q = populatedQueue(SIZE);
431 for (int i = 0; i < SIZE; ++i) {
432 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, MILLISECONDS)).intValue());
433 }
434 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
435 }
436
437 /**
438 * Interrupted timed poll throws InterruptedException instead of
439 * returning timeout status
440 */
441 public void testInterruptedTimedPoll() throws InterruptedException {
442 Thread t = new Thread(new CheckedRunnable() {
443 public void realRun() throws InterruptedException {
444 LinkedBlockingQueue q = populatedQueue(SIZE);
445 for (int i = 0; i < SIZE; ++i) {
446 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, MILLISECONDS)).intValue());
447 }
448 try {
449 q.poll(SMALL_DELAY_MS, MILLISECONDS);
450 shouldThrow();
451 } catch (InterruptedException success) {}
452 }});
453
454 t.start();
455 Thread.sleep(SHORT_DELAY_MS);
456 t.interrupt();
457 t.join();
458 }
459
460 /**
461 * timed poll before a delayed offer fails; after offer succeeds;
462 * on interruption throws
463 */
464 public void testTimedPollWithOffer() throws InterruptedException {
465 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
466 Thread t = new ThreadShouldThrow(InterruptedException.class) {
467 public void realRun() throws InterruptedException {
468 threadAssertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
469 q.poll(LONG_DELAY_MS, MILLISECONDS);
470 q.poll(LONG_DELAY_MS, MILLISECONDS);
471 }};
472
473 t.start();
474 Thread.sleep(SMALL_DELAY_MS);
475 assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
476 t.interrupt();
477 t.join();
478 }
479
480 /**
481 * peek returns next element, or null if empty
482 */
483 public void testPeek() {
484 LinkedBlockingQueue q = populatedQueue(SIZE);
485 for (int i = 0; i < SIZE; ++i) {
486 assertEquals(i, ((Integer)q.peek()).intValue());
487 q.poll();
488 assertTrue(q.peek() == null ||
489 i != ((Integer)q.peek()).intValue());
490 }
491 assertNull(q.peek());
492 }
493
494 /**
495 * element returns next element, or throws NSEE if empty
496 */
497 public void testElement() {
498 LinkedBlockingQueue q = populatedQueue(SIZE);
499 for (int i = 0; i < SIZE; ++i) {
500 assertEquals(i, ((Integer)q.element()).intValue());
501 q.poll();
502 }
503 try {
504 q.element();
505 shouldThrow();
506 } catch (NoSuchElementException success) {}
507 }
508
509 /**
510 * remove removes next element, or throws NSEE if empty
511 */
512 public void testRemove() {
513 LinkedBlockingQueue q = populatedQueue(SIZE);
514 for (int i = 0; i < SIZE; ++i) {
515 assertEquals(i, ((Integer)q.remove()).intValue());
516 }
517 try {
518 q.remove();
519 shouldThrow();
520 } catch (NoSuchElementException success) {}
521 }
522
523 /**
524 * remove(x) removes x and returns true if present
525 */
526 public void testRemoveElement() {
527 LinkedBlockingQueue q = populatedQueue(SIZE);
528 for (int i = 1; i < SIZE; i+=2) {
529 assertTrue(q.remove(new Integer(i)));
530 }
531 for (int i = 0; i < SIZE; i+=2) {
532 assertTrue(q.remove(new Integer(i)));
533 assertFalse(q.remove(new Integer(i+1)));
534 }
535 assertTrue(q.isEmpty());
536 }
537
538 /**
539 * An add following remove(x) succeeds
540 */
541 public void testRemoveElementAndAdd() throws InterruptedException {
542 LinkedBlockingQueue q = new LinkedBlockingQueue();
543 assertTrue(q.add(new Integer(1)));
544 assertTrue(q.add(new Integer(2)));
545 assertTrue(q.remove(new Integer(1)));
546 assertTrue(q.remove(new Integer(2)));
547 assertTrue(q.add(new Integer(3)));
548 assertTrue(q.take() != null);
549 }
550
551 /**
552 * contains(x) reports true when elements added but not yet removed
553 */
554 public void testContains() {
555 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue q = populatedQueue(SIZE);
584 LinkedBlockingQueue p = new LinkedBlockingQueue(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 LinkedBlockingQueue q = populatedQueue(SIZE);
598 LinkedBlockingQueue 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 LinkedBlockingQueue q = populatedQueue(SIZE);
618 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue q = new LinkedBlockingQueue(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 /**
704 * iterator ordering is FIFO
705 */
706 public void testIteratorOrdering() {
707 final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
708 q.add(one);
709 q.add(two);
710 q.add(three);
711 assertEquals(0, q.remainingCapacity());
712 int k = 0;
713 for (Iterator it = q.iterator(); it.hasNext();) {
714 int i = ((Integer)(it.next())).intValue();
715 assertEquals(++k, i);
716 }
717 assertEquals(3, k);
718 }
719
720 /**
721 * Modifications do not cause iterators to fail
722 */
723 public void testWeaklyConsistentIteration () {
724 final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
725 q.add(one);
726 q.add(two);
727 q.add(three);
728 for (Iterator it = q.iterator(); it.hasNext();) {
729 q.remove();
730 it.next();
731 }
732 assertEquals(0, q.size());
733 }
734
735
736 /**
737 * toString contains toStrings of elements
738 */
739 public void testToString() {
740 LinkedBlockingQueue q = populatedQueue(SIZE);
741 String s = q.toString();
742 for (int i = 0; i < SIZE; ++i) {
743 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
744 }
745 }
746
747
748 /**
749 * offer transfers elements across Executor tasks
750 */
751 public void testOfferInExecutor() {
752 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
753 q.add(one);
754 q.add(two);
755 ExecutorService executor = Executors.newFixedThreadPool(2);
756 executor.execute(new CheckedRunnable() {
757 public void realRun() throws InterruptedException {
758 threadAssertFalse(q.offer(three));
759 threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
760 threadAssertEquals(0, q.remainingCapacity());
761 }});
762
763 executor.execute(new CheckedRunnable() {
764 public void realRun() throws InterruptedException {
765 Thread.sleep(SMALL_DELAY_MS);
766 threadAssertEquals(one, q.take());
767 }});
768
769 joinPool(executor);
770 }
771
772 /**
773 * poll retrieves elements across Executor threads
774 */
775 public void testPollInExecutor() {
776 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
777 ExecutorService executor = Executors.newFixedThreadPool(2);
778 executor.execute(new CheckedRunnable() {
779 public void realRun() throws InterruptedException {
780 threadAssertNull(q.poll());
781 threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
782 threadAssertTrue(q.isEmpty());
783 }});
784
785 executor.execute(new CheckedRunnable() {
786 public void realRun() throws InterruptedException {
787 Thread.sleep(SMALL_DELAY_MS);
788 q.put(one);
789 }});
790
791 joinPool(executor);
792 }
793
794 /**
795 * A deserialized serialized queue has same elements in same order
796 */
797 public void testSerialization() throws Exception {
798 LinkedBlockingQueue q = populatedQueue(SIZE);
799
800 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
801 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
802 out.writeObject(q);
803 out.close();
804
805 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
806 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
807 LinkedBlockingQueue r = (LinkedBlockingQueue)in.readObject();
808 assertEquals(q.size(), r.size());
809 while (!q.isEmpty())
810 assertEquals(q.remove(), r.remove());
811 }
812
813 /**
814 * drainTo(null) throws NPE
815 */
816 public void testDrainToNull() {
817 LinkedBlockingQueue q = populatedQueue(SIZE);
818 try {
819 q.drainTo(null);
820 shouldThrow();
821 } catch (NullPointerException success) {}
822 }
823
824 /**
825 * drainTo(this) throws IAE
826 */
827 public void testDrainToSelf() {
828 LinkedBlockingQueue q = populatedQueue(SIZE);
829 try {
830 q.drainTo(q);
831 shouldThrow();
832 } catch (IllegalArgumentException success) {}
833 }
834
835 /**
836 * drainTo(c) empties queue into another collection c
837 */
838 public void testDrainTo() {
839 LinkedBlockingQueue q = populatedQueue(SIZE);
840 ArrayList l = new ArrayList();
841 q.drainTo(l);
842 assertEquals(q.size(), 0);
843 assertEquals(l.size(), SIZE);
844 for (int i = 0; i < SIZE; ++i)
845 assertEquals(l.get(i), new Integer(i));
846 q.add(zero);
847 q.add(one);
848 assertFalse(q.isEmpty());
849 assertTrue(q.contains(zero));
850 assertTrue(q.contains(one));
851 l.clear();
852 q.drainTo(l);
853 assertEquals(q.size(), 0);
854 assertEquals(l.size(), 2);
855 for (int i = 0; i < 2; ++i)
856 assertEquals(l.get(i), new Integer(i));
857 }
858
859 /**
860 * drainTo empties full queue, unblocking a waiting put.
861 */
862 public void testDrainToWithActivePut() throws InterruptedException {
863 final LinkedBlockingQueue q = populatedQueue(SIZE);
864 Thread t = new Thread(new CheckedRunnable() {
865 public void realRun() throws InterruptedException {
866 q.put(new Integer(SIZE+1));
867 }});
868
869 t.start();
870 ArrayList l = new ArrayList();
871 q.drainTo(l);
872 assertTrue(l.size() >= SIZE);
873 for (int i = 0; i < SIZE; ++i)
874 assertEquals(l.get(i), new Integer(i));
875 t.join();
876 assertTrue(q.size() + l.size() >= SIZE);
877 }
878
879 /**
880 * drainTo(null, n) throws NPE
881 */
882 public void testDrainToNullN() {
883 LinkedBlockingQueue q = populatedQueue(SIZE);
884 try {
885 q.drainTo(null, 0);
886 shouldThrow();
887 } catch (NullPointerException success) {}
888 }
889
890 /**
891 * drainTo(this, n) throws IAE
892 */
893 public void testDrainToSelfN() {
894 LinkedBlockingQueue q = populatedQueue(SIZE);
895 try {
896 q.drainTo(q, 0);
897 shouldThrow();
898 } catch (IllegalArgumentException success) {}
899 }
900
901 /**
902 * drainTo(c, n) empties first max {n, size} elements of queue into c
903 */
904 public void testDrainToN() {
905 LinkedBlockingQueue q = new LinkedBlockingQueue();
906 for (int i = 0; i < SIZE + 2; ++i) {
907 for (int j = 0; j < SIZE; j++)
908 assertTrue(q.offer(new Integer(j)));
909 ArrayList l = new ArrayList();
910 q.drainTo(l, i);
911 int k = (i < SIZE)? i : SIZE;
912 assertEquals(l.size(), k);
913 assertEquals(q.size(), SIZE-k);
914 for (int j = 0; j < k; ++j)
915 assertEquals(l.get(j), new Integer(j));
916 while (q.poll() != null) ;
917 }
918 }
919
920 }