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