ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.86
Committed: Thu Sep 5 21:11:13 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.85: +3 -12 lines
Log Message:
testInterruptedTimedPoll: rely on awaitTermination together with LONGER_DELAY_MS

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(), LONGER_DELAY_MS, MILLISECONDS);
680 shouldThrow();
681 } catch (InterruptedException success) {}
682 assertFalse(Thread.interrupted());
683 }});
684
685 await(pleaseInterrupt);
686 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
687 t.interrupt();
688 awaitTermination(t);
689 }
690
691 /**
692 * take retrieves elements in FIFO order
693 */
694 public void testTake() throws InterruptedException {
695 LinkedBlockingDeque q = populatedDeque(SIZE);
696 for (int i = 0; i < SIZE; ++i) {
697 assertEquals(i, q.take());
698 }
699 }
700
701 /**
702 * take removes existing elements until empty, then blocks interruptibly
703 */
704 public void testBlockingTake() throws InterruptedException {
705 final LinkedBlockingDeque q = populatedDeque(SIZE);
706 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
707 Thread t = newStartedThread(new CheckedRunnable() {
708 public void realRun() throws InterruptedException {
709 for (int i = 0; i < SIZE; i++) assertEquals(i, q.take());
710
711 Thread.currentThread().interrupt();
712 try {
713 q.take();
714 shouldThrow();
715 } catch (InterruptedException success) {}
716 assertFalse(Thread.interrupted());
717
718 pleaseInterrupt.countDown();
719 try {
720 q.take();
721 shouldThrow();
722 } catch (InterruptedException success) {}
723 assertFalse(Thread.interrupted());
724 }});
725
726 await(pleaseInterrupt);
727 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
728 t.interrupt();
729 awaitTermination(t);
730 }
731
732 /**
733 * poll succeeds unless empty
734 */
735 public void testPoll() {
736 LinkedBlockingDeque q = populatedDeque(SIZE);
737 for (int i = 0; i < SIZE; ++i) {
738 assertEquals(i, q.poll());
739 }
740 assertNull(q.poll());
741 }
742
743 /**
744 * timed poll with zero timeout succeeds when non-empty, else times out
745 */
746 public void testTimedPoll0() throws InterruptedException {
747 LinkedBlockingDeque q = populatedDeque(SIZE);
748 for (int i = 0; i < SIZE; ++i) {
749 assertEquals(i, q.poll(0, MILLISECONDS));
750 }
751 assertNull(q.poll(0, MILLISECONDS));
752 }
753
754 /**
755 * timed poll with nonzero timeout succeeds when non-empty, else times out
756 */
757 public void testTimedPoll() throws InterruptedException {
758 LinkedBlockingDeque q = populatedDeque(SIZE);
759 for (int i = 0; i < SIZE; ++i) {
760 long startTime = System.nanoTime();
761 assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
762 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
763 }
764 long startTime = System.nanoTime();
765 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
766 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
767 checkEmpty(q);
768 }
769
770 /**
771 * Interrupted timed poll throws InterruptedException instead of
772 * returning timeout status
773 */
774 public void testInterruptedTimedPoll() throws InterruptedException {
775 final BlockingQueue<Integer> q = populatedDeque(SIZE);
776 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
777 Thread t = newStartedThread(new CheckedRunnable() {
778 public void realRun() throws InterruptedException {
779 for (int i = 0; i < SIZE; i++)
780 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
781
782 Thread.currentThread().interrupt();
783 try {
784 q.poll(randomTimeout(), randomTimeUnit());
785 shouldThrow();
786 } catch (InterruptedException success) {}
787 assertFalse(Thread.interrupted());
788
789 pleaseInterrupt.countDown();
790 try {
791 q.poll(LONGER_DELAY_MS, MILLISECONDS);
792 shouldThrow();
793 } catch (InterruptedException success) {}
794 assertFalse(Thread.interrupted());
795 }});
796
797 await(pleaseInterrupt);
798 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
799 t.interrupt();
800 awaitTermination(t);
801 checkEmpty(q);
802 }
803
804 /**
805 * putFirst(null) throws NPE
806 */
807 public void testPutFirstNull() throws InterruptedException {
808 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
809 try {
810 q.putFirst(null);
811 shouldThrow();
812 } catch (NullPointerException success) {}
813 }
814
815 /**
816 * all elements successfully putFirst are contained
817 */
818 public void testPutFirst() throws InterruptedException {
819 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
820 for (int i = 0; i < SIZE; ++i) {
821 Integer x = new Integer(i);
822 q.putFirst(x);
823 assertTrue(q.contains(x));
824 }
825 assertEquals(0, q.remainingCapacity());
826 }
827
828 /**
829 * putFirst blocks interruptibly if full
830 */
831 public void testBlockingPutFirst() throws InterruptedException {
832 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
833 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
834 Thread t = newStartedThread(new CheckedRunnable() {
835 public void realRun() throws InterruptedException {
836 for (int i = 0; i < SIZE; ++i)
837 q.putFirst(i);
838 assertEquals(SIZE, q.size());
839 assertEquals(0, q.remainingCapacity());
840
841 Thread.currentThread().interrupt();
842 try {
843 q.putFirst(99);
844 shouldThrow();
845 } catch (InterruptedException success) {}
846 assertFalse(Thread.interrupted());
847
848 pleaseInterrupt.countDown();
849 try {
850 q.putFirst(99);
851 shouldThrow();
852 } catch (InterruptedException success) {}
853 assertFalse(Thread.interrupted());
854 }});
855
856 await(pleaseInterrupt);
857 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
858 t.interrupt();
859 awaitTermination(t);
860 assertEquals(SIZE, q.size());
861 assertEquals(0, q.remainingCapacity());
862 }
863
864 /**
865 * putFirst blocks interruptibly waiting for take when full
866 */
867 public void testPutFirstWithTake() throws InterruptedException {
868 final int capacity = 2;
869 final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
870 final CountDownLatch pleaseTake = new CountDownLatch(1);
871 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
872 Thread t = newStartedThread(new CheckedRunnable() {
873 public void realRun() throws InterruptedException {
874 for (int i = 0; i < capacity; i++)
875 q.putFirst(i);
876 pleaseTake.countDown();
877 q.putFirst(86);
878
879 pleaseInterrupt.countDown();
880 try {
881 q.putFirst(99);
882 shouldThrow();
883 } catch (InterruptedException success) {}
884 assertFalse(Thread.interrupted());
885 }});
886
887 await(pleaseTake);
888 assertEquals(0, q.remainingCapacity());
889 assertEquals(capacity - 1, q.take());
890
891 await(pleaseInterrupt);
892 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
893 t.interrupt();
894 awaitTermination(t);
895 assertEquals(0, q.remainingCapacity());
896 }
897
898 /**
899 * timed offerFirst times out if full and elements not taken
900 */
901 public void testTimedOfferFirst() {
902 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
903 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
904 Thread t = newStartedThread(new CheckedRunnable() {
905 public void realRun() throws InterruptedException {
906 q.putFirst(new Object());
907 q.putFirst(new Object());
908 long startTime = System.nanoTime();
909
910 assertFalse(q.offerFirst(new Object(), timeoutMillis(), MILLISECONDS));
911 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
912
913 Thread.currentThread().interrupt();
914 try {
915 q.offerFirst(new Object(), randomTimeout(), randomTimeUnit());
916 shouldThrow();
917 } catch (InterruptedException success) {}
918 assertFalse(Thread.interrupted());
919
920 pleaseInterrupt.countDown();
921 try {
922 q.offerFirst(new Object(), LONG_DELAY_MS, MILLISECONDS);
923 shouldThrow();
924 } catch (InterruptedException success) {}
925 assertFalse(Thread.interrupted());
926
927 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
928 }});
929
930 await(pleaseInterrupt);
931 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
932 t.interrupt();
933 awaitTermination(t);
934 }
935
936 /**
937 * take retrieves elements in FIFO order
938 */
939 public void testTakeFirst() throws InterruptedException {
940 LinkedBlockingDeque q = populatedDeque(SIZE);
941 for (int i = 0; i < SIZE; ++i) {
942 assertEquals(i, q.takeFirst());
943 }
944 }
945
946 /**
947 * takeFirst() blocks interruptibly when empty
948 */
949 public void testTakeFirstFromEmptyBlocksInterruptibly() {
950 final BlockingDeque q = new LinkedBlockingDeque();
951 final CountDownLatch threadStarted = new CountDownLatch(1);
952 Thread t = newStartedThread(new CheckedRunnable() {
953 public void realRun() {
954 threadStarted.countDown();
955 try {
956 q.takeFirst();
957 shouldThrow();
958 } catch (InterruptedException success) {}
959 assertFalse(Thread.interrupted());
960 }});
961
962 await(threadStarted);
963 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
964 t.interrupt();
965 awaitTermination(t);
966 }
967
968 /**
969 * takeFirst() throws InterruptedException immediately if interrupted
970 * before waiting
971 */
972 public void testTakeFirstFromEmptyAfterInterrupt() {
973 final BlockingDeque q = new LinkedBlockingDeque();
974 Thread t = newStartedThread(new CheckedRunnable() {
975 public void realRun() {
976 Thread.currentThread().interrupt();
977 try {
978 q.takeFirst();
979 shouldThrow();
980 } catch (InterruptedException success) {}
981 assertFalse(Thread.interrupted());
982 }});
983
984 awaitTermination(t);
985 }
986
987 /**
988 * takeLast() blocks interruptibly when empty
989 */
990 public void testTakeLastFromEmptyBlocksInterruptibly() {
991 final BlockingDeque q = new LinkedBlockingDeque();
992 final CountDownLatch threadStarted = new CountDownLatch(1);
993 Thread t = newStartedThread(new CheckedRunnable() {
994 public void realRun() {
995 threadStarted.countDown();
996 try {
997 q.takeLast();
998 shouldThrow();
999 } catch (InterruptedException success) {}
1000 assertFalse(Thread.interrupted());
1001 }});
1002
1003 await(threadStarted);
1004 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1005 t.interrupt();
1006 awaitTermination(t);
1007 }
1008
1009 /**
1010 * takeLast() throws InterruptedException immediately if interrupted
1011 * before waiting
1012 */
1013 public void testTakeLastFromEmptyAfterInterrupt() {
1014 final BlockingDeque q = new LinkedBlockingDeque();
1015 Thread t = newStartedThread(new CheckedRunnable() {
1016 public void realRun() {
1017 Thread.currentThread().interrupt();
1018 try {
1019 q.takeLast();
1020 shouldThrow();
1021 } catch (InterruptedException success) {}
1022 assertFalse(Thread.interrupted());
1023 }});
1024
1025 awaitTermination(t);
1026 }
1027
1028 /**
1029 * takeFirst removes existing elements until empty, then blocks interruptibly
1030 */
1031 public void testBlockingTakeFirst() throws InterruptedException {
1032 final LinkedBlockingDeque q = populatedDeque(SIZE);
1033 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1034 Thread t = newStartedThread(new CheckedRunnable() {
1035 public void realRun() throws InterruptedException {
1036 for (int i = 0; i < SIZE; i++) assertEquals(i, q.takeFirst());
1037
1038 Thread.currentThread().interrupt();
1039 try {
1040 q.takeFirst();
1041 shouldThrow();
1042 } catch (InterruptedException success) {}
1043 assertFalse(Thread.interrupted());
1044
1045 pleaseInterrupt.countDown();
1046 try {
1047 q.takeFirst();
1048 shouldThrow();
1049 } catch (InterruptedException success) {}
1050 assertFalse(Thread.interrupted());
1051 }});
1052
1053 await(pleaseInterrupt);
1054 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1055 t.interrupt();
1056 awaitTermination(t);
1057 }
1058
1059 /**
1060 * timed pollFirst with zero timeout succeeds when non-empty, else times out
1061 */
1062 public void testTimedPollFirst0() throws InterruptedException {
1063 LinkedBlockingDeque q = populatedDeque(SIZE);
1064 for (int i = 0; i < SIZE; ++i) {
1065 assertEquals(i, q.pollFirst(0, MILLISECONDS));
1066 }
1067 assertNull(q.pollFirst(0, MILLISECONDS));
1068 }
1069
1070 /**
1071 * timed pollFirst with nonzero timeout succeeds when non-empty, else times out
1072 */
1073 public void testTimedPollFirst() throws InterruptedException {
1074 LinkedBlockingDeque q = populatedDeque(SIZE);
1075 for (int i = 0; i < SIZE; ++i) {
1076 long startTime = System.nanoTime();
1077 assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1078 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1079 }
1080 long startTime = System.nanoTime();
1081 assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1082 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1083 checkEmpty(q);
1084 }
1085
1086 /**
1087 * Interrupted timed pollFirst throws InterruptedException instead of
1088 * returning timeout status
1089 */
1090 public void testInterruptedTimedPollFirst() throws InterruptedException {
1091 final LinkedBlockingDeque q = populatedDeque(SIZE);
1092 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1093 Thread t = newStartedThread(new CheckedRunnable() {
1094 public void realRun() throws InterruptedException {
1095 for (int i = 0; i < SIZE; i++)
1096 assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1097
1098 Thread.currentThread().interrupt();
1099 try {
1100 q.pollFirst(randomTimeout(), randomTimeUnit());
1101 shouldThrow();
1102 } catch (InterruptedException success) {}
1103 assertFalse(Thread.interrupted());
1104
1105 pleaseInterrupt.countDown();
1106 try {
1107 q.pollFirst(LONGER_DELAY_MS, MILLISECONDS);
1108 shouldThrow();
1109 } catch (InterruptedException success) {}
1110 assertFalse(Thread.interrupted());
1111 }});
1112
1113 await(pleaseInterrupt);
1114 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1115 t.interrupt();
1116 awaitTermination(t);
1117 }
1118
1119 /**
1120 * timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds;
1121 * on interruption throws
1122 */
1123 public void testTimedPollFirstWithOfferFirst() throws InterruptedException {
1124 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1125 final CheckedBarrier barrier = new CheckedBarrier(2);
1126 Thread t = newStartedThread(new CheckedRunnable() {
1127 public void realRun() throws InterruptedException {
1128 long startTime = System.nanoTime();
1129 assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1130 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1131
1132 barrier.await();
1133
1134 assertSame(zero, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1135
1136 Thread.currentThread().interrupt();
1137 try {
1138 q.pollFirst(randomTimeout(), randomTimeUnit());
1139 shouldThrow();
1140 } catch (InterruptedException success) {}
1141
1142 barrier.await();
1143 try {
1144 q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1145 shouldThrow();
1146 } catch (InterruptedException success) {}
1147 assertFalse(Thread.interrupted());
1148
1149 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1150 }});
1151
1152 barrier.await();
1153 long startTime = System.nanoTime();
1154 assertTrue(q.offerFirst(zero, LONG_DELAY_MS, MILLISECONDS));
1155 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1156 barrier.await();
1157 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1158 t.interrupt();
1159 awaitTermination(t);
1160 }
1161
1162 /**
1163 * putLast(null) throws NPE
1164 */
1165 public void testPutLastNull() throws InterruptedException {
1166 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1167 try {
1168 q.putLast(null);
1169 shouldThrow();
1170 } catch (NullPointerException success) {}
1171 }
1172
1173 /**
1174 * all elements successfully putLast are contained
1175 */
1176 public void testPutLast() throws InterruptedException {
1177 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1178 for (int i = 0; i < SIZE; ++i) {
1179 Integer x = new Integer(i);
1180 q.putLast(x);
1181 assertTrue(q.contains(x));
1182 }
1183 assertEquals(0, q.remainingCapacity());
1184 }
1185
1186 /**
1187 * putLast blocks interruptibly if full
1188 */
1189 public void testBlockingPutLast() throws InterruptedException {
1190 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1191 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1192 Thread t = newStartedThread(new CheckedRunnable() {
1193 public void realRun() throws InterruptedException {
1194 for (int i = 0; i < SIZE; ++i)
1195 q.putLast(i);
1196 assertEquals(SIZE, q.size());
1197 assertEquals(0, q.remainingCapacity());
1198
1199 Thread.currentThread().interrupt();
1200 try {
1201 q.putLast(99);
1202 shouldThrow();
1203 } catch (InterruptedException success) {}
1204 assertFalse(Thread.interrupted());
1205
1206 pleaseInterrupt.countDown();
1207 try {
1208 q.putLast(99);
1209 shouldThrow();
1210 } catch (InterruptedException success) {}
1211 assertFalse(Thread.interrupted());
1212 }});
1213
1214 await(pleaseInterrupt);
1215 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1216 t.interrupt();
1217 awaitTermination(t);
1218 assertEquals(SIZE, q.size());
1219 assertEquals(0, q.remainingCapacity());
1220 }
1221
1222 /**
1223 * putLast blocks interruptibly waiting for take when full
1224 */
1225 public void testPutLastWithTake() throws InterruptedException {
1226 final int capacity = 2;
1227 final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
1228 final CountDownLatch pleaseTake = new CountDownLatch(1);
1229 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1230 Thread t = newStartedThread(new CheckedRunnable() {
1231 public void realRun() throws InterruptedException {
1232 for (int i = 0; i < capacity; i++)
1233 q.putLast(i);
1234 pleaseTake.countDown();
1235 q.putLast(86);
1236
1237 Thread.currentThread().interrupt();
1238 try {
1239 q.putLast(99);
1240 shouldThrow();
1241 } catch (InterruptedException success) {}
1242 assertFalse(Thread.interrupted());
1243
1244 pleaseInterrupt.countDown();
1245 try {
1246 q.putLast(99);
1247 shouldThrow();
1248 } catch (InterruptedException success) {}
1249 assertFalse(Thread.interrupted());
1250 }});
1251
1252 await(pleaseTake);
1253 assertEquals(0, q.remainingCapacity());
1254 assertEquals(0, q.take());
1255
1256 await(pleaseInterrupt);
1257 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1258 t.interrupt();
1259 awaitTermination(t);
1260 assertEquals(0, q.remainingCapacity());
1261 }
1262
1263 /**
1264 * timed offerLast times out if full and elements not taken
1265 */
1266 public void testTimedOfferLast() {
1267 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1268 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1269 Thread t = newStartedThread(new CheckedRunnable() {
1270 public void realRun() throws InterruptedException {
1271 q.putLast(new Object());
1272 q.putLast(new Object());
1273 long startTime = System.nanoTime();
1274
1275 assertFalse(q.offerLast(new Object(), timeoutMillis(), MILLISECONDS));
1276 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1277
1278 Thread.currentThread().interrupt();
1279 try {
1280 q.offerLast(new Object(), randomTimeout(), randomTimeUnit());
1281 shouldThrow();
1282 } catch (InterruptedException success) {}
1283
1284 pleaseInterrupt.countDown();
1285 try {
1286 q.offerLast(new Object(), LONG_DELAY_MS, MILLISECONDS);
1287 shouldThrow();
1288 } catch (InterruptedException success) {}
1289
1290 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1291 }});
1292
1293 await(pleaseInterrupt);
1294 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1295 t.interrupt();
1296 awaitTermination(t);
1297 }
1298
1299 /**
1300 * takeLast retrieves elements in FIFO order
1301 */
1302 public void testTakeLast() throws InterruptedException {
1303 LinkedBlockingDeque q = populatedDeque(SIZE);
1304 for (int i = 0; i < SIZE; ++i) {
1305 assertEquals(SIZE - i - 1, q.takeLast());
1306 }
1307 }
1308
1309 /**
1310 * takeLast removes existing elements until empty, then blocks interruptibly
1311 */
1312 public void testBlockingTakeLast() throws InterruptedException {
1313 final LinkedBlockingDeque q = populatedDeque(SIZE);
1314 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1315 Thread t = newStartedThread(new CheckedRunnable() {
1316 public void realRun() throws InterruptedException {
1317 for (int i = 0; i < SIZE; i++)
1318 assertEquals(SIZE - i - 1, q.takeLast());
1319
1320 Thread.currentThread().interrupt();
1321 try {
1322 q.takeLast();
1323 shouldThrow();
1324 } catch (InterruptedException success) {}
1325 assertFalse(Thread.interrupted());
1326
1327 pleaseInterrupt.countDown();
1328 try {
1329 q.takeLast();
1330 shouldThrow();
1331 } catch (InterruptedException success) {}
1332 assertFalse(Thread.interrupted());
1333 }});
1334
1335 await(pleaseInterrupt);
1336 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1337 t.interrupt();
1338 awaitTermination(t);
1339 }
1340
1341 /**
1342 * timed pollLast with zero timeout succeeds when non-empty, else times out
1343 */
1344 public void testTimedPollLast0() throws InterruptedException {
1345 LinkedBlockingDeque q = populatedDeque(SIZE);
1346 for (int i = 0; i < SIZE; ++i) {
1347 assertEquals(SIZE - i - 1, q.pollLast(0, MILLISECONDS));
1348 }
1349 assertNull(q.pollLast(0, MILLISECONDS));
1350 }
1351
1352 /**
1353 * timed pollLast with nonzero timeout succeeds when non-empty, else times out
1354 */
1355 public void testTimedPollLast() throws InterruptedException {
1356 LinkedBlockingDeque q = populatedDeque(SIZE);
1357 for (int i = 0; i < SIZE; ++i) {
1358 long startTime = System.nanoTime();
1359 assertEquals(SIZE - i - 1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1360 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1361 }
1362 long startTime = System.nanoTime();
1363 assertNull(q.pollLast(timeoutMillis(), MILLISECONDS));
1364 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1365 checkEmpty(q);
1366 }
1367
1368 /**
1369 * Interrupted timed pollLast throws InterruptedException instead of
1370 * returning timeout status
1371 */
1372 public void testInterruptedTimedPollLast() throws InterruptedException {
1373 final LinkedBlockingDeque q = populatedDeque(SIZE);
1374 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1375 Thread t = newStartedThread(new CheckedRunnable() {
1376 public void realRun() throws InterruptedException {
1377 for (int i = 0; i < SIZE; i++)
1378 assertEquals(SIZE - i - 1,
1379 q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1380
1381 Thread.currentThread().interrupt();
1382 try {
1383 q.pollLast(randomTimeout(), randomTimeUnit());
1384 shouldThrow();
1385 } catch (InterruptedException success) {}
1386 assertFalse(Thread.interrupted());
1387
1388 pleaseInterrupt.countDown();
1389 try {
1390 q.pollLast(LONGER_DELAY_MS, MILLISECONDS);
1391 shouldThrow();
1392 } catch (InterruptedException success) {}
1393 assertFalse(Thread.interrupted());
1394 }});
1395
1396 await(pleaseInterrupt);
1397 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1398 t.interrupt();
1399 awaitTermination(t);
1400 checkEmpty(q);
1401 }
1402
1403 /**
1404 * timed poll before a delayed offerLast fails; after offerLast succeeds;
1405 * on interruption throws
1406 */
1407 public void testTimedPollWithOfferLast() throws InterruptedException {
1408 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1409 final CheckedBarrier barrier = new CheckedBarrier(2);
1410 Thread t = newStartedThread(new CheckedRunnable() {
1411 public void realRun() throws InterruptedException {
1412 long startTime = System.nanoTime();
1413 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
1414 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1415
1416 barrier.await();
1417
1418 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
1419
1420 Thread.currentThread().interrupt();
1421 try {
1422 q.poll(randomTimeout(), randomTimeUnit());
1423 shouldThrow();
1424 } catch (InterruptedException success) {}
1425 assertFalse(Thread.interrupted());
1426
1427 barrier.await();
1428 try {
1429 q.poll(LONG_DELAY_MS, MILLISECONDS);
1430 shouldThrow();
1431 } catch (InterruptedException success) {}
1432 assertFalse(Thread.interrupted());
1433
1434 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1435 }});
1436
1437 barrier.await();
1438 long startTime = System.nanoTime();
1439 assertTrue(q.offerLast(zero, LONG_DELAY_MS, MILLISECONDS));
1440 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1441
1442 barrier.await();
1443 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1444 t.interrupt();
1445 awaitTermination(t);
1446 }
1447
1448 /**
1449 * element returns next element, or throws NSEE if empty
1450 */
1451 public void testElement() {
1452 LinkedBlockingDeque q = populatedDeque(SIZE);
1453 for (int i = 0; i < SIZE; ++i) {
1454 assertEquals(i, q.element());
1455 q.poll();
1456 }
1457 try {
1458 q.element();
1459 shouldThrow();
1460 } catch (NoSuchElementException success) {}
1461 }
1462
1463 /**
1464 * contains(x) reports true when elements added but not yet removed
1465 */
1466 public void testContains() {
1467 LinkedBlockingDeque q = populatedDeque(SIZE);
1468 for (int i = 0; i < SIZE; ++i) {
1469 assertTrue(q.contains(new Integer(i)));
1470 q.poll();
1471 assertFalse(q.contains(new Integer(i)));
1472 }
1473 }
1474
1475 /**
1476 * clear removes all elements
1477 */
1478 public void testClear() {
1479 LinkedBlockingDeque q = populatedDeque(SIZE);
1480 q.clear();
1481 assertTrue(q.isEmpty());
1482 assertEquals(0, q.size());
1483 assertEquals(SIZE, q.remainingCapacity());
1484 q.add(one);
1485 assertFalse(q.isEmpty());
1486 assertTrue(q.contains(one));
1487 q.clear();
1488 assertTrue(q.isEmpty());
1489 }
1490
1491 /**
1492 * containsAll(c) is true when c contains a subset of elements
1493 */
1494 public void testContainsAll() {
1495 LinkedBlockingDeque q = populatedDeque(SIZE);
1496 LinkedBlockingDeque p = new LinkedBlockingDeque(SIZE);
1497 for (int i = 0; i < SIZE; ++i) {
1498 assertTrue(q.containsAll(p));
1499 assertFalse(p.containsAll(q));
1500 p.add(new Integer(i));
1501 }
1502 assertTrue(p.containsAll(q));
1503 }
1504
1505 /**
1506 * retainAll(c) retains only those elements of c and reports true if changed
1507 */
1508 public void testRetainAll() {
1509 LinkedBlockingDeque q = populatedDeque(SIZE);
1510 LinkedBlockingDeque p = populatedDeque(SIZE);
1511 for (int i = 0; i < SIZE; ++i) {
1512 boolean changed = q.retainAll(p);
1513 if (i == 0)
1514 assertFalse(changed);
1515 else
1516 assertTrue(changed);
1517
1518 assertTrue(q.containsAll(p));
1519 assertEquals(SIZE - i, q.size());
1520 p.remove();
1521 }
1522 }
1523
1524 /**
1525 * removeAll(c) removes only those elements of c and reports true if changed
1526 */
1527 public void testRemoveAll() {
1528 for (int i = 1; i < SIZE; ++i) {
1529 LinkedBlockingDeque q = populatedDeque(SIZE);
1530 LinkedBlockingDeque p = populatedDeque(i);
1531 assertTrue(q.removeAll(p));
1532 assertEquals(SIZE - i, q.size());
1533 for (int j = 0; j < i; ++j) {
1534 Integer x = (Integer)(p.remove());
1535 assertFalse(q.contains(x));
1536 }
1537 }
1538 }
1539
1540 /**
1541 * toArray contains all elements in FIFO order
1542 */
1543 public void testToArray() throws InterruptedException {
1544 LinkedBlockingDeque q = populatedDeque(SIZE);
1545 Object[] a = q.toArray();
1546 assertSame(Object[].class, a.getClass());
1547 for (Object o : a)
1548 assertSame(o, q.poll());
1549 assertTrue(q.isEmpty());
1550 }
1551
1552 /**
1553 * toArray(a) contains all elements in FIFO order
1554 */
1555 public void testToArray2() {
1556 LinkedBlockingDeque<Integer> q = populatedDeque(SIZE);
1557 Integer[] ints = new Integer[SIZE];
1558 Integer[] array = q.toArray(ints);
1559 assertSame(ints, array);
1560 for (Integer o : ints)
1561 assertSame(o, q.remove());
1562 assertTrue(q.isEmpty());
1563 }
1564
1565 /**
1566 * toArray(incompatible array type) throws ArrayStoreException
1567 */
1568 public void testToArray1_BadArg() {
1569 LinkedBlockingDeque q = populatedDeque(SIZE);
1570 try {
1571 q.toArray(new String[10]);
1572 shouldThrow();
1573 } catch (ArrayStoreException success) {}
1574 }
1575
1576 /**
1577 * iterator iterates through all elements
1578 */
1579 public void testIterator() throws InterruptedException {
1580 LinkedBlockingDeque q = populatedDeque(SIZE);
1581 Iterator it = q.iterator();
1582 int i;
1583 for (i = 0; it.hasNext(); i++)
1584 assertTrue(q.contains(it.next()));
1585 assertEquals(i, SIZE);
1586 assertIteratorExhausted(it);
1587
1588 it = q.iterator();
1589 for (i = 0; it.hasNext(); i++)
1590 assertEquals(it.next(), q.take());
1591 assertEquals(i, SIZE);
1592 assertIteratorExhausted(it);
1593 }
1594
1595 /**
1596 * iterator of empty collection has no elements
1597 */
1598 public void testEmptyIterator() {
1599 Deque c = new LinkedBlockingDeque();
1600 assertIteratorExhausted(c.iterator());
1601 assertIteratorExhausted(c.descendingIterator());
1602 }
1603
1604 /**
1605 * iterator.remove removes current element
1606 */
1607 public void testIteratorRemove() {
1608 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1609 q.add(two);
1610 q.add(one);
1611 q.add(three);
1612
1613 Iterator it = q.iterator();
1614 it.next();
1615 it.remove();
1616
1617 it = q.iterator();
1618 assertSame(it.next(), one);
1619 assertSame(it.next(), three);
1620 assertFalse(it.hasNext());
1621 }
1622
1623 /**
1624 * iterator ordering is FIFO
1625 */
1626 public void testIteratorOrdering() {
1627 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1628 q.add(one);
1629 q.add(two);
1630 q.add(three);
1631 assertEquals(0, q.remainingCapacity());
1632 int k = 0;
1633 for (Iterator it = q.iterator(); it.hasNext();) {
1634 assertEquals(++k, it.next());
1635 }
1636 assertEquals(3, k);
1637 }
1638
1639 /**
1640 * Modifications do not cause iterators to fail
1641 */
1642 public void testWeaklyConsistentIteration() {
1643 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1644 q.add(one);
1645 q.add(two);
1646 q.add(three);
1647 for (Iterator it = q.iterator(); it.hasNext();) {
1648 q.remove();
1649 it.next();
1650 }
1651 assertEquals(0, q.size());
1652 }
1653
1654 /**
1655 * Descending iterator iterates through all elements
1656 */
1657 public void testDescendingIterator() {
1658 LinkedBlockingDeque q = populatedDeque(SIZE);
1659 int i = 0;
1660 Iterator it = q.descendingIterator();
1661 while (it.hasNext()) {
1662 assertTrue(q.contains(it.next()));
1663 ++i;
1664 }
1665 assertEquals(i, SIZE);
1666 assertFalse(it.hasNext());
1667 try {
1668 it.next();
1669 shouldThrow();
1670 } catch (NoSuchElementException success) {}
1671 }
1672
1673 /**
1674 * Descending iterator ordering is reverse FIFO
1675 */
1676 public void testDescendingIteratorOrdering() {
1677 final LinkedBlockingDeque q = new LinkedBlockingDeque();
1678 for (int iters = 0; iters < 100; ++iters) {
1679 q.add(new Integer(3));
1680 q.add(new Integer(2));
1681 q.add(new Integer(1));
1682 int k = 0;
1683 for (Iterator it = q.descendingIterator(); it.hasNext();) {
1684 assertEquals(++k, it.next());
1685 }
1686
1687 assertEquals(3, k);
1688 q.remove();
1689 q.remove();
1690 q.remove();
1691 }
1692 }
1693
1694 /**
1695 * descendingIterator.remove removes current element
1696 */
1697 public void testDescendingIteratorRemove() {
1698 final LinkedBlockingDeque q = new LinkedBlockingDeque();
1699 for (int iters = 0; iters < 100; ++iters) {
1700 q.add(new Integer(3));
1701 q.add(new Integer(2));
1702 q.add(new Integer(1));
1703 Iterator it = q.descendingIterator();
1704 assertEquals(it.next(), new Integer(1));
1705 it.remove();
1706 assertEquals(it.next(), new Integer(2));
1707 it = q.descendingIterator();
1708 assertEquals(it.next(), new Integer(2));
1709 assertEquals(it.next(), new Integer(3));
1710 it.remove();
1711 assertFalse(it.hasNext());
1712 q.remove();
1713 }
1714 }
1715
1716 /**
1717 * toString contains toStrings of elements
1718 */
1719 public void testToString() {
1720 LinkedBlockingDeque q = populatedDeque(SIZE);
1721 String s = q.toString();
1722 for (int i = 0; i < SIZE; ++i) {
1723 assertTrue(s.contains(String.valueOf(i)));
1724 }
1725 }
1726
1727 /**
1728 * offer transfers elements across Executor tasks
1729 */
1730 public void testOfferInExecutor() {
1731 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1732 q.add(one);
1733 q.add(two);
1734 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1735 final ExecutorService executor = Executors.newFixedThreadPool(2);
1736 try (PoolCleaner cleaner = cleaner(executor)) {
1737 executor.execute(new CheckedRunnable() {
1738 public void realRun() throws InterruptedException {
1739 assertFalse(q.offer(three));
1740 threadsStarted.await();
1741 assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
1742 assertEquals(0, q.remainingCapacity());
1743 }});
1744
1745 executor.execute(new CheckedRunnable() {
1746 public void realRun() throws InterruptedException {
1747 threadsStarted.await();
1748 assertSame(one, q.take());
1749 }});
1750 }
1751 }
1752
1753 /**
1754 * timed poll retrieves elements across Executor threads
1755 */
1756 public void testPollInExecutor() {
1757 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1758 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1759 final ExecutorService executor = Executors.newFixedThreadPool(2);
1760 try (PoolCleaner cleaner = cleaner(executor)) {
1761 executor.execute(new CheckedRunnable() {
1762 public void realRun() throws InterruptedException {
1763 assertNull(q.poll());
1764 threadsStarted.await();
1765 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
1766 checkEmpty(q);
1767 }});
1768
1769 executor.execute(new CheckedRunnable() {
1770 public void realRun() throws InterruptedException {
1771 threadsStarted.await();
1772 q.put(one);
1773 }});
1774 }
1775 }
1776
1777 /**
1778 * A deserialized/reserialized deque has same elements in same order
1779 */
1780 public void testSerialization() throws Exception {
1781 Queue x = populatedDeque(SIZE);
1782 Queue y = serialClone(x);
1783
1784 assertNotSame(y, x);
1785 assertEquals(x.size(), y.size());
1786 assertEquals(x.toString(), y.toString());
1787 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
1788 while (!x.isEmpty()) {
1789 assertFalse(y.isEmpty());
1790 assertEquals(x.remove(), y.remove());
1791 }
1792 assertTrue(y.isEmpty());
1793 }
1794
1795 /**
1796 * drainTo(c) empties deque into another collection c
1797 */
1798 public void testDrainTo() {
1799 LinkedBlockingDeque q = populatedDeque(SIZE);
1800 ArrayList l = new ArrayList();
1801 q.drainTo(l);
1802 assertEquals(0, q.size());
1803 assertEquals(SIZE, l.size());
1804 for (int i = 0; i < SIZE; ++i)
1805 assertEquals(l.get(i), new Integer(i));
1806 q.add(zero);
1807 q.add(one);
1808 assertFalse(q.isEmpty());
1809 assertTrue(q.contains(zero));
1810 assertTrue(q.contains(one));
1811 l.clear();
1812 q.drainTo(l);
1813 assertEquals(0, q.size());
1814 assertEquals(2, l.size());
1815 for (int i = 0; i < 2; ++i)
1816 assertEquals(l.get(i), new Integer(i));
1817 }
1818
1819 /**
1820 * drainTo empties full deque, unblocking a waiting put.
1821 */
1822 public void testDrainToWithActivePut() throws InterruptedException {
1823 final LinkedBlockingDeque q = populatedDeque(SIZE);
1824 Thread t = new Thread(new CheckedRunnable() {
1825 public void realRun() throws InterruptedException {
1826 q.put(new Integer(SIZE + 1));
1827 }});
1828
1829 t.start();
1830 ArrayList l = new ArrayList();
1831 q.drainTo(l);
1832 assertTrue(l.size() >= SIZE);
1833 for (int i = 0; i < SIZE; ++i)
1834 assertEquals(l.get(i), new Integer(i));
1835 t.join();
1836 assertTrue(q.size() + l.size() >= SIZE);
1837 }
1838
1839 /**
1840 * drainTo(c, n) empties first min(n, size) elements of queue into c
1841 */
1842 public void testDrainToN() {
1843 LinkedBlockingDeque q = new LinkedBlockingDeque();
1844 for (int i = 0; i < SIZE + 2; ++i) {
1845 for (int j = 0; j < SIZE; j++)
1846 assertTrue(q.offer(new Integer(j)));
1847 ArrayList l = new ArrayList();
1848 q.drainTo(l, i);
1849 int k = (i < SIZE) ? i : SIZE;
1850 assertEquals(k, l.size());
1851 assertEquals(SIZE - k, q.size());
1852 for (int j = 0; j < k; ++j)
1853 assertEquals(l.get(j), new Integer(j));
1854 do {} while (q.poll() != null);
1855 }
1856 }
1857
1858 /**
1859 * remove(null), contains(null) always return false
1860 */
1861 public void testNeverContainsNull() {
1862 Deque<?>[] qs = {
1863 new LinkedBlockingDeque<Object>(),
1864 populatedDeque(2),
1865 };
1866
1867 for (Deque<?> q : qs) {
1868 assertFalse(q.contains(null));
1869 assertFalse(q.remove(null));
1870 assertFalse(q.removeFirstOccurrence(null));
1871 assertFalse(q.removeLastOccurrence(null));
1872 }
1873 }
1874
1875 }