ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.85
Committed: Thu Sep 5 20:54:24 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.84: +1 -3 lines
Log Message:
testTimedOffer: rely on awaitTermination together with LONGER_DELAY_MS

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