ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.61
Committed: Sun Oct 4 18:49:02 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.60: +32 -32 lines
Log Message:
PoolCleaning

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