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