ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.79
Committed: Sun May 14 04:02:06 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.78: +7 -0 lines
Log Message:
improve testPutWithTake

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