ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.77
Committed: Sun May 14 00:56:43 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.76: +3 -0 lines
Log Message:
add interrupt status assertions

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