ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.2
Committed: Wed Sep 14 23:50:31 2005 UTC (18 years, 7 months ago) by dl
Branch: MAIN
Changes since 1.1: +54 -0 lines
Log Message:
Test Deque.descendingIterator

File Contents

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