ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.76
Committed: Sun May 14 00:48:20 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.75: +9 -6 lines
Log Message:
improve testInterruptedTimedPoll

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