ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.84
Committed: Sun Aug 11 22:29:27 2019 UTC (4 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.83: +40 -30 lines
Log Message:
more assertions; more interleavings

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