ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.21
Committed: Sat Nov 21 22:00:46 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.20: +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 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 Thread(new CheckedRunnable() {
345 public void realRun() throws InterruptedException {
346 q.put(new Object());
347 q.put(new Object());
348 assertFalse(q.offer(new Object(), SHORT_DELAY_MS, MILLISECONDS));
349 try {
350 q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
351 shouldThrow();
352 } catch (InterruptedException success) {}
353 }});
354
355 t.start();
356 Thread.sleep(SMALL_DELAY_MS);
357 t.interrupt();
358 t.join();
359 }
360
361 /**
362 * take retrieves elements in FIFO order
363 */
364 public void testTake() throws InterruptedException {
365 LinkedBlockingQueue q = populatedQueue(SIZE);
366 for (int i = 0; i < SIZE; ++i) {
367 assertEquals(i, ((Integer)q.take()).intValue());
368 }
369 }
370
371 /**
372 * take blocks interruptibly when empty
373 */
374 public void testTakeFromEmpty() throws InterruptedException {
375 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
376 Thread t = new ThreadShouldThrow(InterruptedException.class) {
377 public void realRun() throws InterruptedException {
378 q.take();
379 }};
380
381 t.start();
382 Thread.sleep(SHORT_DELAY_MS);
383 t.interrupt();
384 t.join();
385 }
386
387 /**
388 * Take removes existing elements until empty, then blocks interruptibly
389 */
390 public void testBlockingTake() throws InterruptedException {
391 Thread t = new ThreadShouldThrow(InterruptedException.class) {
392 public void realRun() throws InterruptedException {
393 LinkedBlockingQueue q = populatedQueue(SIZE);
394 for (int i = 0; i < SIZE; ++i) {
395 assertEquals(i, ((Integer)q.take()).intValue());
396 }
397 q.take();
398 }};
399
400 t.start();
401 Thread.sleep(SHORT_DELAY_MS);
402 t.interrupt();
403 t.join();
404 }
405
406
407 /**
408 * poll succeeds unless empty
409 */
410 public void testPoll() {
411 LinkedBlockingQueue q = populatedQueue(SIZE);
412 for (int i = 0; i < SIZE; ++i) {
413 assertEquals(i, ((Integer)q.poll()).intValue());
414 }
415 assertNull(q.poll());
416 }
417
418 /**
419 * timed pool with zero timeout succeeds when non-empty, else times out
420 */
421 public void testTimedPoll0() throws InterruptedException {
422 LinkedBlockingQueue q = populatedQueue(SIZE);
423 for (int i = 0; i < SIZE; ++i) {
424 assertEquals(i, ((Integer)q.poll(0, MILLISECONDS)).intValue());
425 }
426 assertNull(q.poll(0, MILLISECONDS));
427 }
428
429 /**
430 * timed pool with nonzero timeout succeeds when non-empty, else times out
431 */
432 public void testTimedPoll() throws InterruptedException {
433 LinkedBlockingQueue q = populatedQueue(SIZE);
434 for (int i = 0; i < SIZE; ++i) {
435 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, MILLISECONDS)).intValue());
436 }
437 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
438 }
439
440 /**
441 * Interrupted timed poll throws InterruptedException instead of
442 * returning timeout status
443 */
444 public void testInterruptedTimedPoll() throws InterruptedException {
445 Thread t = new Thread(new CheckedRunnable() {
446 public void realRun() throws InterruptedException {
447 LinkedBlockingQueue q = populatedQueue(SIZE);
448 for (int i = 0; i < SIZE; ++i) {
449 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, MILLISECONDS)).intValue());
450 }
451 try {
452 q.poll(SMALL_DELAY_MS, MILLISECONDS);
453 shouldThrow();
454 } catch (InterruptedException success) {}
455 }});
456
457 t.start();
458 Thread.sleep(SHORT_DELAY_MS);
459 t.interrupt();
460 t.join();
461 }
462
463 /**
464 * timed poll before a delayed offer fails; after offer succeeds;
465 * on interruption throws
466 */
467 public void testTimedPollWithOffer() throws InterruptedException {
468 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
469 Thread t = new Thread(new CheckedRunnable() {
470 public void realRun() throws InterruptedException {
471 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
472 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
473 try {
474 q.poll(LONG_DELAY_MS, MILLISECONDS);
475 shouldThrow();
476 } catch (InterruptedException success) {}
477 }});
478
479 t.start();
480 Thread.sleep(SMALL_DELAY_MS);
481 assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
482 t.interrupt();
483 t.join();
484 }
485
486 /**
487 * peek returns next element, or null if empty
488 */
489 public void testPeek() {
490 LinkedBlockingQueue q = populatedQueue(SIZE);
491 for (int i = 0; i < SIZE; ++i) {
492 assertEquals(i, ((Integer)q.peek()).intValue());
493 q.poll();
494 assertTrue(q.peek() == null ||
495 i != ((Integer)q.peek()).intValue());
496 }
497 assertNull(q.peek());
498 }
499
500 /**
501 * element returns next element, or throws NSEE if empty
502 */
503 public void testElement() {
504 LinkedBlockingQueue q = populatedQueue(SIZE);
505 for (int i = 0; i < SIZE; ++i) {
506 assertEquals(i, ((Integer)q.element()).intValue());
507 q.poll();
508 }
509 try {
510 q.element();
511 shouldThrow();
512 } catch (NoSuchElementException success) {}
513 }
514
515 /**
516 * remove removes next element, or throws NSEE if empty
517 */
518 public void testRemove() {
519 LinkedBlockingQueue q = populatedQueue(SIZE);
520 for (int i = 0; i < SIZE; ++i) {
521 assertEquals(i, ((Integer)q.remove()).intValue());
522 }
523 try {
524 q.remove();
525 shouldThrow();
526 } catch (NoSuchElementException success) {}
527 }
528
529 /**
530 * remove(x) removes x and returns true if present
531 */
532 public void testRemoveElement() {
533 LinkedBlockingQueue q = populatedQueue(SIZE);
534 for (int i = 1; i < SIZE; i+=2) {
535 assertTrue(q.remove(new Integer(i)));
536 }
537 for (int i = 0; i < SIZE; i+=2) {
538 assertTrue(q.remove(new Integer(i)));
539 assertFalse(q.remove(new Integer(i+1)));
540 }
541 assertTrue(q.isEmpty());
542 }
543
544 /**
545 * An add following remove(x) succeeds
546 */
547 public void testRemoveElementAndAdd() throws InterruptedException {
548 LinkedBlockingQueue q = new LinkedBlockingQueue();
549 assertTrue(q.add(new Integer(1)));
550 assertTrue(q.add(new Integer(2)));
551 assertTrue(q.remove(new Integer(1)));
552 assertTrue(q.remove(new Integer(2)));
553 assertTrue(q.add(new Integer(3)));
554 assertTrue(q.take() != null);
555 }
556
557 /**
558 * contains(x) reports true when elements added but not yet removed
559 */
560 public void testContains() {
561 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue q = populatedQueue(SIZE);
590 LinkedBlockingQueue p = new LinkedBlockingQueue(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 LinkedBlockingQueue q = populatedQueue(SIZE);
604 LinkedBlockingQueue 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 LinkedBlockingQueue q = populatedQueue(SIZE);
624 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue 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 LinkedBlockingQueue q = new LinkedBlockingQueue(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 /**
710 * iterator ordering is FIFO
711 */
712 public void testIteratorOrdering() {
713 final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
714 q.add(one);
715 q.add(two);
716 q.add(three);
717 assertEquals(0, q.remainingCapacity());
718 int k = 0;
719 for (Iterator it = q.iterator(); it.hasNext();) {
720 int i = ((Integer)(it.next())).intValue();
721 assertEquals(++k, i);
722 }
723 assertEquals(3, k);
724 }
725
726 /**
727 * Modifications do not cause iterators to fail
728 */
729 public void testWeaklyConsistentIteration () {
730 final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
731 q.add(one);
732 q.add(two);
733 q.add(three);
734 for (Iterator it = q.iterator(); it.hasNext();) {
735 q.remove();
736 it.next();
737 }
738 assertEquals(0, q.size());
739 }
740
741
742 /**
743 * toString contains toStrings of elements
744 */
745 public void testToString() {
746 LinkedBlockingQueue q = populatedQueue(SIZE);
747 String s = q.toString();
748 for (int i = 0; i < SIZE; ++i) {
749 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
750 }
751 }
752
753
754 /**
755 * offer transfers elements across Executor tasks
756 */
757 public void testOfferInExecutor() {
758 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
759 q.add(one);
760 q.add(two);
761 ExecutorService executor = Executors.newFixedThreadPool(2);
762 executor.execute(new CheckedRunnable() {
763 public void realRun() throws InterruptedException {
764 threadAssertFalse(q.offer(three));
765 threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
766 threadAssertEquals(0, q.remainingCapacity());
767 }});
768
769 executor.execute(new CheckedRunnable() {
770 public void realRun() throws InterruptedException {
771 Thread.sleep(SMALL_DELAY_MS);
772 threadAssertEquals(one, q.take());
773 }});
774
775 joinPool(executor);
776 }
777
778 /**
779 * poll retrieves elements across Executor threads
780 */
781 public void testPollInExecutor() {
782 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
783 ExecutorService executor = Executors.newFixedThreadPool(2);
784 executor.execute(new CheckedRunnable() {
785 public void realRun() throws InterruptedException {
786 threadAssertNull(q.poll());
787 threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
788 threadAssertTrue(q.isEmpty());
789 }});
790
791 executor.execute(new CheckedRunnable() {
792 public void realRun() throws InterruptedException {
793 Thread.sleep(SMALL_DELAY_MS);
794 q.put(one);
795 }});
796
797 joinPool(executor);
798 }
799
800 /**
801 * A deserialized serialized queue has same elements in same order
802 */
803 public void testSerialization() throws Exception {
804 LinkedBlockingQueue q = populatedQueue(SIZE);
805
806 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
807 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
808 out.writeObject(q);
809 out.close();
810
811 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
812 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
813 LinkedBlockingQueue r = (LinkedBlockingQueue)in.readObject();
814 assertEquals(q.size(), r.size());
815 while (!q.isEmpty())
816 assertEquals(q.remove(), r.remove());
817 }
818
819 /**
820 * drainTo(null) throws NPE
821 */
822 public void testDrainToNull() {
823 LinkedBlockingQueue q = populatedQueue(SIZE);
824 try {
825 q.drainTo(null);
826 shouldThrow();
827 } catch (NullPointerException success) {}
828 }
829
830 /**
831 * drainTo(this) throws IAE
832 */
833 public void testDrainToSelf() {
834 LinkedBlockingQueue q = populatedQueue(SIZE);
835 try {
836 q.drainTo(q);
837 shouldThrow();
838 } catch (IllegalArgumentException success) {}
839 }
840
841 /**
842 * drainTo(c) empties queue into another collection c
843 */
844 public void testDrainTo() {
845 LinkedBlockingQueue q = populatedQueue(SIZE);
846 ArrayList l = new ArrayList();
847 q.drainTo(l);
848 assertEquals(q.size(), 0);
849 assertEquals(l.size(), SIZE);
850 for (int i = 0; i < SIZE; ++i)
851 assertEquals(l.get(i), new Integer(i));
852 q.add(zero);
853 q.add(one);
854 assertFalse(q.isEmpty());
855 assertTrue(q.contains(zero));
856 assertTrue(q.contains(one));
857 l.clear();
858 q.drainTo(l);
859 assertEquals(q.size(), 0);
860 assertEquals(l.size(), 2);
861 for (int i = 0; i < 2; ++i)
862 assertEquals(l.get(i), new Integer(i));
863 }
864
865 /**
866 * drainTo empties full queue, unblocking a waiting put.
867 */
868 public void testDrainToWithActivePut() throws InterruptedException {
869 final LinkedBlockingQueue q = populatedQueue(SIZE);
870 Thread t = new Thread(new CheckedRunnable() {
871 public void realRun() throws InterruptedException {
872 q.put(new Integer(SIZE+1));
873 }});
874
875 t.start();
876 ArrayList l = new ArrayList();
877 q.drainTo(l);
878 assertTrue(l.size() >= SIZE);
879 for (int i = 0; i < SIZE; ++i)
880 assertEquals(l.get(i), new Integer(i));
881 t.join();
882 assertTrue(q.size() + l.size() >= SIZE);
883 }
884
885 /**
886 * drainTo(null, n) throws NPE
887 */
888 public void testDrainToNullN() {
889 LinkedBlockingQueue q = populatedQueue(SIZE);
890 try {
891 q.drainTo(null, 0);
892 shouldThrow();
893 } catch (NullPointerException success) {}
894 }
895
896 /**
897 * drainTo(this, n) throws IAE
898 */
899 public void testDrainToSelfN() {
900 LinkedBlockingQueue q = populatedQueue(SIZE);
901 try {
902 q.drainTo(q, 0);
903 shouldThrow();
904 } catch (IllegalArgumentException success) {}
905 }
906
907 /**
908 * drainTo(c, n) empties first max {n, size} elements of queue into c
909 */
910 public void testDrainToN() {
911 LinkedBlockingQueue q = new LinkedBlockingQueue();
912 for (int i = 0; i < SIZE + 2; ++i) {
913 for (int j = 0; j < SIZE; j++)
914 assertTrue(q.offer(new Integer(j)));
915 ArrayList l = new ArrayList();
916 q.drainTo(l, i);
917 int k = (i < SIZE)? i : SIZE;
918 assertEquals(l.size(), k);
919 assertEquals(q.size(), SIZE-k);
920 for (int j = 0; j < k; ++j)
921 assertEquals(l.get(j), new Integer(j));
922 while (q.poll() != null) ;
923 }
924 }
925
926 }