ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.56
Committed: Sat Feb 28 19:59:23 2015 UTC (9 years, 2 months ago) by jsr166
Branch: MAIN
Changes since 1.55: +5 -5 lines
Log Message:
improve testRemainingCapacity

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