ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.89
Committed: Wed Jan 27 01:57:24 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.88: +49 -50 lines
Log Message:
use diamond <> pervasively

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