ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.32
Committed: Fri Nov 5 00:17:22 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +6 -4 lines
Log Message:
very small improvements to testToArray2

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