ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.79
Committed: Sun May 14 04:02:06 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.78: +7 -0 lines
Log Message:
improve testPutWithTake

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 jsr166 1.79 Thread.currentThread().interrupt();
630     try {
631     q.put(99);
632     shouldThrow();
633     } catch (InterruptedException success) {}
634     assertFalse(Thread.interrupted());
635    
636 jsr166 1.39 pleaseInterrupt.countDown();
637 jsr166 1.10 try {
638 jsr166 1.17 q.put(99);
639     shouldThrow();
640     } catch (InterruptedException success) {}
641 jsr166 1.39 assertFalse(Thread.interrupted());
642 jsr166 1.10 }});
643 jsr166 1.9
644 jsr166 1.39 await(pleaseTake);
645 jsr166 1.44 assertEquals(0, q.remainingCapacity());
646 jsr166 1.17 assertEquals(0, q.take());
647 jsr166 1.39
648     await(pleaseInterrupt);
649 jsr166 1.71 assertThreadBlocks(t, Thread.State.WAITING);
650 jsr166 1.9 t.interrupt();
651 jsr166 1.39 awaitTermination(t);
652 jsr166 1.44 assertEquals(0, q.remainingCapacity());
653 dl 1.1 }
654    
655     /**
656     * timed offer times out if full and elements not taken
657     */
658 jsr166 1.9 public void testTimedOffer() throws InterruptedException {
659 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
660 jsr166 1.38 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
661     Thread t = newStartedThread(new CheckedRunnable() {
662 jsr166 1.9 public void realRun() throws InterruptedException {
663     q.put(new Object());
664     q.put(new Object());
665 jsr166 1.38 long startTime = System.nanoTime();
666     assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
667     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
668     pleaseInterrupt.countDown();
669 jsr166 1.16 try {
670 jsr166 1.38 q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
671 jsr166 1.16 shouldThrow();
672     } catch (InterruptedException success) {}
673 jsr166 1.77 assertFalse(Thread.interrupted());
674 jsr166 1.16 }});
675 jsr166 1.4
676 jsr166 1.38 await(pleaseInterrupt);
677 jsr166 1.72 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
678 jsr166 1.9 t.interrupt();
679 jsr166 1.38 awaitTermination(t);
680 dl 1.1 }
681    
682     /**
683     * take retrieves elements in FIFO order
684     */
685 jsr166 1.9 public void testTake() throws InterruptedException {
686     LinkedBlockingDeque q = populatedDeque(SIZE);
687     for (int i = 0; i < SIZE; ++i) {
688 jsr166 1.18 assertEquals(i, q.take());
689 jsr166 1.7 }
690 dl 1.1 }
691    
692     /**
693 jsr166 1.39 * take removes existing elements until empty, then blocks interruptibly
694 dl 1.1 */
695 jsr166 1.9 public void testBlockingTake() throws InterruptedException {
696 jsr166 1.17 final LinkedBlockingDeque q = populatedDeque(SIZE);
697 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
698     Thread t = newStartedThread(new CheckedRunnable() {
699 jsr166 1.9 public void realRun() throws InterruptedException {
700 jsr166 1.69 for (int i = 0; i < SIZE; i++) assertEquals(i, q.take());
701 jsr166 1.39
702     Thread.currentThread().interrupt();
703 jsr166 1.17 try {
704     q.take();
705     shouldThrow();
706     } catch (InterruptedException success) {}
707 jsr166 1.39 assertFalse(Thread.interrupted());
708    
709     pleaseInterrupt.countDown();
710     try {
711     q.take();
712     shouldThrow();
713     } catch (InterruptedException success) {}
714     assertFalse(Thread.interrupted());
715 jsr166 1.17 }});
716 jsr166 1.9
717 jsr166 1.39 await(pleaseInterrupt);
718 jsr166 1.69 assertThreadBlocks(t, Thread.State.WAITING);
719 jsr166 1.9 t.interrupt();
720 jsr166 1.39 awaitTermination(t);
721 dl 1.1 }
722    
723     /**
724     * poll succeeds unless empty
725     */
726     public void testPoll() {
727     LinkedBlockingDeque q = populatedDeque(SIZE);
728     for (int i = 0; i < SIZE; ++i) {
729 jsr166 1.18 assertEquals(i, q.poll());
730 dl 1.1 }
731 jsr166 1.7 assertNull(q.poll());
732 dl 1.1 }
733    
734     /**
735     * timed poll with zero timeout succeeds when non-empty, else times out
736     */
737 jsr166 1.9 public void testTimedPoll0() throws InterruptedException {
738     LinkedBlockingDeque q = populatedDeque(SIZE);
739     for (int i = 0; i < SIZE; ++i) {
740 jsr166 1.18 assertEquals(i, q.poll(0, MILLISECONDS));
741 jsr166 1.7 }
742 jsr166 1.9 assertNull(q.poll(0, MILLISECONDS));
743 dl 1.1 }
744    
745     /**
746     * timed poll with nonzero timeout succeeds when non-empty, else times out
747     */
748 jsr166 1.9 public void testTimedPoll() throws InterruptedException {
749     LinkedBlockingDeque q = populatedDeque(SIZE);
750     for (int i = 0; i < SIZE; ++i) {
751 jsr166 1.39 long startTime = System.nanoTime();
752     assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
753     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
754     }
755     long startTime = System.nanoTime();
756     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
757     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
758     checkEmpty(q);
759 dl 1.1 }
760    
761     /**
762     * Interrupted timed poll throws InterruptedException instead of
763     * returning timeout status
764     */
765 jsr166 1.9 public void testInterruptedTimedPoll() throws InterruptedException {
766 jsr166 1.34 final BlockingQueue<Integer> q = populatedDeque(SIZE);
767 jsr166 1.76 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
768 jsr166 1.34 Thread t = newStartedThread(new CheckedRunnable() {
769 jsr166 1.9 public void realRun() throws InterruptedException {
770 jsr166 1.62 long startTime = System.nanoTime();
771 jsr166 1.78 for (int i = 0; i < SIZE; i++)
772 jsr166 1.34 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
773 jsr166 1.78
774     Thread.currentThread().interrupt();
775     try {
776     q.poll(LONG_DELAY_MS, MILLISECONDS);
777     shouldThrow();
778     } catch (InterruptedException success) {}
779     assertFalse(Thread.interrupted());
780 jsr166 1.76
781     pleaseInterrupt.countDown();
782 jsr166 1.13 try {
783 jsr166 1.62 q.poll(LONG_DELAY_MS, MILLISECONDS);
784 jsr166 1.13 shouldThrow();
785 jsr166 1.76 } catch (InterruptedException success) {}
786     assertFalse(Thread.interrupted());
787    
788     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
789 jsr166 1.13 }});
790 jsr166 1.9
791 jsr166 1.76 await(pleaseInterrupt);
792 jsr166 1.74 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
793 jsr166 1.9 t.interrupt();
794 jsr166 1.62 awaitTermination(t);
795 jsr166 1.34 checkEmpty(q);
796 dl 1.1 }
797    
798     /**
799     * putFirst(null) throws NPE
800     */
801 jsr166 1.36 public void testPutFirstNull() throws InterruptedException {
802 jsr166 1.40 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
803 jsr166 1.7 try {
804 dl 1.1 q.putFirst(null);
805     shouldThrow();
806 jsr166 1.9 } catch (NullPointerException success) {}
807 jsr166 1.36 }
808 dl 1.1
809     /**
810     * all elements successfully putFirst are contained
811     */
812 jsr166 1.36 public void testPutFirst() throws InterruptedException {
813     LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
814     for (int i = 0; i < SIZE; ++i) {
815 jsr166 1.54 Integer x = new Integer(i);
816     q.putFirst(x);
817     assertTrue(q.contains(x));
818 jsr166 1.36 }
819     assertEquals(0, q.remainingCapacity());
820 dl 1.1 }
821    
822     /**
823     * putFirst blocks interruptibly if full
824     */
825 jsr166 1.9 public void testBlockingPutFirst() throws InterruptedException {
826 jsr166 1.17 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
827 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
828     Thread t = newStartedThread(new CheckedRunnable() {
829 jsr166 1.17 public void realRun() throws InterruptedException {
830     for (int i = 0; i < SIZE; ++i)
831     q.putFirst(i);
832     assertEquals(SIZE, q.size());
833     assertEquals(0, q.remainingCapacity());
834 jsr166 1.39
835     Thread.currentThread().interrupt();
836     try {
837     q.putFirst(99);
838     shouldThrow();
839     } catch (InterruptedException success) {}
840     assertFalse(Thread.interrupted());
841    
842     pleaseInterrupt.countDown();
843 jsr166 1.11 try {
844 jsr166 1.17 q.putFirst(99);
845     shouldThrow();
846     } catch (InterruptedException success) {}
847 jsr166 1.39 assertFalse(Thread.interrupted());
848 jsr166 1.11 }});
849 jsr166 1.9
850 jsr166 1.39 await(pleaseInterrupt);
851 jsr166 1.72 assertThreadBlocks(t, Thread.State.WAITING);
852 jsr166 1.9 t.interrupt();
853 jsr166 1.39 awaitTermination(t);
854 jsr166 1.17 assertEquals(SIZE, q.size());
855     assertEquals(0, q.remainingCapacity());
856 dl 1.1 }
857    
858     /**
859 jsr166 1.39 * putFirst blocks interruptibly waiting for take when full
860 dl 1.1 */
861 jsr166 1.9 public void testPutFirstWithTake() throws InterruptedException {
862 jsr166 1.17 final int capacity = 2;
863     final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
864 jsr166 1.39 final CountDownLatch pleaseTake = new CountDownLatch(1);
865     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
866     Thread t = newStartedThread(new CheckedRunnable() {
867 jsr166 1.17 public void realRun() throws InterruptedException {
868 jsr166 1.39 for (int i = 0; i < capacity; i++)
869 jsr166 1.17 q.putFirst(i);
870 jsr166 1.39 pleaseTake.countDown();
871     q.putFirst(86);
872    
873     pleaseInterrupt.countDown();
874 jsr166 1.11 try {
875 jsr166 1.17 q.putFirst(99);
876     shouldThrow();
877     } catch (InterruptedException success) {}
878 jsr166 1.39 assertFalse(Thread.interrupted());
879 jsr166 1.11 }});
880 jsr166 1.9
881 jsr166 1.39 await(pleaseTake);
882 jsr166 1.44 assertEquals(0, q.remainingCapacity());
883 jsr166 1.17 assertEquals(capacity - 1, q.take());
884 jsr166 1.39
885     await(pleaseInterrupt);
886 jsr166 1.72 assertThreadBlocks(t, Thread.State.WAITING);
887 jsr166 1.9 t.interrupt();
888 jsr166 1.39 awaitTermination(t);
889 jsr166 1.44 assertEquals(0, q.remainingCapacity());
890 dl 1.1 }
891    
892     /**
893     * timed offerFirst times out if full and elements not taken
894     */
895 jsr166 1.9 public void testTimedOfferFirst() throws InterruptedException {
896 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
897 jsr166 1.38 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
898     Thread t = newStartedThread(new CheckedRunnable() {
899 jsr166 1.9 public void realRun() throws InterruptedException {
900     q.putFirst(new Object());
901     q.putFirst(new Object());
902 jsr166 1.38 long startTime = System.nanoTime();
903     assertFalse(q.offerFirst(new Object(), timeoutMillis(), MILLISECONDS));
904     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
905     pleaseInterrupt.countDown();
906 jsr166 1.16 try {
907 jsr166 1.38 q.offerFirst(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
908 jsr166 1.16 shouldThrow();
909     } catch (InterruptedException success) {}
910 jsr166 1.77 assertFalse(Thread.interrupted());
911 jsr166 1.16 }});
912 jsr166 1.4
913 jsr166 1.38 await(pleaseInterrupt);
914 jsr166 1.72 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
915 jsr166 1.9 t.interrupt();
916 jsr166 1.38 awaitTermination(t);
917 dl 1.1 }
918    
919     /**
920     * take retrieves elements in FIFO order
921     */
922 jsr166 1.9 public void testTakeFirst() throws InterruptedException {
923     LinkedBlockingDeque q = populatedDeque(SIZE);
924     for (int i = 0; i < SIZE; ++i) {
925 jsr166 1.18 assertEquals(i, q.takeFirst());
926 jsr166 1.7 }
927 dl 1.1 }
928    
929     /**
930 jsr166 1.39 * takeFirst() blocks interruptibly when empty
931     */
932     public void testTakeFirstFromEmptyBlocksInterruptibly() {
933     final BlockingDeque q = new LinkedBlockingDeque();
934     final CountDownLatch threadStarted = new CountDownLatch(1);
935     Thread t = newStartedThread(new CheckedRunnable() {
936     public void realRun() {
937     threadStarted.countDown();
938     try {
939     q.takeFirst();
940     shouldThrow();
941     } catch (InterruptedException success) {}
942     assertFalse(Thread.interrupted());
943     }});
944    
945     await(threadStarted);
946 jsr166 1.70 assertThreadBlocks(t, Thread.State.WAITING);
947 jsr166 1.39 t.interrupt();
948     awaitTermination(t);
949     }
950    
951     /**
952     * takeFirst() throws InterruptedException immediately if interrupted
953     * before waiting
954     */
955     public void testTakeFirstFromEmptyAfterInterrupt() {
956     final BlockingDeque q = new LinkedBlockingDeque();
957     Thread t = newStartedThread(new CheckedRunnable() {
958     public void realRun() {
959     Thread.currentThread().interrupt();
960     try {
961     q.takeFirst();
962     shouldThrow();
963     } catch (InterruptedException success) {}
964     assertFalse(Thread.interrupted());
965     }});
966    
967     awaitTermination(t);
968     }
969    
970     /**
971     * takeLast() blocks interruptibly when empty
972 dl 1.1 */
973 jsr166 1.39 public void testTakeLastFromEmptyBlocksInterruptibly() {
974     final BlockingDeque q = new LinkedBlockingDeque();
975     final CountDownLatch threadStarted = new CountDownLatch(1);
976     Thread t = newStartedThread(new CheckedRunnable() {
977     public void realRun() {
978     threadStarted.countDown();
979     try {
980     q.takeLast();
981     shouldThrow();
982     } catch (InterruptedException success) {}
983     assertFalse(Thread.interrupted());
984     }});
985 jsr166 1.9
986 jsr166 1.39 await(threadStarted);
987 jsr166 1.70 assertThreadBlocks(t, Thread.State.WAITING);
988 jsr166 1.9 t.interrupt();
989 jsr166 1.39 awaitTermination(t);
990     }
991    
992     /**
993     * takeLast() throws InterruptedException immediately if interrupted
994     * before waiting
995     */
996     public void testTakeLastFromEmptyAfterInterrupt() {
997     final BlockingDeque q = new LinkedBlockingDeque();
998     Thread t = newStartedThread(new CheckedRunnable() {
999     public void realRun() {
1000     Thread.currentThread().interrupt();
1001     try {
1002     q.takeLast();
1003     shouldThrow();
1004     } catch (InterruptedException success) {}
1005     assertFalse(Thread.interrupted());
1006     }});
1007    
1008     awaitTermination(t);
1009 dl 1.1 }
1010    
1011     /**
1012 jsr166 1.39 * takeFirst removes existing elements until empty, then blocks interruptibly
1013 dl 1.1 */
1014 jsr166 1.9 public void testBlockingTakeFirst() throws InterruptedException {
1015 jsr166 1.17 final LinkedBlockingDeque q = populatedDeque(SIZE);
1016 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1017     Thread t = newStartedThread(new CheckedRunnable() {
1018 jsr166 1.9 public void realRun() throws InterruptedException {
1019 jsr166 1.69 for (int i = 0; i < SIZE; i++) assertEquals(i, q.takeFirst());
1020 jsr166 1.39
1021     Thread.currentThread().interrupt();
1022     try {
1023     q.takeFirst();
1024     shouldThrow();
1025     } catch (InterruptedException success) {}
1026     assertFalse(Thread.interrupted());
1027    
1028     pleaseInterrupt.countDown();
1029 jsr166 1.17 try {
1030     q.takeFirst();
1031     shouldThrow();
1032     } catch (InterruptedException success) {}
1033 jsr166 1.39 assertFalse(Thread.interrupted());
1034 jsr166 1.17 }});
1035 jsr166 1.9
1036 jsr166 1.39 await(pleaseInterrupt);
1037 jsr166 1.69 assertThreadBlocks(t, Thread.State.WAITING);
1038 jsr166 1.9 t.interrupt();
1039 jsr166 1.39 awaitTermination(t);
1040 dl 1.1 }
1041    
1042     /**
1043     * timed pollFirst with zero timeout succeeds when non-empty, else times out
1044     */
1045 jsr166 1.9 public void testTimedPollFirst0() throws InterruptedException {
1046     LinkedBlockingDeque q = populatedDeque(SIZE);
1047     for (int i = 0; i < SIZE; ++i) {
1048 jsr166 1.18 assertEquals(i, q.pollFirst(0, MILLISECONDS));
1049 jsr166 1.7 }
1050 jsr166 1.9 assertNull(q.pollFirst(0, MILLISECONDS));
1051 dl 1.1 }
1052    
1053     /**
1054     * timed pollFirst with nonzero timeout succeeds when non-empty, else times out
1055     */
1056 jsr166 1.9 public void testTimedPollFirst() throws InterruptedException {
1057     LinkedBlockingDeque q = populatedDeque(SIZE);
1058     for (int i = 0; i < SIZE; ++i) {
1059 jsr166 1.39 long startTime = System.nanoTime();
1060     assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1061     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1062     }
1063     long startTime = System.nanoTime();
1064     assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1065     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1066     checkEmpty(q);
1067 dl 1.1 }
1068    
1069     /**
1070     * Interrupted timed pollFirst throws InterruptedException instead of
1071     * returning timeout status
1072     */
1073 jsr166 1.9 public void testInterruptedTimedPollFirst() throws InterruptedException {
1074 jsr166 1.62 final LinkedBlockingDeque q = populatedDeque(SIZE);
1075 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1076     Thread t = newStartedThread(new CheckedRunnable() {
1077 jsr166 1.9 public void realRun() throws InterruptedException {
1078 jsr166 1.62 long startTime = System.nanoTime();
1079 jsr166 1.78 for (int i = 0; i < SIZE; i++)
1080 jsr166 1.39 assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1081    
1082     Thread.currentThread().interrupt();
1083     try {
1084 jsr166 1.62 q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1085 jsr166 1.39 shouldThrow();
1086     } catch (InterruptedException success) {}
1087     assertFalse(Thread.interrupted());
1088    
1089     pleaseInterrupt.countDown();
1090 jsr166 1.13 try {
1091 jsr166 1.48 q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1092 jsr166 1.13 shouldThrow();
1093     } catch (InterruptedException success) {}
1094 jsr166 1.39 assertFalse(Thread.interrupted());
1095 jsr166 1.76
1096 jsr166 1.62 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1097 jsr166 1.13 }});
1098 jsr166 1.9
1099 jsr166 1.39 await(pleaseInterrupt);
1100 jsr166 1.74 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1101 jsr166 1.9 t.interrupt();
1102 jsr166 1.39 awaitTermination(t);
1103 dl 1.1 }
1104    
1105     /**
1106 jsr166 1.25 * timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds;
1107     * on interruption throws
1108 dl 1.1 */
1109 jsr166 1.9 public void testTimedPollFirstWithOfferFirst() throws InterruptedException {
1110 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1111 jsr166 1.39 final CheckedBarrier barrier = new CheckedBarrier(2);
1112     Thread t = newStartedThread(new CheckedRunnable() {
1113 jsr166 1.9 public void realRun() throws InterruptedException {
1114 jsr166 1.39 long startTime = System.nanoTime();
1115     assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1116     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1117    
1118     barrier.await();
1119    
1120 jsr166 1.14 assertSame(zero, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1121 jsr166 1.39
1122     Thread.currentThread().interrupt();
1123     try {
1124     q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1125     shouldThrow();
1126     } catch (InterruptedException success) {}
1127    
1128     barrier.await();
1129 jsr166 1.14 try {
1130     q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1131     shouldThrow();
1132     } catch (InterruptedException success) {}
1133 jsr166 1.77 assertFalse(Thread.interrupted());
1134 jsr166 1.39 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1135 jsr166 1.14 }});
1136 jsr166 1.9
1137 jsr166 1.39 barrier.await();
1138     long startTime = System.nanoTime();
1139     assertTrue(q.offerFirst(zero, LONG_DELAY_MS, MILLISECONDS));
1140     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1141     barrier.await();
1142 jsr166 1.75 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1143 jsr166 1.9 t.interrupt();
1144 jsr166 1.39 awaitTermination(t);
1145 jsr166 1.4 }
1146 dl 1.1
1147     /**
1148     * putLast(null) throws NPE
1149     */
1150 jsr166 1.36 public void testPutLastNull() throws InterruptedException {
1151 jsr166 1.40 LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1152 jsr166 1.7 try {
1153 dl 1.1 q.putLast(null);
1154     shouldThrow();
1155 jsr166 1.9 } catch (NullPointerException success) {}
1156 jsr166 1.36 }
1157 dl 1.1
1158     /**
1159     * all elements successfully putLast are contained
1160     */
1161 jsr166 1.36 public void testPutLast() throws InterruptedException {
1162     LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1163     for (int i = 0; i < SIZE; ++i) {
1164 jsr166 1.54 Integer x = new Integer(i);
1165     q.putLast(x);
1166     assertTrue(q.contains(x));
1167 jsr166 1.36 }
1168     assertEquals(0, q.remainingCapacity());
1169 dl 1.1 }
1170    
1171     /**
1172     * putLast blocks interruptibly if full
1173     */
1174 jsr166 1.9 public void testBlockingPutLast() throws InterruptedException {
1175 jsr166 1.17 final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1176 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1177     Thread t = newStartedThread(new CheckedRunnable() {
1178 jsr166 1.17 public void realRun() throws InterruptedException {
1179     for (int i = 0; i < SIZE; ++i)
1180     q.putLast(i);
1181     assertEquals(SIZE, q.size());
1182     assertEquals(0, q.remainingCapacity());
1183 jsr166 1.39
1184     Thread.currentThread().interrupt();
1185     try {
1186     q.putLast(99);
1187     shouldThrow();
1188     } catch (InterruptedException success) {}
1189     assertFalse(Thread.interrupted());
1190    
1191     pleaseInterrupt.countDown();
1192 jsr166 1.11 try {
1193 jsr166 1.17 q.putLast(99);
1194     shouldThrow();
1195     } catch (InterruptedException success) {}
1196 jsr166 1.39 assertFalse(Thread.interrupted());
1197 jsr166 1.11 }});
1198    
1199 jsr166 1.39 await(pleaseInterrupt);
1200 jsr166 1.72 assertThreadBlocks(t, Thread.State.WAITING);
1201 jsr166 1.9 t.interrupt();
1202 jsr166 1.39 awaitTermination(t);
1203 jsr166 1.17 assertEquals(SIZE, q.size());
1204     assertEquals(0, q.remainingCapacity());
1205 dl 1.1 }
1206    
1207     /**
1208 jsr166 1.39 * putLast blocks interruptibly waiting for take when full
1209 dl 1.1 */
1210 jsr166 1.9 public void testPutLastWithTake() throws InterruptedException {
1211 jsr166 1.17 final int capacity = 2;
1212     final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
1213 jsr166 1.39 final CountDownLatch pleaseTake = new CountDownLatch(1);
1214     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1215     Thread t = newStartedThread(new CheckedRunnable() {
1216 jsr166 1.17 public void realRun() throws InterruptedException {
1217 jsr166 1.39 for (int i = 0; i < capacity; i++)
1218 jsr166 1.17 q.putLast(i);
1219 jsr166 1.39 pleaseTake.countDown();
1220     q.putLast(86);
1221    
1222     pleaseInterrupt.countDown();
1223 jsr166 1.11 try {
1224 jsr166 1.17 q.putLast(99);
1225     shouldThrow();
1226     } catch (InterruptedException success) {}
1227 jsr166 1.39 assertFalse(Thread.interrupted());
1228 jsr166 1.11 }});
1229 jsr166 1.9
1230 jsr166 1.39 await(pleaseTake);
1231 jsr166 1.44 assertEquals(0, q.remainingCapacity());
1232 jsr166 1.17 assertEquals(0, q.take());
1233 jsr166 1.39
1234     await(pleaseInterrupt);
1235 jsr166 1.72 assertThreadBlocks(t, Thread.State.WAITING);
1236 jsr166 1.9 t.interrupt();
1237 jsr166 1.39 awaitTermination(t);
1238 jsr166 1.44 assertEquals(0, q.remainingCapacity());
1239 dl 1.1 }
1240    
1241     /**
1242     * timed offerLast times out if full and elements not taken
1243     */
1244 jsr166 1.9 public void testTimedOfferLast() throws InterruptedException {
1245 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1246 jsr166 1.38 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1247     Thread t = newStartedThread(new CheckedRunnable() {
1248 jsr166 1.9 public void realRun() throws InterruptedException {
1249     q.putLast(new Object());
1250     q.putLast(new Object());
1251 jsr166 1.38 long startTime = System.nanoTime();
1252     assertFalse(q.offerLast(new Object(), timeoutMillis(), MILLISECONDS));
1253     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1254     pleaseInterrupt.countDown();
1255 jsr166 1.16 try {
1256 jsr166 1.38 q.offerLast(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
1257 jsr166 1.16 shouldThrow();
1258     } catch (InterruptedException success) {}
1259     }});
1260 jsr166 1.4
1261 jsr166 1.38 await(pleaseInterrupt);
1262 jsr166 1.72 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1263 jsr166 1.9 t.interrupt();
1264 jsr166 1.38 awaitTermination(t);
1265 dl 1.1 }
1266    
1267     /**
1268     * takeLast retrieves elements in FIFO order
1269     */
1270 jsr166 1.9 public void testTakeLast() throws InterruptedException {
1271     LinkedBlockingDeque q = populatedDeque(SIZE);
1272     for (int i = 0; i < SIZE; ++i) {
1273 jsr166 1.60 assertEquals(SIZE - i - 1, q.takeLast());
1274 jsr166 1.7 }
1275 dl 1.1 }
1276    
1277     /**
1278 jsr166 1.39 * takeLast removes existing elements until empty, then blocks interruptibly
1279 dl 1.1 */
1280 jsr166 1.39 public void testBlockingTakeLast() throws InterruptedException {
1281     final LinkedBlockingDeque q = populatedDeque(SIZE);
1282     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1283     Thread t = newStartedThread(new CheckedRunnable() {
1284 jsr166 1.9 public void realRun() throws InterruptedException {
1285 jsr166 1.69 for (int i = 0; i < SIZE; i++)
1286 jsr166 1.60 assertEquals(SIZE - i - 1, q.takeLast());
1287 jsr166 1.9
1288 jsr166 1.39 Thread.currentThread().interrupt();
1289     try {
1290     q.takeLast();
1291     shouldThrow();
1292     } catch (InterruptedException success) {}
1293     assertFalse(Thread.interrupted());
1294 dl 1.1
1295 jsr166 1.39 pleaseInterrupt.countDown();
1296 jsr166 1.17 try {
1297     q.takeLast();
1298     shouldThrow();
1299     } catch (InterruptedException success) {}
1300 jsr166 1.39 assertFalse(Thread.interrupted());
1301 jsr166 1.17 }});
1302 jsr166 1.9
1303 jsr166 1.39 await(pleaseInterrupt);
1304 jsr166 1.69 assertThreadBlocks(t, Thread.State.WAITING);
1305 jsr166 1.9 t.interrupt();
1306 jsr166 1.39 awaitTermination(t);
1307 dl 1.1 }
1308    
1309     /**
1310     * timed pollLast with zero timeout succeeds when non-empty, else times out
1311     */
1312 jsr166 1.9 public void testTimedPollLast0() throws InterruptedException {
1313     LinkedBlockingDeque q = populatedDeque(SIZE);
1314     for (int i = 0; i < SIZE; ++i) {
1315 jsr166 1.60 assertEquals(SIZE - i - 1, q.pollLast(0, MILLISECONDS));
1316 jsr166 1.7 }
1317 jsr166 1.9 assertNull(q.pollLast(0, MILLISECONDS));
1318 dl 1.1 }
1319    
1320     /**
1321     * timed pollLast with nonzero timeout succeeds when non-empty, else times out
1322     */
1323 jsr166 1.9 public void testTimedPollLast() throws InterruptedException {
1324     LinkedBlockingDeque q = populatedDeque(SIZE);
1325     for (int i = 0; i < SIZE; ++i) {
1326 jsr166 1.39 long startTime = System.nanoTime();
1327 jsr166 1.60 assertEquals(SIZE - i - 1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1328 jsr166 1.39 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1329     }
1330     long startTime = System.nanoTime();
1331     assertNull(q.pollLast(timeoutMillis(), MILLISECONDS));
1332     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1333     checkEmpty(q);
1334 dl 1.1 }
1335    
1336     /**
1337     * Interrupted timed pollLast throws InterruptedException instead of
1338     * returning timeout status
1339     */
1340 jsr166 1.9 public void testInterruptedTimedPollLast() throws InterruptedException {
1341 jsr166 1.62 final LinkedBlockingDeque q = populatedDeque(SIZE);
1342 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1343     Thread t = newStartedThread(new CheckedRunnable() {
1344 jsr166 1.9 public void realRun() throws InterruptedException {
1345 jsr166 1.62 long startTime = System.nanoTime();
1346 jsr166 1.78 for (int i = 0; i < SIZE; i++)
1347 jsr166 1.60 assertEquals(SIZE - i - 1,
1348     q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1349 jsr166 1.39
1350     Thread.currentThread().interrupt();
1351 jsr166 1.13 try {
1352 jsr166 1.39 q.pollLast(LONG_DELAY_MS, MILLISECONDS);
1353 jsr166 1.13 shouldThrow();
1354     } catch (InterruptedException success) {}
1355 jsr166 1.39 assertFalse(Thread.interrupted());
1356    
1357     pleaseInterrupt.countDown();
1358     try {
1359     q.pollLast(LONG_DELAY_MS, MILLISECONDS);
1360     shouldThrow();
1361     } catch (InterruptedException success) {}
1362     assertFalse(Thread.interrupted());
1363 jsr166 1.62
1364     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1365 jsr166 1.13 }});
1366 jsr166 1.9
1367 jsr166 1.39 await(pleaseInterrupt);
1368 jsr166 1.74 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1369 jsr166 1.9 t.interrupt();
1370 jsr166 1.39 awaitTermination(t);
1371 jsr166 1.62 checkEmpty(q);
1372 dl 1.1 }
1373    
1374     /**
1375 jsr166 1.24 * timed poll before a delayed offerLast fails; after offerLast succeeds;
1376     * on interruption throws
1377 dl 1.1 */
1378 jsr166 1.9 public void testTimedPollWithOfferLast() throws InterruptedException {
1379 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1380 jsr166 1.39 final CheckedBarrier barrier = new CheckedBarrier(2);
1381     Thread t = newStartedThread(new CheckedRunnable() {
1382 jsr166 1.9 public void realRun() throws InterruptedException {
1383 jsr166 1.39 long startTime = System.nanoTime();
1384     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
1385     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1386    
1387     barrier.await();
1388    
1389 jsr166 1.9 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
1390 jsr166 1.39
1391     Thread.currentThread().interrupt();
1392 jsr166 1.9 try {
1393     q.poll(LONG_DELAY_MS, MILLISECONDS);
1394     shouldThrow();
1395     } catch (InterruptedException success) {}
1396 jsr166 1.39 assertFalse(Thread.interrupted());
1397    
1398     barrier.await();
1399     try {
1400     q.poll(LONG_DELAY_MS, MILLISECONDS);
1401     shouldThrow();
1402     } catch (InterruptedException success) {}
1403     assertFalse(Thread.interrupted());
1404 jsr166 1.63
1405     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1406 jsr166 1.9 }});
1407    
1408 jsr166 1.39 barrier.await();
1409     long startTime = System.nanoTime();
1410     assertTrue(q.offerLast(zero, LONG_DELAY_MS, MILLISECONDS));
1411     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1412    
1413     barrier.await();
1414 jsr166 1.73 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1415 jsr166 1.9 t.interrupt();
1416 jsr166 1.39 awaitTermination(t);
1417 jsr166 1.4 }
1418 dl 1.1
1419     /**
1420     * element returns next element, or throws NSEE if empty
1421     */
1422     public void testElement() {
1423     LinkedBlockingDeque q = populatedDeque(SIZE);
1424     for (int i = 0; i < SIZE; ++i) {
1425 jsr166 1.18 assertEquals(i, q.element());
1426 dl 1.1 q.poll();
1427     }
1428     try {
1429     q.element();
1430     shouldThrow();
1431 jsr166 1.9 } catch (NoSuchElementException success) {}
1432 dl 1.1 }
1433    
1434     /**
1435     * contains(x) reports true when elements added but not yet removed
1436     */
1437     public void testContains() {
1438     LinkedBlockingDeque q = populatedDeque(SIZE);
1439     for (int i = 0; i < SIZE; ++i) {
1440     assertTrue(q.contains(new Integer(i)));
1441     q.poll();
1442     assertFalse(q.contains(new Integer(i)));
1443     }
1444     }
1445    
1446     /**
1447     * clear removes all elements
1448     */
1449     public void testClear() {
1450     LinkedBlockingDeque q = populatedDeque(SIZE);
1451     q.clear();
1452     assertTrue(q.isEmpty());
1453     assertEquals(0, q.size());
1454     assertEquals(SIZE, q.remainingCapacity());
1455     q.add(one);
1456     assertFalse(q.isEmpty());
1457     assertTrue(q.contains(one));
1458     q.clear();
1459     assertTrue(q.isEmpty());
1460     }
1461    
1462     /**
1463     * containsAll(c) is true when c contains a subset of elements
1464     */
1465     public void testContainsAll() {
1466     LinkedBlockingDeque q = populatedDeque(SIZE);
1467     LinkedBlockingDeque p = new LinkedBlockingDeque(SIZE);
1468     for (int i = 0; i < SIZE; ++i) {
1469     assertTrue(q.containsAll(p));
1470     assertFalse(p.containsAll(q));
1471     p.add(new Integer(i));
1472     }
1473     assertTrue(p.containsAll(q));
1474     }
1475    
1476     /**
1477     * retainAll(c) retains only those elements of c and reports true if changed
1478     */
1479     public void testRetainAll() {
1480     LinkedBlockingDeque q = populatedDeque(SIZE);
1481     LinkedBlockingDeque p = populatedDeque(SIZE);
1482     for (int i = 0; i < SIZE; ++i) {
1483     boolean changed = q.retainAll(p);
1484     if (i == 0)
1485     assertFalse(changed);
1486     else
1487     assertTrue(changed);
1488    
1489     assertTrue(q.containsAll(p));
1490 jsr166 1.59 assertEquals(SIZE - i, q.size());
1491 dl 1.1 p.remove();
1492     }
1493     }
1494    
1495     /**
1496     * removeAll(c) removes only those elements of c and reports true if changed
1497     */
1498     public void testRemoveAll() {
1499     for (int i = 1; i < SIZE; ++i) {
1500     LinkedBlockingDeque q = populatedDeque(SIZE);
1501     LinkedBlockingDeque p = populatedDeque(i);
1502     assertTrue(q.removeAll(p));
1503 jsr166 1.59 assertEquals(SIZE - i, q.size());
1504 dl 1.1 for (int j = 0; j < i; ++j) {
1505 jsr166 1.54 Integer x = (Integer)(p.remove());
1506     assertFalse(q.contains(x));
1507 dl 1.1 }
1508     }
1509     }
1510    
1511     /**
1512 jsr166 1.31 * toArray contains all elements in FIFO order
1513 dl 1.1 */
1514 jsr166 1.43 public void testToArray() throws InterruptedException {
1515 dl 1.1 LinkedBlockingDeque q = populatedDeque(SIZE);
1516 jsr166 1.7 Object[] o = q.toArray();
1517     for (int i = 0; i < o.length; i++)
1518 jsr166 1.31 assertSame(o[i], q.poll());
1519 dl 1.1 }
1520    
1521     /**
1522 jsr166 1.31 * toArray(a) contains all elements in FIFO order
1523 dl 1.1 */
1524 jsr166 1.31 public void testToArray2() {
1525 jsr166 1.32 LinkedBlockingDeque<Integer> q = populatedDeque(SIZE);
1526 jsr166 1.7 Integer[] ints = new Integer[SIZE];
1527 jsr166 1.32 Integer[] array = q.toArray(ints);
1528     assertSame(ints, array);
1529 jsr166 1.9 for (int i = 0; i < ints.length; i++)
1530 jsr166 1.31 assertSame(ints[i], q.remove());
1531 dl 1.1 }
1532    
1533     /**
1534 jsr166 1.29 * toArray(incompatible array type) throws ArrayStoreException
1535 dl 1.1 */
1536     public void testToArray1_BadArg() {
1537 jsr166 1.18 LinkedBlockingDeque q = populatedDeque(SIZE);
1538 jsr166 1.7 try {
1539 jsr166 1.29 q.toArray(new String[10]);
1540 jsr166 1.7 shouldThrow();
1541 jsr166 1.9 } catch (ArrayStoreException success) {}
1542 dl 1.1 }
1543    
1544     /**
1545     * iterator iterates through all elements
1546     */
1547 jsr166 1.9 public void testIterator() throws InterruptedException {
1548 dl 1.1 LinkedBlockingDeque q = populatedDeque(SIZE);
1549 jsr166 1.7 Iterator it = q.iterator();
1550 jsr166 1.55 int i;
1551     for (i = 0; it.hasNext(); i++)
1552     assertTrue(q.contains(it.next()));
1553     assertEquals(i, SIZE);
1554     assertIteratorExhausted(it);
1555    
1556     it = q.iterator();
1557     for (i = 0; it.hasNext(); i++)
1558 jsr166 1.9 assertEquals(it.next(), q.take());
1559 jsr166 1.55 assertEquals(i, SIZE);
1560     assertIteratorExhausted(it);
1561     }
1562    
1563     /**
1564     * iterator of empty collection has no elements
1565     */
1566     public void testEmptyIterator() {
1567     Deque c = new LinkedBlockingDeque();
1568     assertIteratorExhausted(c.iterator());
1569     assertIteratorExhausted(c.descendingIterator());
1570 dl 1.1 }
1571    
1572     /**
1573     * iterator.remove removes current element
1574     */
1575 jsr166 1.21 public void testIteratorRemove() {
1576 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1577     q.add(two);
1578     q.add(one);
1579     q.add(three);
1580    
1581     Iterator it = q.iterator();
1582     it.next();
1583     it.remove();
1584 jsr166 1.4
1585 dl 1.1 it = q.iterator();
1586 jsr166 1.20 assertSame(it.next(), one);
1587     assertSame(it.next(), three);
1588 dl 1.1 assertFalse(it.hasNext());
1589     }
1590    
1591     /**
1592     * iterator ordering is FIFO
1593     */
1594     public void testIteratorOrdering() {
1595     final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1596     q.add(one);
1597     q.add(two);
1598     q.add(three);
1599     assertEquals(0, q.remainingCapacity());
1600     int k = 0;
1601     for (Iterator it = q.iterator(); it.hasNext();) {
1602 jsr166 1.18 assertEquals(++k, it.next());
1603 dl 1.1 }
1604     assertEquals(3, k);
1605     }
1606    
1607     /**
1608     * Modifications do not cause iterators to fail
1609     */
1610 jsr166 1.21 public void testWeaklyConsistentIteration() {
1611 dl 1.1 final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
1612     q.add(one);
1613     q.add(two);
1614     q.add(three);
1615 jsr166 1.9 for (Iterator it = q.iterator(); it.hasNext();) {
1616     q.remove();
1617     it.next();
1618 dl 1.1 }
1619     assertEquals(0, q.size());
1620     }
1621    
1622     /**
1623 jsr166 1.25 * Descending iterator iterates through all elements
1624 dl 1.2 */
1625     public void testDescendingIterator() {
1626     LinkedBlockingDeque q = populatedDeque(SIZE);
1627     int i = 0;
1628 jsr166 1.7 Iterator it = q.descendingIterator();
1629 jsr166 1.5 while (it.hasNext()) {
1630 dl 1.2 assertTrue(q.contains(it.next()));
1631     ++i;
1632     }
1633     assertEquals(i, SIZE);
1634     assertFalse(it.hasNext());
1635     try {
1636     it.next();
1637 jsr166 1.9 shouldThrow();
1638     } catch (NoSuchElementException success) {}
1639 dl 1.2 }
1640    
1641     /**
1642 jsr166 1.25 * Descending iterator ordering is reverse FIFO
1643 dl 1.2 */
1644     public void testDescendingIteratorOrdering() {
1645     final LinkedBlockingDeque q = new LinkedBlockingDeque();
1646 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
1647     q.add(new Integer(3));
1648     q.add(new Integer(2));
1649     q.add(new Integer(1));
1650     int k = 0;
1651     for (Iterator it = q.descendingIterator(); it.hasNext();) {
1652 jsr166 1.18 assertEquals(++k, it.next());
1653 dl 1.3 }
1654 jsr166 1.4
1655 dl 1.3 assertEquals(3, k);
1656     q.remove();
1657     q.remove();
1658     q.remove();
1659 dl 1.2 }
1660     }
1661    
1662     /**
1663     * descendingIterator.remove removes current element
1664     */
1665 jsr166 1.21 public void testDescendingIteratorRemove() {
1666 dl 1.2 final LinkedBlockingDeque q = new LinkedBlockingDeque();
1667 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
1668     q.add(new Integer(3));
1669     q.add(new Integer(2));
1670     q.add(new Integer(1));
1671     Iterator it = q.descendingIterator();
1672     assertEquals(it.next(), new Integer(1));
1673     it.remove();
1674     assertEquals(it.next(), new Integer(2));
1675     it = q.descendingIterator();
1676     assertEquals(it.next(), new Integer(2));
1677     assertEquals(it.next(), new Integer(3));
1678     it.remove();
1679     assertFalse(it.hasNext());
1680     q.remove();
1681     }
1682 dl 1.2 }
1683    
1684     /**
1685 dl 1.1 * toString contains toStrings of elements
1686     */
1687     public void testToString() {
1688     LinkedBlockingDeque q = populatedDeque(SIZE);
1689     String s = q.toString();
1690     for (int i = 0; i < SIZE; ++i) {
1691 jsr166 1.39 assertTrue(s.contains(String.valueOf(i)));
1692 dl 1.1 }
1693 jsr166 1.4 }
1694 dl 1.1
1695     /**
1696     * offer transfers elements across Executor tasks
1697     */
1698     public void testOfferInExecutor() {
1699     final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1700     q.add(one);
1701     q.add(two);
1702 jsr166 1.39 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1703 jsr166 1.61 final ExecutorService executor = Executors.newFixedThreadPool(2);
1704     try (PoolCleaner cleaner = cleaner(executor)) {
1705     executor.execute(new CheckedRunnable() {
1706     public void realRun() throws InterruptedException {
1707     assertFalse(q.offer(three));
1708     threadsStarted.await();
1709     assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
1710     assertEquals(0, q.remainingCapacity());
1711     }});
1712    
1713     executor.execute(new CheckedRunnable() {
1714     public void realRun() throws InterruptedException {
1715     threadsStarted.await();
1716     assertSame(one, q.take());
1717     }});
1718     }
1719 dl 1.1 }
1720    
1721     /**
1722 jsr166 1.39 * timed poll retrieves elements across Executor threads
1723 dl 1.1 */
1724     public void testPollInExecutor() {
1725     final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
1726 jsr166 1.39 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1727 jsr166 1.61 final ExecutorService executor = Executors.newFixedThreadPool(2);
1728     try (PoolCleaner cleaner = cleaner(executor)) {
1729     executor.execute(new CheckedRunnable() {
1730     public void realRun() throws InterruptedException {
1731     assertNull(q.poll());
1732     threadsStarted.await();
1733     assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
1734     checkEmpty(q);
1735     }});
1736    
1737     executor.execute(new CheckedRunnable() {
1738     public void realRun() throws InterruptedException {
1739     threadsStarted.await();
1740     q.put(one);
1741     }});
1742     }
1743 dl 1.1 }
1744    
1745     /**
1746     * A deserialized serialized deque has same elements in same order
1747     */
1748 jsr166 1.9 public void testSerialization() throws Exception {
1749 jsr166 1.41 Queue x = populatedDeque(SIZE);
1750     Queue y = serialClone(x);
1751 dl 1.1
1752 jsr166 1.49 assertNotSame(y, x);
1753 jsr166 1.41 assertEquals(x.size(), y.size());
1754     assertEquals(x.toString(), y.toString());
1755     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
1756     while (!x.isEmpty()) {
1757     assertFalse(y.isEmpty());
1758     assertEquals(x.remove(), y.remove());
1759     }
1760     assertTrue(y.isEmpty());
1761 dl 1.1 }
1762    
1763     /**
1764     * drainTo(c) empties deque into another collection c
1765 jsr166 1.4 */
1766 dl 1.1 public void testDrainTo() {
1767     LinkedBlockingDeque q = populatedDeque(SIZE);
1768     ArrayList l = new ArrayList();
1769     q.drainTo(l);
1770 jsr166 1.44 assertEquals(0, q.size());
1771     assertEquals(SIZE, l.size());
1772 jsr166 1.4 for (int i = 0; i < SIZE; ++i)
1773 dl 1.1 assertEquals(l.get(i), new Integer(i));
1774     q.add(zero);
1775     q.add(one);
1776     assertFalse(q.isEmpty());
1777     assertTrue(q.contains(zero));
1778     assertTrue(q.contains(one));
1779     l.clear();
1780     q.drainTo(l);
1781 jsr166 1.44 assertEquals(0, q.size());
1782     assertEquals(2, l.size());
1783 jsr166 1.4 for (int i = 0; i < 2; ++i)
1784 dl 1.1 assertEquals(l.get(i), new Integer(i));
1785     }
1786    
1787     /**
1788     * drainTo empties full deque, unblocking a waiting put.
1789 jsr166 1.4 */
1790 jsr166 1.9 public void testDrainToWithActivePut() throws InterruptedException {
1791 dl 1.1 final LinkedBlockingDeque q = populatedDeque(SIZE);
1792 jsr166 1.9 Thread t = new Thread(new CheckedRunnable() {
1793     public void realRun() throws InterruptedException {
1794 jsr166 1.59 q.put(new Integer(SIZE + 1));
1795 jsr166 1.9 }});
1796    
1797     t.start();
1798     ArrayList l = new ArrayList();
1799     q.drainTo(l);
1800     assertTrue(l.size() >= SIZE);
1801     for (int i = 0; i < SIZE; ++i)
1802     assertEquals(l.get(i), new Integer(i));
1803     t.join();
1804     assertTrue(q.size() + l.size() >= SIZE);
1805 dl 1.1 }
1806    
1807     /**
1808 jsr166 1.26 * drainTo(c, n) empties first min(n, size) elements of queue into c
1809 jsr166 1.4 */
1810 dl 1.1 public void testDrainToN() {
1811     LinkedBlockingDeque q = new LinkedBlockingDeque();
1812     for (int i = 0; i < SIZE + 2; ++i) {
1813 jsr166 1.5 for (int j = 0; j < SIZE; j++)
1814 dl 1.1 assertTrue(q.offer(new Integer(j)));
1815     ArrayList l = new ArrayList();
1816     q.drainTo(l, i);
1817 jsr166 1.27 int k = (i < SIZE) ? i : SIZE;
1818 jsr166 1.45 assertEquals(k, l.size());
1819 jsr166 1.59 assertEquals(SIZE - k, q.size());
1820 jsr166 1.4 for (int j = 0; j < k; ++j)
1821 dl 1.1 assertEquals(l.get(j), new Integer(j));
1822 jsr166 1.52 do {} while (q.poll() != null);
1823 dl 1.1 }
1824     }
1825    
1826 jsr166 1.50 /**
1827     * remove(null), contains(null) always return false
1828     */
1829     public void testNeverContainsNull() {
1830     Deque<?>[] qs = {
1831     new LinkedBlockingDeque<Object>(),
1832     populatedDeque(2),
1833     };
1834    
1835     for (Deque<?> q : qs) {
1836     assertFalse(q.contains(null));
1837     assertFalse(q.remove(null));
1838     assertFalse(q.removeFirstOccurrence(null));
1839     assertFalse(q.removeLastOccurrence(null));
1840     }
1841     }
1842    
1843 dl 1.1 }