ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.31
Committed: Thu Nov 4 01:04:54 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.30: +6 -6 lines
Log Message:
strengthen toArray tests

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