ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.41
Committed: Tue May 31 16:16:24 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.40: +12 -13 lines
Log Message:
use serialClone in serialization tests; update imports

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/publicdomain/zero/1.0/
5 */
6
7 import junit.framework.*;
8 import java.util.Arrays;
9 import java.util.ArrayList;
10 import java.util.Collection;
11 import java.util.Iterator;
12 import java.util.NoSuchElementException;
13 import java.util.Queue;
14 import java.util.concurrent.BlockingDeque;
15 import java.util.concurrent.BlockingQueue;
16 import java.util.concurrent.CountDownLatch;
17 import java.util.concurrent.Executors;
18 import java.util.concurrent.ExecutorService;
19 import java.util.concurrent.LinkedBlockingDeque;
20 import static java.util.concurrent.TimeUnit.MILLISECONDS;
21
22 public class LinkedBlockingDequeTest extends JSR166TestCase {
23
24 public static class Unbounded extends BlockingQueueTest {
25 protected BlockingQueue emptyCollection() {
26 return new LinkedBlockingDeque();
27 }
28 }
29
30 public static class Bounded extends BlockingQueueTest {
31 protected BlockingQueue emptyCollection() {
32 return new LinkedBlockingDeque(20);
33 }
34 }
35
36 public static void main(String[] args) {
37 junit.textui.TestRunner.run(suite());
38 }
39
40 public static Test suite() {
41 return newTestSuite(LinkedBlockingDequeTest.class,
42 new Unbounded().testSuite(),
43 new Bounded().testSuite());
44 }
45
46 /**
47 * Create a deque of given size containing consecutive
48 * Integers 0 ... n.
49 */
50 private LinkedBlockingDeque<Integer> populatedDeque(int n) {
51 LinkedBlockingDeque<Integer> q =
52 new LinkedBlockingDeque<Integer>(n);
53 assertTrue(q.isEmpty());
54 for (int i = 0; i < n; i++)
55 assertTrue(q.offer(new Integer(i)));
56 assertFalse(q.isEmpty());
57 assertEquals(0, q.remainingCapacity());
58 assertEquals(n, q.size());
59 return q;
60 }
61
62 /**
63 * isEmpty is true before add, false after
64 */
65 public void testEmpty() {
66 LinkedBlockingDeque q = new LinkedBlockingDeque();
67 assertTrue(q.isEmpty());
68 q.add(new Integer(1));
69 assertFalse(q.isEmpty());
70 q.add(new Integer(2));
71 q.removeFirst();
72 q.removeFirst();
73 assertTrue(q.isEmpty());
74 }
75
76 /**
77 * size changes when elements added and removed
78 */
79 public void testSize() {
80 LinkedBlockingDeque q = populatedDeque(SIZE);
81 for (int i = 0; i < SIZE; ++i) {
82 assertEquals(SIZE-i, q.size());
83 q.removeFirst();
84 }
85 for (int i = 0; i < SIZE; ++i) {
86 assertEquals(i, q.size());
87 q.add(new Integer(i));
88 }
89 }
90
91 /**
92 * offerFirst(null) throws NullPointerException
93 */
94 public void testOfferFirstNull() {
95 LinkedBlockingDeque q = new LinkedBlockingDeque();
96 try {
97 q.offerFirst(null);
98 shouldThrow();
99 } catch (NullPointerException success) {}
100 }
101
102 /**
103 * offerLast(null) throws NullPointerException
104 */
105 public void testOfferLastNull() {
106 LinkedBlockingDeque q = new LinkedBlockingDeque();
107 try {
108 q.offerLast(null);
109 shouldThrow();
110 } catch (NullPointerException success) {}
111 }
112
113 /**
114 * OfferFirst succeeds
115 */
116 public void testOfferFirst() {
117 LinkedBlockingDeque q = new LinkedBlockingDeque();
118 assertTrue(q.offerFirst(new Integer(0)));
119 assertTrue(q.offerFirst(new Integer(1)));
120 }
121
122 /**
123 * OfferLast succeeds
124 */
125 public void testOfferLast() {
126 LinkedBlockingDeque q = new LinkedBlockingDeque();
127 assertTrue(q.offerLast(new Integer(0)));
128 assertTrue(q.offerLast(new Integer(1)));
129 }
130
131 /**
132 * pollFirst succeeds unless empty
133 */
134 public void testPollFirst() {
135 LinkedBlockingDeque q = populatedDeque(SIZE);
136 for (int i = 0; i < SIZE; ++i) {
137 assertEquals(i, q.pollFirst());
138 }
139 assertNull(q.pollFirst());
140 }
141
142 /**
143 * pollLast succeeds unless empty
144 */
145 public void testPollLast() {
146 LinkedBlockingDeque q = populatedDeque(SIZE);
147 for (int i = SIZE-1; i >= 0; --i) {
148 assertEquals(i, q.pollLast());
149 }
150 assertNull(q.pollLast());
151 }
152
153 /**
154 * peekFirst returns next element, or null if empty
155 */
156 public void testPeekFirst() {
157 LinkedBlockingDeque q = populatedDeque(SIZE);
158 for (int i = 0; i < SIZE; ++i) {
159 assertEquals(i, q.peekFirst());
160 assertEquals(i, q.pollFirst());
161 assertTrue(q.peekFirst() == null ||
162 !q.peekFirst().equals(i));
163 }
164 assertNull(q.peekFirst());
165 }
166
167 /**
168 * peek returns next element, or null if empty
169 */
170 public void testPeek() {
171 LinkedBlockingDeque q = populatedDeque(SIZE);
172 for (int i = 0; i < SIZE; ++i) {
173 assertEquals(i, q.peek());
174 assertEquals(i, q.pollFirst());
175 assertTrue(q.peek() == null ||
176 !q.peek().equals(i));
177 }
178 assertNull(q.peek());
179 }
180
181 /**
182 * peekLast returns next element, or null if empty
183 */
184 public void testPeekLast() {
185 LinkedBlockingDeque q = populatedDeque(SIZE);
186 for (int i = SIZE-1; i >= 0; --i) {
187 assertEquals(i, q.peekLast());
188 assertEquals(i, q.pollLast());
189 assertTrue(q.peekLast() == null ||
190 !q.peekLast().equals(i));
191 }
192 assertNull(q.peekLast());
193 }
194
195 /**
196 * getFirst() returns first element, or throws NSEE if empty
197 */
198 public void testFirstElement() {
199 LinkedBlockingDeque q = populatedDeque(SIZE);
200 for (int i = 0; i < SIZE; ++i) {
201 assertEquals(i, q.getFirst());
202 assertEquals(i, q.pollFirst());
203 }
204 try {
205 q.getFirst();
206 shouldThrow();
207 } catch (NoSuchElementException success) {}
208 assertNull(q.peekFirst());
209 }
210
211 /**
212 * getLast() returns last element, or throws NSEE if empty
213 */
214 public void testLastElement() {
215 LinkedBlockingDeque q = populatedDeque(SIZE);
216 for (int i = SIZE-1; i >= 0; --i) {
217 assertEquals(i, q.getLast());
218 assertEquals(i, q.pollLast());
219 }
220 try {
221 q.getLast();
222 shouldThrow();
223 } catch (NoSuchElementException success) {}
224 assertNull(q.peekLast());
225 }
226
227 /**
228 * removeFirst() removes first element, or throws NSEE if empty
229 */
230 public void testRemoveFirst() {
231 LinkedBlockingDeque q = populatedDeque(SIZE);
232 for (int i = 0; i < SIZE; ++i) {
233 assertEquals(i, q.removeFirst());
234 }
235 try {
236 q.removeFirst();
237 shouldThrow();
238 } catch (NoSuchElementException success) {}
239 assertNull(q.peekFirst());
240 }
241
242 /**
243 * removeLast() removes last element, or throws NSEE if empty
244 */
245 public void testRemoveLast() {
246 LinkedBlockingDeque q = populatedDeque(SIZE);
247 for (int i = SIZE - 1; i >= 0; --i) {
248 assertEquals(i, q.removeLast());
249 }
250 try {
251 q.removeLast();
252 shouldThrow();
253 } catch (NoSuchElementException success) {}
254 assertNull(q.peekLast());
255 }
256
257 /**
258 * remove removes next element, or throws NSEE if empty
259 */
260 public void testRemove() {
261 LinkedBlockingDeque q = populatedDeque(SIZE);
262 for (int i = 0; i < SIZE; ++i) {
263 assertEquals(i, q.remove());
264 }
265 try {
266 q.remove();
267 shouldThrow();
268 } catch (NoSuchElementException success) {}
269 }
270
271 /**
272 * removeFirstOccurrence(x) removes x and returns true if present
273 */
274 public void testRemoveFirstOccurrence() {
275 LinkedBlockingDeque q = populatedDeque(SIZE);
276 for (int i = 1; i < SIZE; i+=2) {
277 assertTrue(q.removeFirstOccurrence(new Integer(i)));
278 }
279 for (int i = 0; i < SIZE; i+=2) {
280 assertTrue(q.removeFirstOccurrence(new Integer(i)));
281 assertFalse(q.removeFirstOccurrence(new Integer(i+1)));
282 }
283 assertTrue(q.isEmpty());
284 }
285
286 /**
287 * removeLastOccurrence(x) removes x and returns true if present
288 */
289 public void testRemoveLastOccurrence() {
290 LinkedBlockingDeque q = populatedDeque(SIZE);
291 for (int i = 1; i < SIZE; i+=2) {
292 assertTrue(q.removeLastOccurrence(new Integer(i)));
293 }
294 for (int i = 0; i < SIZE; i+=2) {
295 assertTrue(q.removeLastOccurrence(new Integer(i)));
296 assertFalse(q.removeLastOccurrence(new Integer(i+1)));
297 }
298 assertTrue(q.isEmpty());
299 }
300
301 /**
302 * peekFirst returns element inserted with addFirst
303 */
304 public void testAddFirst() {
305 LinkedBlockingDeque q = populatedDeque(3);
306 q.pollLast();
307 q.addFirst(four);
308 assertSame(four, q.peekFirst());
309 }
310
311 /**
312 * peekLast returns element inserted with addLast
313 */
314 public void testAddLast() {
315 LinkedBlockingDeque q = populatedDeque(3);
316 q.pollLast();
317 q.addLast(four);
318 assertSame(four, q.peekLast());
319 }
320
321 /**
322 * A new deque has the indicated capacity, or Integer.MAX_VALUE if
323 * none given
324 */
325 public void testConstructor1() {
326 assertEquals(SIZE, new LinkedBlockingDeque(SIZE).remainingCapacity());
327 assertEquals(Integer.MAX_VALUE, new LinkedBlockingDeque().remainingCapacity());
328 }
329
330 /**
331 * Constructor throws IllegalArgumentException if capacity argument nonpositive
332 */
333 public void testConstructor2() {
334 try {
335 new LinkedBlockingDeque(0);
336 shouldThrow();
337 } catch (IllegalArgumentException success) {}
338 }
339
340 /**
341 * Initializing from null Collection throws NullPointerException
342 */
343 public void testConstructor3() {
344 try {
345 new LinkedBlockingDeque(null);
346 shouldThrow();
347 } catch (NullPointerException success) {}
348 }
349
350 /**
351 * Initializing from Collection of null elements throws NullPointerException
352 */
353 public void testConstructor4() {
354 Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
355 try {
356 new LinkedBlockingDeque(elements);
357 shouldThrow();
358 } catch (NullPointerException success) {}
359 }
360
361 /**
362 * Initializing from Collection with some null elements throws
363 * NullPointerException
364 */
365 public void testConstructor5() {
366 Integer[] ints = new Integer[SIZE];
367 for (int i = 0; i < SIZE-1; ++i)
368 ints[i] = i;
369 Collection<Integer> elements = Arrays.asList(ints);
370 try {
371 new LinkedBlockingDeque(elements);
372 shouldThrow();
373 } catch (NullPointerException success) {}
374 }
375
376 /**
377 * Deque contains all elements of collection used to initialize
378 */
379 public void testConstructor6() {
380 Integer[] ints = new Integer[SIZE];
381 for (int i = 0; i < SIZE; ++i)
382 ints[i] = i;
383 LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
384 for (int i = 0; i < SIZE; ++i)
385 assertEquals(ints[i], q.poll());
386 }
387
388 /**
389 * Deque transitions from empty to full when elements added
390 */
391 public void testEmptyFull() {
392 LinkedBlockingDeque q = new LinkedBlockingDeque(2);
393 assertTrue(q.isEmpty());
394 assertEquals("should have room for 2", 2, q.remainingCapacity());
395 q.add(one);
396 assertFalse(q.isEmpty());
397 q.add(two);
398 assertFalse(q.isEmpty());
399 assertEquals(0, q.remainingCapacity());
400 assertFalse(q.offer(three));
401 }
402
403 /**
404 * remainingCapacity decreases on add, increases on remove
405 */
406 public void testRemainingCapacity() {
407 LinkedBlockingDeque q = populatedDeque(SIZE);
408 for (int i = 0; i < SIZE; ++i) {
409 assertEquals(i, q.remainingCapacity());
410 assertEquals(SIZE-i, q.size());
411 q.remove();
412 }
413 for (int i = 0; i < SIZE; ++i) {
414 assertEquals(SIZE-i, q.remainingCapacity());
415 assertEquals(i, q.size());
416 q.add(new Integer(i));
417 }
418 }
419
420 /**
421 * push(null) throws NPE
422 */
423 public void testPushNull() {
424 try {
425 LinkedBlockingDeque q = new LinkedBlockingDeque(1);
426 q.push(null);
427 shouldThrow();
428 } catch (NullPointerException success) {}
429 }
430
431 /**
432 * push succeeds if not full; throws ISE if full
433 */
434 public void testPush() {
435 try {
436 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
437 for (int i = 0; i < SIZE; ++i) {
438 Integer I = new Integer(i);
439 q.push(I);
440 assertEquals(I, q.peek());
441 }
442 assertEquals(0, q.remainingCapacity());
443 q.push(new Integer(SIZE));
444 shouldThrow();
445 } catch (IllegalStateException success) {}
446 }
447
448 /**
449 * peekFirst returns element inserted with push
450 */
451 public void testPushWithPeek() {
452 LinkedBlockingDeque q = populatedDeque(3);
453 q.pollLast();
454 q.push(four);
455 assertSame(four, q.peekFirst());
456 }
457
458 /**
459 * pop removes next element, or throws NSEE if empty
460 */
461 public void testPop() {
462 LinkedBlockingDeque q = populatedDeque(SIZE);
463 for (int i = 0; i < SIZE; ++i) {
464 assertEquals(i, q.pop());
465 }
466 try {
467 q.pop();
468 shouldThrow();
469 } catch (NoSuchElementException success) {}
470 }
471
472 /**
473 * Offer succeeds if not full; fails if full
474 */
475 public void testOffer() {
476 LinkedBlockingDeque q = new LinkedBlockingDeque(1);
477 assertTrue(q.offer(zero));
478 assertFalse(q.offer(one));
479 }
480
481 /**
482 * add succeeds if not full; throws ISE if full
483 */
484 public void testAdd() {
485 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
486 for (int i = 0; i < SIZE; ++i)
487 assertTrue(q.add(new Integer(i)));
488 assertEquals(0, q.remainingCapacity());
489 try {
490 q.add(new Integer(SIZE));
491 shouldThrow();
492 } catch (IllegalStateException success) {}
493 }
494
495 /**
496 * addAll(this) throws IAE
497 */
498 public void testAddAllSelf() {
499 LinkedBlockingDeque q = populatedDeque(SIZE);
500 try {
501 q.addAll(q);
502 shouldThrow();
503 } catch (IllegalArgumentException success) {}
504 }
505
506 /**
507 * addAll of a collection with any null elements throws NPE after
508 * possibly adding some elements
509 */
510 public void testAddAll3() {
511 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
512 Integer[] ints = new Integer[SIZE];
513 for (int i = 0; i < SIZE-1; ++i)
514 ints[i] = new Integer(i);
515 Collection<Integer> elements = Arrays.asList(ints);
516 try {
517 q.addAll(elements);
518 shouldThrow();
519 } catch (NullPointerException success) {}
520 }
521
522 /**
523 * addAll throws IllegalStateException if not enough room
524 */
525 public void testAddAll4() {
526 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE - 1);
527 Integer[] ints = new Integer[SIZE];
528 for (int i = 0; i < SIZE; ++i)
529 ints[i] = new Integer(i);
530 Collection<Integer> elements = Arrays.asList(ints);
531 try {
532 q.addAll(elements);
533 shouldThrow();
534 } catch (IllegalStateException success) {}
535 }
536
537 /**
538 * Deque contains all elements, in traversal order, of successful addAll
539 */
540 public void testAddAll5() {
541 Integer[] empty = new Integer[0];
542 Integer[] ints = new Integer[SIZE];
543 for (int i = 0; i < SIZE; ++i)
544 ints[i] = new Integer(i);
545 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
546 assertFalse(q.addAll(Arrays.asList(empty)));
547 assertTrue(q.addAll(Arrays.asList(ints)));
548 for (int i = 0; i < SIZE; ++i)
549 assertEquals(ints[i], q.poll());
550 }
551
552 /**
553 * all elements successfully put are contained
554 */
555 public void testPut() throws InterruptedException {
556 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
557 for (int i = 0; i < SIZE; ++i) {
558 Integer I = new Integer(i);
559 q.put(I);
560 assertTrue(q.contains(I));
561 }
562 assertEquals(0, q.remainingCapacity());
563 }
564
565 /**
566 * put blocks interruptibly if full
567 */
568 public void testBlockingPut() throws InterruptedException {
569 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
570 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
571 Thread t = newStartedThread(new CheckedRunnable() {
572 public void realRun() throws InterruptedException {
573 for (int i = 0; i < SIZE; ++i)
574 q.put(i);
575 assertEquals(SIZE, q.size());
576 assertEquals(0, q.remainingCapacity());
577
578 Thread.currentThread().interrupt();
579 try {
580 q.put(99);
581 shouldThrow();
582 } catch (InterruptedException success) {}
583 assertFalse(Thread.interrupted());
584
585 pleaseInterrupt.countDown();
586 try {
587 q.put(99);
588 shouldThrow();
589 } catch (InterruptedException success) {}
590 assertFalse(Thread.interrupted());
591 }});
592
593 await(pleaseInterrupt);
594 assertThreadStaysAlive(t);
595 t.interrupt();
596 awaitTermination(t);
597 assertEquals(SIZE, q.size());
598 assertEquals(0, q.remainingCapacity());
599 }
600
601 /**
602 * put blocks interruptibly waiting for take when full
603 */
604 public void testPutWithTake() throws InterruptedException {
605 final int capacity = 2;
606 final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
607 final CountDownLatch pleaseTake = new CountDownLatch(1);
608 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
609 Thread t = newStartedThread(new CheckedRunnable() {
610 public void realRun() throws InterruptedException {
611 for (int i = 0; i < capacity; i++)
612 q.put(i);
613 pleaseTake.countDown();
614 q.put(86);
615
616 pleaseInterrupt.countDown();
617 try {
618 q.put(99);
619 shouldThrow();
620 } catch (InterruptedException success) {}
621 assertFalse(Thread.interrupted());
622 }});
623
624 await(pleaseTake);
625 assertEquals(q.remainingCapacity(), 0);
626 assertEquals(0, q.take());
627
628 await(pleaseInterrupt);
629 assertThreadStaysAlive(t);
630 t.interrupt();
631 awaitTermination(t);
632 assertEquals(q.remainingCapacity(), 0);
633 }
634
635 /**
636 * timed offer times out if full and elements not taken
637 */
638 public void testTimedOffer() throws InterruptedException {
639 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
640 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
641 Thread t = newStartedThread(new CheckedRunnable() {
642 public void realRun() throws InterruptedException {
643 q.put(new Object());
644 q.put(new Object());
645 long startTime = System.nanoTime();
646 assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
647 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
648 pleaseInterrupt.countDown();
649 try {
650 q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
651 shouldThrow();
652 } catch (InterruptedException success) {}
653 }});
654
655 await(pleaseInterrupt);
656 assertThreadStaysAlive(t);
657 t.interrupt();
658 awaitTermination(t);
659 }
660
661 /**
662 * take retrieves elements in FIFO order
663 */
664 public void testTake() throws InterruptedException {
665 LinkedBlockingDeque q = populatedDeque(SIZE);
666 for (int i = 0; i < SIZE; ++i) {
667 assertEquals(i, q.take());
668 }
669 }
670
671 /**
672 * take removes existing elements until empty, then blocks interruptibly
673 */
674 public void testBlockingTake() throws InterruptedException {
675 final LinkedBlockingDeque q = populatedDeque(SIZE);
676 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
677 Thread t = newStartedThread(new CheckedRunnable() {
678 public void realRun() throws InterruptedException {
679 for (int i = 0; i < SIZE; ++i) {
680 assertEquals(i, q.take());
681 }
682
683 Thread.currentThread().interrupt();
684 try {
685 q.take();
686 shouldThrow();
687 } catch (InterruptedException success) {}
688 assertFalse(Thread.interrupted());
689
690 pleaseInterrupt.countDown();
691 try {
692 q.take();
693 shouldThrow();
694 } catch (InterruptedException success) {}
695 assertFalse(Thread.interrupted());
696 }});
697
698 await(pleaseInterrupt);
699 assertThreadStaysAlive(t);
700 t.interrupt();
701 awaitTermination(t);
702 }
703
704 /**
705 * poll succeeds unless empty
706 */
707 public void testPoll() {
708 LinkedBlockingDeque q = populatedDeque(SIZE);
709 for (int i = 0; i < SIZE; ++i) {
710 assertEquals(i, q.poll());
711 }
712 assertNull(q.poll());
713 }
714
715 /**
716 * timed poll with zero timeout succeeds when non-empty, else times out
717 */
718 public void testTimedPoll0() throws InterruptedException {
719 LinkedBlockingDeque q = populatedDeque(SIZE);
720 for (int i = 0; i < SIZE; ++i) {
721 assertEquals(i, q.poll(0, MILLISECONDS));
722 }
723 assertNull(q.poll(0, MILLISECONDS));
724 }
725
726 /**
727 * timed poll with nonzero timeout succeeds when non-empty, else times out
728 */
729 public void testTimedPoll() throws InterruptedException {
730 LinkedBlockingDeque q = populatedDeque(SIZE);
731 for (int i = 0; i < SIZE; ++i) {
732 long startTime = System.nanoTime();
733 assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
734 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
735 }
736 long startTime = System.nanoTime();
737 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
738 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
739 checkEmpty(q);
740 }
741
742 /**
743 * Interrupted timed poll throws InterruptedException instead of
744 * returning timeout status
745 */
746 public void testInterruptedTimedPoll() throws InterruptedException {
747 final BlockingQueue<Integer> q = populatedDeque(SIZE);
748 final CountDownLatch aboutToWait = new CountDownLatch(1);
749 Thread t = newStartedThread(new CheckedRunnable() {
750 public void realRun() throws InterruptedException {
751 for (int i = 0; i < SIZE; ++i) {
752 long t0 = System.nanoTime();
753 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
754 assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
755 }
756 long t0 = System.nanoTime();
757 aboutToWait.countDown();
758 try {
759 q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
760 shouldThrow();
761 } catch (InterruptedException success) {
762 assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
763 }
764 }});
765
766 aboutToWait.await();
767 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
768 t.interrupt();
769 awaitTermination(t, MEDIUM_DELAY_MS);
770 checkEmpty(q);
771 }
772
773 /**
774 * putFirst(null) throws NPE
775 */
776 public void testPutFirstNull() throws InterruptedException {
777 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
778 try {
779 q.putFirst(null);
780 shouldThrow();
781 } catch (NullPointerException success) {}
782 }
783
784 /**
785 * all elements successfully putFirst are contained
786 */
787 public void testPutFirst() throws InterruptedException {
788 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
789 for (int i = 0; i < SIZE; ++i) {
790 Integer I = new Integer(i);
791 q.putFirst(I);
792 assertTrue(q.contains(I));
793 }
794 assertEquals(0, q.remainingCapacity());
795 }
796
797 /**
798 * putFirst blocks interruptibly if full
799 */
800 public void testBlockingPutFirst() throws InterruptedException {
801 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
802 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
803 Thread t = newStartedThread(new CheckedRunnable() {
804 public void realRun() throws InterruptedException {
805 for (int i = 0; i < SIZE; ++i)
806 q.putFirst(i);
807 assertEquals(SIZE, q.size());
808 assertEquals(0, q.remainingCapacity());
809
810 Thread.currentThread().interrupt();
811 try {
812 q.putFirst(99);
813 shouldThrow();
814 } catch (InterruptedException success) {}
815 assertFalse(Thread.interrupted());
816
817 pleaseInterrupt.countDown();
818 try {
819 q.putFirst(99);
820 shouldThrow();
821 } catch (InterruptedException success) {}
822 assertFalse(Thread.interrupted());
823 }});
824
825 await(pleaseInterrupt);
826 assertThreadStaysAlive(t);
827 t.interrupt();
828 awaitTermination(t);
829 assertEquals(SIZE, q.size());
830 assertEquals(0, q.remainingCapacity());
831 }
832
833 /**
834 * putFirst blocks interruptibly waiting for take when full
835 */
836 public void testPutFirstWithTake() throws InterruptedException {
837 final int capacity = 2;
838 final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
839 final CountDownLatch pleaseTake = new CountDownLatch(1);
840 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
841 Thread t = newStartedThread(new CheckedRunnable() {
842 public void realRun() throws InterruptedException {
843 for (int i = 0; i < capacity; i++)
844 q.putFirst(i);
845 pleaseTake.countDown();
846 q.putFirst(86);
847
848 pleaseInterrupt.countDown();
849 try {
850 q.putFirst(99);
851 shouldThrow();
852 } catch (InterruptedException success) {}
853 assertFalse(Thread.interrupted());
854 }});
855
856 await(pleaseTake);
857 assertEquals(q.remainingCapacity(), 0);
858 assertEquals(capacity - 1, q.take());
859
860 await(pleaseInterrupt);
861 assertThreadStaysAlive(t);
862 t.interrupt();
863 awaitTermination(t);
864 assertEquals(q.remainingCapacity(), 0);
865 }
866
867 /**
868 * timed offerFirst times out if full and elements not taken
869 */
870 public void testTimedOfferFirst() throws InterruptedException {
871 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
872 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
873 Thread t = newStartedThread(new CheckedRunnable() {
874 public void realRun() throws InterruptedException {
875 q.putFirst(new Object());
876 q.putFirst(new Object());
877 long startTime = System.nanoTime();
878 assertFalse(q.offerFirst(new Object(), timeoutMillis(), MILLISECONDS));
879 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
880 pleaseInterrupt.countDown();
881 try {
882 q.offerFirst(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
883 shouldThrow();
884 } catch (InterruptedException success) {}
885 }});
886
887 await(pleaseInterrupt);
888 assertThreadStaysAlive(t);
889 t.interrupt();
890 awaitTermination(t);
891 }
892
893 /**
894 * take retrieves elements in FIFO order
895 */
896 public void testTakeFirst() throws InterruptedException {
897 LinkedBlockingDeque q = populatedDeque(SIZE);
898 for (int i = 0; i < SIZE; ++i) {
899 assertEquals(i, q.takeFirst());
900 }
901 }
902
903 /**
904 * takeFirst() blocks interruptibly when empty
905 */
906 public void testTakeFirstFromEmptyBlocksInterruptibly() {
907 final BlockingDeque q = new LinkedBlockingDeque();
908 final CountDownLatch threadStarted = new CountDownLatch(1);
909 Thread t = newStartedThread(new CheckedRunnable() {
910 public void realRun() {
911 threadStarted.countDown();
912 try {
913 q.takeFirst();
914 shouldThrow();
915 } catch (InterruptedException success) {}
916 assertFalse(Thread.interrupted());
917 }});
918
919 await(threadStarted);
920 assertThreadStaysAlive(t);
921 t.interrupt();
922 awaitTermination(t);
923 }
924
925 /**
926 * takeFirst() throws InterruptedException immediately if interrupted
927 * before waiting
928 */
929 public void testTakeFirstFromEmptyAfterInterrupt() {
930 final BlockingDeque q = new LinkedBlockingDeque();
931 Thread t = newStartedThread(new CheckedRunnable() {
932 public void realRun() {
933 Thread.currentThread().interrupt();
934 try {
935 q.takeFirst();
936 shouldThrow();
937 } catch (InterruptedException success) {}
938 assertFalse(Thread.interrupted());
939 }});
940
941 awaitTermination(t);
942 }
943
944 /**
945 * takeLast() blocks interruptibly when empty
946 */
947 public void testTakeLastFromEmptyBlocksInterruptibly() {
948 final BlockingDeque q = new LinkedBlockingDeque();
949 final CountDownLatch threadStarted = new CountDownLatch(1);
950 Thread t = newStartedThread(new CheckedRunnable() {
951 public void realRun() {
952 threadStarted.countDown();
953 try {
954 q.takeLast();
955 shouldThrow();
956 } catch (InterruptedException success) {}
957 assertFalse(Thread.interrupted());
958 }});
959
960 await(threadStarted);
961 assertThreadStaysAlive(t);
962 t.interrupt();
963 awaitTermination(t);
964 }
965
966 /**
967 * takeLast() throws InterruptedException immediately if interrupted
968 * before waiting
969 */
970 public void testTakeLastFromEmptyAfterInterrupt() {
971 final BlockingDeque q = new LinkedBlockingDeque();
972 Thread t = newStartedThread(new CheckedRunnable() {
973 public void realRun() {
974 Thread.currentThread().interrupt();
975 try {
976 q.takeLast();
977 shouldThrow();
978 } catch (InterruptedException success) {}
979 assertFalse(Thread.interrupted());
980 }});
981
982 awaitTermination(t);
983 }
984
985 /**
986 * takeFirst removes existing elements until empty, then blocks interruptibly
987 */
988 public void testBlockingTakeFirst() throws InterruptedException {
989 final LinkedBlockingDeque q = populatedDeque(SIZE);
990 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
991 Thread t = newStartedThread(new CheckedRunnable() {
992 public void realRun() throws InterruptedException {
993 for (int i = 0; i < SIZE; ++i) {
994 assertEquals(i, q.takeFirst());
995 }
996
997 Thread.currentThread().interrupt();
998 try {
999 q.takeFirst();
1000 shouldThrow();
1001 } catch (InterruptedException success) {}
1002 assertFalse(Thread.interrupted());
1003
1004 pleaseInterrupt.countDown();
1005 try {
1006 q.takeFirst();
1007 shouldThrow();
1008 } catch (InterruptedException success) {}
1009 assertFalse(Thread.interrupted());
1010 }});
1011
1012 await(pleaseInterrupt);
1013 assertThreadStaysAlive(t);
1014 t.interrupt();
1015 awaitTermination(t);
1016 }
1017
1018 /**
1019 * timed pollFirst with zero timeout succeeds when non-empty, else times out
1020 */
1021 public void testTimedPollFirst0() throws InterruptedException {
1022 LinkedBlockingDeque q = populatedDeque(SIZE);
1023 for (int i = 0; i < SIZE; ++i) {
1024 assertEquals(i, q.pollFirst(0, MILLISECONDS));
1025 }
1026 assertNull(q.pollFirst(0, MILLISECONDS));
1027 }
1028
1029 /**
1030 * timed pollFirst with nonzero timeout succeeds when non-empty, else times out
1031 */
1032 public void testTimedPollFirst() throws InterruptedException {
1033 LinkedBlockingDeque q = populatedDeque(SIZE);
1034 for (int i = 0; i < SIZE; ++i) {
1035 long startTime = System.nanoTime();
1036 assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1037 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1038 }
1039 long startTime = System.nanoTime();
1040 assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1041 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1042 checkEmpty(q);
1043 }
1044
1045 /**
1046 * Interrupted timed pollFirst throws InterruptedException instead of
1047 * returning timeout status
1048 */
1049 public void testInterruptedTimedPollFirst() throws InterruptedException {
1050 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1051 Thread t = newStartedThread(new CheckedRunnable() {
1052 public void realRun() throws InterruptedException {
1053 LinkedBlockingDeque q = populatedDeque(SIZE);
1054 for (int i = 0; i < SIZE; ++i) {
1055 assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1056 }
1057
1058 Thread.currentThread().interrupt();
1059 try {
1060 q.pollFirst(SMALL_DELAY_MS, MILLISECONDS);
1061 shouldThrow();
1062 } catch (InterruptedException success) {}
1063 assertFalse(Thread.interrupted());
1064
1065 pleaseInterrupt.countDown();
1066 try {
1067 q.pollFirst(SMALL_DELAY_MS, MILLISECONDS);
1068 shouldThrow();
1069 } catch (InterruptedException success) {}
1070 assertFalse(Thread.interrupted());
1071 }});
1072
1073 await(pleaseInterrupt);
1074 assertThreadStaysAlive(t);
1075 t.interrupt();
1076 awaitTermination(t);
1077 }
1078
1079 /**
1080 * timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds;
1081 * on interruption throws
1082 */
1083 public void testTimedPollFirstWithOfferFirst() throws InterruptedException {
1084 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1085 final CheckedBarrier barrier = new CheckedBarrier(2);
1086 Thread t = newStartedThread(new CheckedRunnable() {
1087 public void realRun() throws InterruptedException {
1088 long startTime = System.nanoTime();
1089 assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1090 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1091
1092 barrier.await();
1093
1094 assertSame(zero, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1095
1096 Thread.currentThread().interrupt();
1097 try {
1098 q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1099 shouldThrow();
1100 } catch (InterruptedException success) {}
1101
1102 barrier.await();
1103 try {
1104 q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1105 shouldThrow();
1106 } catch (InterruptedException success) {}
1107 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1108 }});
1109
1110 barrier.await();
1111 long startTime = System.nanoTime();
1112 assertTrue(q.offerFirst(zero, LONG_DELAY_MS, MILLISECONDS));
1113 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1114 barrier.await();
1115 assertThreadStaysAlive(t);
1116 t.interrupt();
1117 awaitTermination(t);
1118 }
1119
1120 /**
1121 * putLast(null) throws NPE
1122 */
1123 public void testPutLastNull() throws InterruptedException {
1124 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1125 try {
1126 q.putLast(null);
1127 shouldThrow();
1128 } catch (NullPointerException success) {}
1129 }
1130
1131 /**
1132 * all elements successfully putLast are contained
1133 */
1134 public void testPutLast() throws InterruptedException {
1135 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1136 for (int i = 0; i < SIZE; ++i) {
1137 Integer I = new Integer(i);
1138 q.putLast(I);
1139 assertTrue(q.contains(I));
1140 }
1141 assertEquals(0, q.remainingCapacity());
1142 }
1143
1144 /**
1145 * putLast blocks interruptibly if full
1146 */
1147 public void testBlockingPutLast() throws InterruptedException {
1148 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1149 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1150 Thread t = newStartedThread(new CheckedRunnable() {
1151 public void realRun() throws InterruptedException {
1152 for (int i = 0; i < SIZE; ++i)
1153 q.putLast(i);
1154 assertEquals(SIZE, q.size());
1155 assertEquals(0, q.remainingCapacity());
1156
1157 Thread.currentThread().interrupt();
1158 try {
1159 q.putLast(99);
1160 shouldThrow();
1161 } catch (InterruptedException success) {}
1162 assertFalse(Thread.interrupted());
1163
1164 pleaseInterrupt.countDown();
1165 try {
1166 q.putLast(99);
1167 shouldThrow();
1168 } catch (InterruptedException success) {}
1169 assertFalse(Thread.interrupted());
1170 }});
1171
1172 await(pleaseInterrupt);
1173 assertThreadStaysAlive(t);
1174 t.interrupt();
1175 awaitTermination(t);
1176 assertEquals(SIZE, q.size());
1177 assertEquals(0, q.remainingCapacity());
1178 }
1179
1180 /**
1181 * putLast blocks interruptibly waiting for take when full
1182 */
1183 public void testPutLastWithTake() throws InterruptedException {
1184 final int capacity = 2;
1185 final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
1186 final CountDownLatch pleaseTake = new CountDownLatch(1);
1187 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1188 Thread t = newStartedThread(new CheckedRunnable() {
1189 public void realRun() throws InterruptedException {
1190 for (int i = 0; i < capacity; i++)
1191 q.putLast(i);
1192 pleaseTake.countDown();
1193 q.putLast(86);
1194
1195 pleaseInterrupt.countDown();
1196 try {
1197 q.putLast(99);
1198 shouldThrow();
1199 } catch (InterruptedException success) {}
1200 assertFalse(Thread.interrupted());
1201 }});
1202
1203 await(pleaseTake);
1204 assertEquals(q.remainingCapacity(), 0);
1205 assertEquals(0, q.take());
1206
1207 await(pleaseInterrupt);
1208 assertThreadStaysAlive(t);
1209 t.interrupt();
1210 awaitTermination(t);
1211 assertEquals(q.remainingCapacity(), 0);
1212 }
1213
1214 /**
1215 * timed offerLast times out if full and elements not taken
1216 */
1217 public void testTimedOfferLast() throws InterruptedException {
1218 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1219 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1220 Thread t = newStartedThread(new CheckedRunnable() {
1221 public void realRun() throws InterruptedException {
1222 q.putLast(new Object());
1223 q.putLast(new Object());
1224 long startTime = System.nanoTime();
1225 assertFalse(q.offerLast(new Object(), timeoutMillis(), MILLISECONDS));
1226 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1227 pleaseInterrupt.countDown();
1228 try {
1229 q.offerLast(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
1230 shouldThrow();
1231 } catch (InterruptedException success) {}
1232 }});
1233
1234 await(pleaseInterrupt);
1235 assertThreadStaysAlive(t);
1236 t.interrupt();
1237 awaitTermination(t);
1238 }
1239
1240 /**
1241 * takeLast retrieves elements in FIFO order
1242 */
1243 public void testTakeLast() throws InterruptedException {
1244 LinkedBlockingDeque q = populatedDeque(SIZE);
1245 for (int i = 0; i < SIZE; ++i) {
1246 assertEquals(SIZE-i-1, q.takeLast());
1247 }
1248 }
1249
1250 /**
1251 * takeLast removes existing elements until empty, then blocks interruptibly
1252 */
1253 public void testBlockingTakeLast() throws InterruptedException {
1254 final LinkedBlockingDeque q = populatedDeque(SIZE);
1255 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1256 Thread t = newStartedThread(new CheckedRunnable() {
1257 public void realRun() throws InterruptedException {
1258 for (int i = 0; i < SIZE; ++i) {
1259 assertEquals(SIZE-i-1, q.takeLast());
1260 }
1261
1262 Thread.currentThread().interrupt();
1263 try {
1264 q.takeLast();
1265 shouldThrow();
1266 } catch (InterruptedException success) {}
1267 assertFalse(Thread.interrupted());
1268
1269 pleaseInterrupt.countDown();
1270 try {
1271 q.takeLast();
1272 shouldThrow();
1273 } catch (InterruptedException success) {}
1274 assertFalse(Thread.interrupted());
1275 }});
1276
1277 await(pleaseInterrupt);
1278 assertThreadStaysAlive(t);
1279 t.interrupt();
1280 awaitTermination(t);
1281 }
1282
1283 /**
1284 * timed pollLast with zero timeout succeeds when non-empty, else times out
1285 */
1286 public void testTimedPollLast0() throws InterruptedException {
1287 LinkedBlockingDeque q = populatedDeque(SIZE);
1288 for (int i = 0; i < SIZE; ++i) {
1289 assertEquals(SIZE-i-1, q.pollLast(0, MILLISECONDS));
1290 }
1291 assertNull(q.pollLast(0, MILLISECONDS));
1292 }
1293
1294 /**
1295 * timed pollLast with nonzero timeout succeeds when non-empty, else times out
1296 */
1297 public void testTimedPollLast() throws InterruptedException {
1298 LinkedBlockingDeque q = populatedDeque(SIZE);
1299 for (int i = 0; i < SIZE; ++i) {
1300 long startTime = System.nanoTime();
1301 assertEquals(SIZE-i-1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1302 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1303 }
1304 long startTime = System.nanoTime();
1305 assertNull(q.pollLast(timeoutMillis(), MILLISECONDS));
1306 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1307 checkEmpty(q);
1308 }
1309
1310 /**
1311 * Interrupted timed pollLast throws InterruptedException instead of
1312 * returning timeout status
1313 */
1314 public void testInterruptedTimedPollLast() throws InterruptedException {
1315 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1316 Thread t = newStartedThread(new CheckedRunnable() {
1317 public void realRun() throws InterruptedException {
1318 LinkedBlockingDeque q = populatedDeque(SIZE);
1319 for (int i = 0; i < SIZE; ++i) {
1320 assertEquals(SIZE-i-1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1321 }
1322
1323 Thread.currentThread().interrupt();
1324 try {
1325 q.pollLast(LONG_DELAY_MS, MILLISECONDS);
1326 shouldThrow();
1327 } catch (InterruptedException success) {}
1328 assertFalse(Thread.interrupted());
1329
1330 pleaseInterrupt.countDown();
1331 try {
1332 q.pollLast(LONG_DELAY_MS, MILLISECONDS);
1333 shouldThrow();
1334 } catch (InterruptedException success) {}
1335 assertFalse(Thread.interrupted());
1336 }});
1337
1338 await(pleaseInterrupt);
1339 assertThreadStaysAlive(t);
1340 t.interrupt();
1341 awaitTermination(t);
1342 }
1343
1344 /**
1345 * timed poll before a delayed offerLast fails; after offerLast succeeds;
1346 * on interruption throws
1347 */
1348 public void testTimedPollWithOfferLast() throws InterruptedException {
1349 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1350 final CheckedBarrier barrier = new CheckedBarrier(2);
1351 Thread t = newStartedThread(new CheckedRunnable() {
1352 public void realRun() throws InterruptedException {
1353 long startTime = System.nanoTime();
1354 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
1355 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1356
1357 barrier.await();
1358
1359 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
1360
1361 Thread.currentThread().interrupt();
1362 try {
1363 q.poll(LONG_DELAY_MS, MILLISECONDS);
1364 shouldThrow();
1365 } catch (InterruptedException success) {}
1366 assertFalse(Thread.interrupted());
1367
1368 barrier.await();
1369 try {
1370 q.poll(LONG_DELAY_MS, MILLISECONDS);
1371 shouldThrow();
1372 } catch (InterruptedException success) {}
1373 assertFalse(Thread.interrupted());
1374 }});
1375
1376 barrier.await();
1377 long startTime = System.nanoTime();
1378 assertTrue(q.offerLast(zero, LONG_DELAY_MS, MILLISECONDS));
1379 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1380
1381 barrier.await();
1382 assertThreadStaysAlive(t);
1383 t.interrupt();
1384 awaitTermination(t);
1385 }
1386
1387 /**
1388 * element returns next element, or throws NSEE if empty
1389 */
1390 public void testElement() {
1391 LinkedBlockingDeque q = populatedDeque(SIZE);
1392 for (int i = 0; i < SIZE; ++i) {
1393 assertEquals(i, q.element());
1394 q.poll();
1395 }
1396 try {
1397 q.element();
1398 shouldThrow();
1399 } catch (NoSuchElementException success) {}
1400 }
1401
1402 /**
1403 * remove(x) removes x and returns true if present
1404 */
1405 public void testRemoveElement() {
1406 LinkedBlockingDeque q = populatedDeque(SIZE);
1407 for (int i = 1; i < SIZE; i+=2) {
1408 assertTrue(q.contains(i));
1409 assertTrue(q.remove(i));
1410 assertFalse(q.contains(i));
1411 assertTrue(q.contains(i-1));
1412 }
1413 for (int i = 0; i < SIZE; i+=2) {
1414 assertTrue(q.contains(i));
1415 assertTrue(q.remove(i));
1416 assertFalse(q.contains(i));
1417 assertFalse(q.remove(i+1));
1418 assertFalse(q.contains(i+1));
1419 }
1420 assertTrue(q.isEmpty());
1421 }
1422
1423 /**
1424 * contains(x) reports true when elements added but not yet removed
1425 */
1426 public void testContains() {
1427 LinkedBlockingDeque q = populatedDeque(SIZE);
1428 for (int i = 0; i < SIZE; ++i) {
1429 assertTrue(q.contains(new Integer(i)));
1430 q.poll();
1431 assertFalse(q.contains(new Integer(i)));
1432 }
1433 }
1434
1435 /**
1436 * clear removes all elements
1437 */
1438 public void testClear() {
1439 LinkedBlockingDeque q = populatedDeque(SIZE);
1440 q.clear();
1441 assertTrue(q.isEmpty());
1442 assertEquals(0, q.size());
1443 assertEquals(SIZE, q.remainingCapacity());
1444 q.add(one);
1445 assertFalse(q.isEmpty());
1446 assertTrue(q.contains(one));
1447 q.clear();
1448 assertTrue(q.isEmpty());
1449 }
1450
1451 /**
1452 * containsAll(c) is true when c contains a subset of elements
1453 */
1454 public void testContainsAll() {
1455 LinkedBlockingDeque q = populatedDeque(SIZE);
1456 LinkedBlockingDeque p = new LinkedBlockingDeque(SIZE);
1457 for (int i = 0; i < SIZE; ++i) {
1458 assertTrue(q.containsAll(p));
1459 assertFalse(p.containsAll(q));
1460 p.add(new Integer(i));
1461 }
1462 assertTrue(p.containsAll(q));
1463 }
1464
1465 /**
1466 * retainAll(c) retains only those elements of c and reports true if changed
1467 */
1468 public void testRetainAll() {
1469 LinkedBlockingDeque q = populatedDeque(SIZE);
1470 LinkedBlockingDeque p = populatedDeque(SIZE);
1471 for (int i = 0; i < SIZE; ++i) {
1472 boolean changed = q.retainAll(p);
1473 if (i == 0)
1474 assertFalse(changed);
1475 else
1476 assertTrue(changed);
1477
1478 assertTrue(q.containsAll(p));
1479 assertEquals(SIZE-i, q.size());
1480 p.remove();
1481 }
1482 }
1483
1484 /**
1485 * removeAll(c) removes only those elements of c and reports true if changed
1486 */
1487 public void testRemoveAll() {
1488 for (int i = 1; i < SIZE; ++i) {
1489 LinkedBlockingDeque q = populatedDeque(SIZE);
1490 LinkedBlockingDeque p = populatedDeque(i);
1491 assertTrue(q.removeAll(p));
1492 assertEquals(SIZE-i, q.size());
1493 for (int j = 0; j < i; ++j) {
1494 Integer I = (Integer)(p.remove());
1495 assertFalse(q.contains(I));
1496 }
1497 }
1498 }
1499
1500 /**
1501 * toArray contains all elements in FIFO order
1502 */
1503 public void testToArray() throws InterruptedException{
1504 LinkedBlockingDeque q = populatedDeque(SIZE);
1505 Object[] o = q.toArray();
1506 for (int i = 0; i < o.length; i++)
1507 assertSame(o[i], q.poll());
1508 }
1509
1510 /**
1511 * toArray(a) contains all elements in FIFO order
1512 */
1513 public void testToArray2() {
1514 LinkedBlockingDeque<Integer> q = populatedDeque(SIZE);
1515 Integer[] ints = new Integer[SIZE];
1516 Integer[] array = q.toArray(ints);
1517 assertSame(ints, array);
1518 for (int i = 0; i < ints.length; i++)
1519 assertSame(ints[i], q.remove());
1520 }
1521
1522 /**
1523 * toArray(incompatible array type) throws ArrayStoreException
1524 */
1525 public void testToArray1_BadArg() {
1526 LinkedBlockingDeque q = populatedDeque(SIZE);
1527 try {
1528 q.toArray(new String[10]);
1529 shouldThrow();
1530 } catch (ArrayStoreException success) {}
1531 }
1532
1533 /**
1534 * iterator iterates through all elements
1535 */
1536 public void testIterator() throws InterruptedException {
1537 LinkedBlockingDeque q = populatedDeque(SIZE);
1538 Iterator it = q.iterator();
1539 while (it.hasNext()) {
1540 assertEquals(it.next(), q.take());
1541 }
1542 }
1543
1544 /**
1545 * iterator.remove removes current element
1546 */
1547 public void testIteratorRemove() {
1548 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1549 q.add(two);
1550 q.add(one);
1551 q.add(three);
1552
1553 Iterator it = q.iterator();
1554 it.next();
1555 it.remove();
1556
1557 it = q.iterator();
1558 assertSame(it.next(), one);
1559 assertSame(it.next(), three);
1560 assertFalse(it.hasNext());
1561 }
1562
1563 /**
1564 * iterator ordering is FIFO
1565 */
1566 public void testIteratorOrdering() {
1567 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1568 q.add(one);
1569 q.add(two);
1570 q.add(three);
1571 assertEquals(0, q.remainingCapacity());
1572 int k = 0;
1573 for (Iterator it = q.iterator(); it.hasNext();) {
1574 assertEquals(++k, it.next());
1575 }
1576 assertEquals(3, k);
1577 }
1578
1579 /**
1580 * Modifications do not cause iterators to fail
1581 */
1582 public void testWeaklyConsistentIteration() {
1583 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1584 q.add(one);
1585 q.add(two);
1586 q.add(three);
1587 for (Iterator it = q.iterator(); it.hasNext();) {
1588 q.remove();
1589 it.next();
1590 }
1591 assertEquals(0, q.size());
1592 }
1593
1594 /**
1595 * Descending iterator iterates through all elements
1596 */
1597 public void testDescendingIterator() {
1598 LinkedBlockingDeque q = populatedDeque(SIZE);
1599 int i = 0;
1600 Iterator it = q.descendingIterator();
1601 while (it.hasNext()) {
1602 assertTrue(q.contains(it.next()));
1603 ++i;
1604 }
1605 assertEquals(i, SIZE);
1606 assertFalse(it.hasNext());
1607 try {
1608 it.next();
1609 shouldThrow();
1610 } catch (NoSuchElementException success) {}
1611 }
1612
1613 /**
1614 * Descending iterator ordering is reverse FIFO
1615 */
1616 public void testDescendingIteratorOrdering() {
1617 final LinkedBlockingDeque q = new LinkedBlockingDeque();
1618 for (int iters = 0; iters < 100; ++iters) {
1619 q.add(new Integer(3));
1620 q.add(new Integer(2));
1621 q.add(new Integer(1));
1622 int k = 0;
1623 for (Iterator it = q.descendingIterator(); it.hasNext();) {
1624 assertEquals(++k, it.next());
1625 }
1626
1627 assertEquals(3, k);
1628 q.remove();
1629 q.remove();
1630 q.remove();
1631 }
1632 }
1633
1634 /**
1635 * descendingIterator.remove removes current element
1636 */
1637 public void testDescendingIteratorRemove() {
1638 final LinkedBlockingDeque q = new LinkedBlockingDeque();
1639 for (int iters = 0; iters < 100; ++iters) {
1640 q.add(new Integer(3));
1641 q.add(new Integer(2));
1642 q.add(new Integer(1));
1643 Iterator it = q.descendingIterator();
1644 assertEquals(it.next(), new Integer(1));
1645 it.remove();
1646 assertEquals(it.next(), new Integer(2));
1647 it = q.descendingIterator();
1648 assertEquals(it.next(), new Integer(2));
1649 assertEquals(it.next(), new Integer(3));
1650 it.remove();
1651 assertFalse(it.hasNext());
1652 q.remove();
1653 }
1654 }
1655
1656 /**
1657 * toString contains toStrings of elements
1658 */
1659 public void testToString() {
1660 LinkedBlockingDeque q = populatedDeque(SIZE);
1661 String s = q.toString();
1662 for (int i = 0; i < SIZE; ++i) {
1663 assertTrue(s.contains(String.valueOf(i)));
1664 }
1665 }
1666
1667 /**
1668 * offer transfers elements across Executor tasks
1669 */
1670 public void testOfferInExecutor() {
1671 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1672 q.add(one);
1673 q.add(two);
1674 ExecutorService executor = Executors.newFixedThreadPool(2);
1675 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1676 executor.execute(new CheckedRunnable() {
1677 public void realRun() throws InterruptedException {
1678 assertFalse(q.offer(three));
1679 threadsStarted.await();
1680 assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
1681 assertEquals(0, q.remainingCapacity());
1682 }});
1683
1684 executor.execute(new CheckedRunnable() {
1685 public void realRun() throws InterruptedException {
1686 threadsStarted.await();
1687 assertSame(one, q.take());
1688 }});
1689
1690 joinPool(executor);
1691 }
1692
1693 /**
1694 * timed poll retrieves elements across Executor threads
1695 */
1696 public void testPollInExecutor() {
1697 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1698 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1699 ExecutorService executor = Executors.newFixedThreadPool(2);
1700 executor.execute(new CheckedRunnable() {
1701 public void realRun() throws InterruptedException {
1702 assertNull(q.poll());
1703 threadsStarted.await();
1704 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
1705 checkEmpty(q);
1706 }});
1707
1708 executor.execute(new CheckedRunnable() {
1709 public void realRun() throws InterruptedException {
1710 threadsStarted.await();
1711 q.put(one);
1712 }});
1713
1714 joinPool(executor);
1715 }
1716
1717 /**
1718 * A deserialized serialized deque has same elements in same order
1719 */
1720 public void testSerialization() throws Exception {
1721 Queue x = populatedDeque(SIZE);
1722 Queue y = serialClone(x);
1723
1724 assertTrue(x != y);
1725 assertEquals(x.size(), y.size());
1726 assertEquals(x.toString(), y.toString());
1727 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
1728 while (!x.isEmpty()) {
1729 assertFalse(y.isEmpty());
1730 assertEquals(x.remove(), y.remove());
1731 }
1732 assertTrue(y.isEmpty());
1733 }
1734
1735 /**
1736 * drainTo(c) empties deque into another collection c
1737 */
1738 public void testDrainTo() {
1739 LinkedBlockingDeque q = populatedDeque(SIZE);
1740 ArrayList l = new ArrayList();
1741 q.drainTo(l);
1742 assertEquals(q.size(), 0);
1743 assertEquals(l.size(), SIZE);
1744 for (int i = 0; i < SIZE; ++i)
1745 assertEquals(l.get(i), new Integer(i));
1746 q.add(zero);
1747 q.add(one);
1748 assertFalse(q.isEmpty());
1749 assertTrue(q.contains(zero));
1750 assertTrue(q.contains(one));
1751 l.clear();
1752 q.drainTo(l);
1753 assertEquals(q.size(), 0);
1754 assertEquals(l.size(), 2);
1755 for (int i = 0; i < 2; ++i)
1756 assertEquals(l.get(i), new Integer(i));
1757 }
1758
1759 /**
1760 * drainTo empties full deque, unblocking a waiting put.
1761 */
1762 public void testDrainToWithActivePut() throws InterruptedException {
1763 final LinkedBlockingDeque q = populatedDeque(SIZE);
1764 Thread t = new Thread(new CheckedRunnable() {
1765 public void realRun() throws InterruptedException {
1766 q.put(new Integer(SIZE+1));
1767 }});
1768
1769 t.start();
1770 ArrayList l = new ArrayList();
1771 q.drainTo(l);
1772 assertTrue(l.size() >= SIZE);
1773 for (int i = 0; i < SIZE; ++i)
1774 assertEquals(l.get(i), new Integer(i));
1775 t.join();
1776 assertTrue(q.size() + l.size() >= SIZE);
1777 }
1778
1779 /**
1780 * drainTo(c, n) empties first min(n, size) elements of queue into c
1781 */
1782 public void testDrainToN() {
1783 LinkedBlockingDeque q = new LinkedBlockingDeque();
1784 for (int i = 0; i < SIZE + 2; ++i) {
1785 for (int j = 0; j < SIZE; j++)
1786 assertTrue(q.offer(new Integer(j)));
1787 ArrayList l = new ArrayList();
1788 q.drainTo(l, i);
1789 int k = (i < SIZE) ? i : SIZE;
1790 assertEquals(l.size(), k);
1791 assertEquals(q.size(), SIZE-k);
1792 for (int j = 0; j < k; ++j)
1793 assertEquals(l.get(j), new Integer(j));
1794 while (q.poll() != null) ;
1795 }
1796 }
1797
1798 }