ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.76
Committed: Sun May 14 00:48:20 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.75: +9 -6 lines
Log Message:
improve testInterruptedTimedPoll

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