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