ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
Revision: 1.88
Committed: Tue Jan 26 13:33:06 2021 UTC (3 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.87: +319 -328 lines
Log Message:
Replace Integer with Item class

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 dl 1.88 public Object makeElement(int i) { return JSR166TestCase.itemFor(i); }
48 jsr166 1.66 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 dl 1.88 * Items 0 ... n - 1.
60 dl 1.1 */
61 dl 1.88 private static LinkedBlockingDeque<Item> populatedDeque(int n) {
62     LinkedBlockingDeque<Item> q =
63     new LinkedBlockingDeque<Item>(n);
64 dl 1.1 assertTrue(q.isEmpty());
65 jsr166 1.7 for (int i = 0; i < n; i++)
66 dl 1.88 mustOffer(q, i);
67 dl 1.1 assertFalse(q.isEmpty());
68 dl 1.88 mustEqual(0, q.remainingCapacity());
69     mustEqual(n, q.size());
70     mustEqual(0, q.peekFirst());
71     mustEqual((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 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
80 dl 1.1 assertTrue(q.isEmpty());
81 dl 1.88 q.add(one);
82 dl 1.1 assertFalse(q.isEmpty());
83 dl 1.88 q.add(two);
84 dl 1.1 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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
94 dl 1.1 for (int i = 0; i < SIZE; ++i) {
95 dl 1.88 mustEqual(SIZE - i, q.size());
96 dl 1.1 q.removeFirst();
97     }
98     for (int i = 0; i < SIZE; ++i) {
99 dl 1.88 mustEqual(i, q.size());
100     mustAdd(q, one);
101 dl 1.1 }
102     }
103    
104     /**
105 jsr166 1.40 * offerFirst(null) throws NullPointerException
106 dl 1.1 */
107     public void testOfferFirstNull() {
108 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
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 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
120 jsr166 1.40 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 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
131     assertTrue(q.offerFirst(zero));
132     assertTrue(q.offerFirst(two));
133 dl 1.1 }
134    
135     /**
136 jsr166 1.4 * OfferLast succeeds
137 dl 1.1 */
138     public void testOfferLast() {
139 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
140     assertTrue(q.offerLast(zero));
141     assertTrue(q.offerLast(one));
142 dl 1.1 }
143    
144     /**
145 jsr166 1.25 * pollFirst succeeds unless empty
146 dl 1.1 */
147     public void testPollFirst() {
148 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
149 dl 1.1 for (int i = 0; i < SIZE; ++i) {
150 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
160 jsr166 1.59 for (int i = SIZE - 1; i >= 0; --i) {
161 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
171 dl 1.1 for (int i = 0; i < SIZE; ++i) {
172 dl 1.88 mustEqual(i, q.peekFirst());
173     mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
185 dl 1.1 for (int i = 0; i < SIZE; ++i) {
186 dl 1.88 mustEqual(i, q.peek());
187     mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
199 jsr166 1.59 for (int i = SIZE - 1; i >= 0; --i) {
200 dl 1.88 mustEqual(i, q.peekLast());
201     mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
213 dl 1.1 for (int i = 0; i < SIZE; ++i) {
214 dl 1.88 mustEqual(i, q.getFirst());
215     mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
229 jsr166 1.59 for (int i = SIZE - 1; i >= 0; --i) {
230 dl 1.88 mustEqual(i, q.getLast());
231     mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
245 dl 1.1 for (int i = 0; i < SIZE; ++i) {
246 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
260 jsr166 1.15 for (int i = SIZE - 1; i >= 0; --i) {
261 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
275 dl 1.1 for (int i = 0; i < SIZE; ++i) {
276 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
289 jsr166 1.53 for (int i = 1; i < SIZE; i += 2) {
290 dl 1.88 assertTrue(q.removeFirstOccurrence(itemFor(i)));
291 dl 1.1 }
292 jsr166 1.53 for (int i = 0; i < SIZE; i += 2) {
293 dl 1.88 assertTrue(q.removeFirstOccurrence(itemFor(i)));
294     assertFalse(q.removeFirstOccurrence(itemFor(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
304 jsr166 1.53 for (int i = 1; i < SIZE; i += 2) {
305 dl 1.88 assertTrue(q.removeLastOccurrence(itemFor(i)));
306 dl 1.1 }
307 jsr166 1.53 for (int i = 0; i < SIZE; i += 2) {
308 dl 1.88 assertTrue(q.removeLastOccurrence(itemFor(i)));
309     assertFalse(q.removeLastOccurrence(itemFor(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(3);
319 dl 1.1 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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(3);
329 dl 1.1 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 dl 1.88 mustEqual(SIZE, new LinkedBlockingDeque<Item>(SIZE).remainingCapacity());
340     mustEqual(Integer.MAX_VALUE, new LinkedBlockingDeque<Item>().remainingCapacity());
341 dl 1.1 }
342    
343     /**
344 jsr166 1.40 * Constructor throws IllegalArgumentException if capacity argument nonpositive
345 dl 1.1 */
346     public void testConstructor2() {
347     try {
348 dl 1.88 new LinkedBlockingDeque<Item>(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 dl 1.88 new LinkedBlockingDeque<Item>(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 dl 1.88 Collection<Item> elements = Arrays.asList(new Item[SIZE]);
368 dl 1.1 try {
369 dl 1.88 new LinkedBlockingDeque<Item>(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 dl 1.88 Item[] items = new Item[2];
380     items[0] = zero;
381     Collection<Item> elements = Arrays.asList(items);
382 dl 1.1 try {
383 dl 1.88 new LinkedBlockingDeque<Item>(elements);
384 dl 1.1 shouldThrow();
385 jsr166 1.9 } catch (NullPointerException success) {}
386 dl 1.1 }
387    
388     /**
389     * Deque contains all elements of collection used to initialize
390     */
391     public void testConstructor6() {
392 dl 1.88 Item[] items = defaultItems;
393     LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(Arrays.asList(items));
394 jsr166 1.12 for (int i = 0; i < SIZE; ++i)
395 dl 1.88 mustEqual(items[i], q.poll());
396 dl 1.1 }
397    
398     /**
399     * Deque transitions from empty to full when elements added
400     */
401     public void testEmptyFull() {
402 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
403 dl 1.1 assertTrue(q.isEmpty());
404 dl 1.88 mustEqual(2, q.remainingCapacity());
405 dl 1.1 q.add(one);
406     assertFalse(q.isEmpty());
407     q.add(two);
408     assertFalse(q.isEmpty());
409 dl 1.88 mustEqual(0, q.remainingCapacity());
410 dl 1.1 assertFalse(q.offer(three));
411     }
412    
413     /**
414     * remainingCapacity decreases on add, increases on remove
415     */
416     public void testRemainingCapacity() {
417 dl 1.88 BlockingQueue<Item> q = populatedDeque(SIZE);
418 dl 1.1 for (int i = 0; i < SIZE; ++i) {
419 dl 1.88 mustEqual(i, q.remainingCapacity());
420     mustEqual(SIZE, q.size() + q.remainingCapacity());
421     mustEqual(i, q.remove());
422 dl 1.1 }
423     for (int i = 0; i < SIZE; ++i) {
424 dl 1.88 mustEqual(SIZE - i, q.remainingCapacity());
425     mustEqual(SIZE, q.size() + q.remainingCapacity());
426     mustAdd(q, i);
427 dl 1.1 }
428     }
429    
430     /**
431     * push(null) throws NPE
432     */
433     public void testPushNull() {
434 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(1);
435 jsr166 1.7 try {
436 dl 1.1 q.push(null);
437     shouldThrow();
438 jsr166 1.9 } catch (NullPointerException success) {}
439 dl 1.1 }
440    
441     /**
442 jsr166 1.81 * push succeeds if not full; throws IllegalStateException if full
443 dl 1.1 */
444     public void testPush() {
445 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
446 jsr166 1.58 for (int i = 0; i < SIZE; ++i) {
447 dl 1.88 Item x = itemFor(i);
448 jsr166 1.58 q.push(x);
449 dl 1.88 mustEqual(x, q.peek());
450 jsr166 1.58 }
451 dl 1.88 mustEqual(0, q.remainingCapacity());
452 jsr166 1.7 try {
453 dl 1.88 q.push(itemFor(SIZE));
454 jsr166 1.9 shouldThrow();
455     } catch (IllegalStateException success) {}
456 dl 1.1 }
457    
458     /**
459     * peekFirst returns element inserted with push
460     */
461     public void testPushWithPeek() {
462 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(3);
463 dl 1.1 q.pollLast();
464 jsr166 1.7 q.push(four);
465 jsr166 1.20 assertSame(four, q.peekFirst());
466 jsr166 1.4 }
467 dl 1.1
468     /**
469 jsr166 1.25 * pop removes next element, or throws NSEE if empty
470 dl 1.1 */
471     public void testPop() {
472 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
473 dl 1.1 for (int i = 0; i < SIZE; ++i) {
474 dl 1.88 mustEqual(i, q.pop());
475 dl 1.1 }
476     try {
477     q.pop();
478     shouldThrow();
479 jsr166 1.9 } catch (NoSuchElementException success) {}
480 dl 1.1 }
481    
482     /**
483     * Offer succeeds if not full; fails if full
484     */
485     public void testOffer() {
486 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(1);
487 dl 1.1 assertTrue(q.offer(zero));
488     assertFalse(q.offer(one));
489     }
490    
491     /**
492 jsr166 1.81 * add succeeds if not full; throws IllegalStateException if full
493 dl 1.1 */
494     public void testAdd() {
495 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
496 jsr166 1.40 for (int i = 0; i < SIZE; ++i)
497 dl 1.88 mustAdd(q, i);
498     mustEqual(0, q.remainingCapacity());
499 jsr166 1.7 try {
500 dl 1.88 q.add(itemFor(SIZE));
501 jsr166 1.9 shouldThrow();
502     } catch (IllegalStateException success) {}
503 dl 1.1 }
504    
505     /**
506 jsr166 1.81 * addAll(this) throws IllegalArgumentException
507 dl 1.1 */
508     public void testAddAllSelf() {
509 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
510 dl 1.1 try {
511     q.addAll(q);
512     shouldThrow();
513 jsr166 1.9 } catch (IllegalArgumentException success) {}
514 dl 1.1 }
515    
516     /**
517     * addAll of a collection with any null elements throws NPE after
518     * possibly adding some elements
519     */
520     public void testAddAll3() {
521 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
522     Item[] items = new Item[2]; items[0] = zero;
523     Collection<Item> elements = Arrays.asList(items);
524 dl 1.1 try {
525 jsr166 1.40 q.addAll(elements);
526 dl 1.1 shouldThrow();
527 jsr166 1.9 } catch (NullPointerException success) {}
528 dl 1.1 }
529 jsr166 1.22
530 dl 1.1 /**
531 jsr166 1.40 * addAll throws IllegalStateException if not enough room
532 dl 1.1 */
533     public void testAddAll4() {
534 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE - 1);
535     Item[] items = defaultItems;
536     Collection<Item> elements = Arrays.asList(items);
537 dl 1.1 try {
538 jsr166 1.40 q.addAll(elements);
539 dl 1.1 shouldThrow();
540 jsr166 1.9 } catch (IllegalStateException success) {}
541 dl 1.1 }
542 jsr166 1.16
543 dl 1.1 /**
544     * Deque contains all elements, in traversal order, of successful addAll
545     */
546     public void testAddAll5() {
547 dl 1.88 Item[] empty = new Item[0];
548     Item[] items = defaultItems;
549     LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
550 jsr166 1.12 assertFalse(q.addAll(Arrays.asList(empty)));
551 dl 1.88 assertTrue(q.addAll(Arrays.asList(items)));
552 jsr166 1.12 for (int i = 0; i < SIZE; ++i)
553 dl 1.88 mustEqual(items[i], q.poll());
554 dl 1.1 }
555    
556     /**
557     * all elements successfully put are contained
558     */
559 jsr166 1.10 public void testPut() throws InterruptedException {
560 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
561 jsr166 1.10 for (int i = 0; i < SIZE; ++i) {
562 dl 1.88 Item x = itemFor(i);
563 jsr166 1.54 q.put(x);
564 dl 1.88 mustContain(q, x);
565 jsr166 1.10 }
566 dl 1.88 mustEqual(0, q.remainingCapacity());
567 dl 1.1 }
568    
569     /**
570     * put blocks interruptibly if full
571     */
572 jsr166 1.9 public void testBlockingPut() throws InterruptedException {
573 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
574 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
575     Thread t = newStartedThread(new CheckedRunnable() {
576 jsr166 1.17 public void realRun() throws InterruptedException {
577     for (int i = 0; i < SIZE; ++i)
578 dl 1.88 q.put(itemFor(i));
579     mustEqual(SIZE, q.size());
580     mustEqual(0, q.remainingCapacity());
581 jsr166 1.39
582     Thread.currentThread().interrupt();
583 jsr166 1.9 try {
584 dl 1.88 q.put(ninetynine);
585 jsr166 1.17 shouldThrow();
586     } catch (InterruptedException success) {}
587 jsr166 1.39 assertFalse(Thread.interrupted());
588    
589     pleaseInterrupt.countDown();
590     try {
591 dl 1.88 q.put(ninetynine);
592 jsr166 1.39 shouldThrow();
593     } catch (InterruptedException success) {}
594     assertFalse(Thread.interrupted());
595 jsr166 1.9 }});
596    
597 jsr166 1.39 await(pleaseInterrupt);
598 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
599 jsr166 1.9 t.interrupt();
600 jsr166 1.39 awaitTermination(t);
601 dl 1.88 mustEqual(SIZE, q.size());
602     mustEqual(0, q.remainingCapacity());
603 dl 1.1 }
604    
605     /**
606 jsr166 1.39 * put blocks interruptibly waiting for take when full
607 dl 1.1 */
608 jsr166 1.9 public void testPutWithTake() throws InterruptedException {
609 jsr166 1.17 final int capacity = 2;
610 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(capacity);
611 jsr166 1.39 final CountDownLatch pleaseTake = new CountDownLatch(1);
612     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
613     Thread t = newStartedThread(new CheckedRunnable() {
614 jsr166 1.17 public void realRun() throws InterruptedException {
615 jsr166 1.39 for (int i = 0; i < capacity; i++)
616 dl 1.88 q.put(itemFor(i));
617 jsr166 1.39 pleaseTake.countDown();
618 dl 1.88 q.put(eightysix);
619 jsr166 1.39
620 jsr166 1.79 Thread.currentThread().interrupt();
621     try {
622 dl 1.88 q.put(ninetynine);
623 jsr166 1.79 shouldThrow();
624     } catch (InterruptedException success) {}
625     assertFalse(Thread.interrupted());
626    
627 jsr166 1.39 pleaseInterrupt.countDown();
628 jsr166 1.10 try {
629 dl 1.88 q.put(ninetynine);
630 jsr166 1.17 shouldThrow();
631     } catch (InterruptedException success) {}
632 jsr166 1.39 assertFalse(Thread.interrupted());
633 jsr166 1.10 }});
634 jsr166 1.9
635 jsr166 1.39 await(pleaseTake);
636 dl 1.88 mustEqual(0, q.remainingCapacity());
637     mustEqual(0, q.take());
638 jsr166 1.39
639     await(pleaseInterrupt);
640 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
641 jsr166 1.9 t.interrupt();
642 jsr166 1.39 awaitTermination(t);
643 dl 1.88 mustEqual(0, q.remainingCapacity());
644 dl 1.1 }
645    
646     /**
647     * timed offer times out if full and elements not taken
648     */
649 jsr166 1.80 public void testTimedOffer() {
650 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
651 jsr166 1.38 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
652     Thread t = newStartedThread(new CheckedRunnable() {
653 jsr166 1.9 public void realRun() throws InterruptedException {
654 dl 1.88 q.put(zero);
655     q.put(one);
656 jsr166 1.38 long startTime = System.nanoTime();
657 jsr166 1.84
658 dl 1.88 assertFalse(q.offer(two, timeoutMillis(), MILLISECONDS));
659 jsr166 1.38 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
660 jsr166 1.80
661     Thread.currentThread().interrupt();
662     try {
663 dl 1.88 q.offer(three, randomTimeout(), randomTimeUnit());
664 jsr166 1.80 shouldThrow();
665     } catch (InterruptedException success) {}
666     assertFalse(Thread.interrupted());
667    
668 jsr166 1.38 pleaseInterrupt.countDown();
669 jsr166 1.16 try {
670 dl 1.88 q.offer(four, LONGER_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.84 if (randomBoolean()) 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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
687 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
688 dl 1.88 mustEqual(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 dl 1.88 final LinkedBlockingDeque<Item> 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 dl 1.88 for (int i = 0; i < SIZE; i++) mustEqual(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.84 if (randomBoolean()) 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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
728 dl 1.1 for (int i = 0; i < SIZE; ++i) {
729 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
739 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
740 dl 1.88 mustEqual(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 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
750 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
751 jsr166 1.39 long startTime = System.nanoTime();
752 dl 1.88 mustEqual(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
753 jsr166 1.39 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 dl 1.88 final BlockingQueue<Item> 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.78 for (int i = 0; i < SIZE; i++)
771 dl 1.88 mustEqual(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
772 jsr166 1.78
773     Thread.currentThread().interrupt();
774     try {
775 jsr166 1.84 q.poll(randomTimeout(), randomTimeUnit());
776 jsr166 1.78 shouldThrow();
777     } catch (InterruptedException success) {}
778     assertFalse(Thread.interrupted());
779 jsr166 1.76
780     pleaseInterrupt.countDown();
781 jsr166 1.13 try {
782 jsr166 1.86 q.poll(LONGER_DELAY_MS, MILLISECONDS);
783 jsr166 1.13 shouldThrow();
784 jsr166 1.76 } catch (InterruptedException success) {}
785     assertFalse(Thread.interrupted());
786 jsr166 1.13 }});
787 jsr166 1.9
788 jsr166 1.76 await(pleaseInterrupt);
789 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
790 jsr166 1.9 t.interrupt();
791 jsr166 1.62 awaitTermination(t);
792 jsr166 1.34 checkEmpty(q);
793 dl 1.1 }
794    
795     /**
796     * putFirst(null) throws NPE
797     */
798 jsr166 1.36 public void testPutFirstNull() throws InterruptedException {
799 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
800 jsr166 1.7 try {
801 dl 1.1 q.putFirst(null);
802     shouldThrow();
803 jsr166 1.9 } catch (NullPointerException success) {}
804 jsr166 1.36 }
805 dl 1.1
806     /**
807     * all elements successfully putFirst are contained
808     */
809 jsr166 1.36 public void testPutFirst() throws InterruptedException {
810 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
811 jsr166 1.36 for (int i = 0; i < SIZE; ++i) {
812 dl 1.88 Item x = itemFor(i);
813 jsr166 1.54 q.putFirst(x);
814 dl 1.88 mustContain(q, x);
815 jsr166 1.36 }
816 dl 1.88 mustEqual(0, q.remainingCapacity());
817 dl 1.1 }
818    
819     /**
820     * putFirst blocks interruptibly if full
821     */
822 jsr166 1.9 public void testBlockingPutFirst() throws InterruptedException {
823 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
824 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
825     Thread t = newStartedThread(new CheckedRunnable() {
826 jsr166 1.17 public void realRun() throws InterruptedException {
827     for (int i = 0; i < SIZE; ++i)
828 dl 1.88 q.putFirst(itemFor(i));
829     mustEqual(SIZE, q.size());
830     mustEqual(0, q.remainingCapacity());
831 jsr166 1.39
832     Thread.currentThread().interrupt();
833     try {
834 dl 1.88 q.putFirst(ninetynine);
835 jsr166 1.39 shouldThrow();
836     } catch (InterruptedException success) {}
837     assertFalse(Thread.interrupted());
838    
839     pleaseInterrupt.countDown();
840 jsr166 1.11 try {
841 dl 1.88 q.putFirst(ninetynine);
842 jsr166 1.17 shouldThrow();
843     } catch (InterruptedException success) {}
844 jsr166 1.39 assertFalse(Thread.interrupted());
845 jsr166 1.11 }});
846 jsr166 1.9
847 jsr166 1.39 await(pleaseInterrupt);
848 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
849 jsr166 1.9 t.interrupt();
850 jsr166 1.39 awaitTermination(t);
851 dl 1.88 mustEqual(SIZE, q.size());
852     mustEqual(0, q.remainingCapacity());
853 dl 1.1 }
854    
855     /**
856 jsr166 1.39 * putFirst blocks interruptibly waiting for take when full
857 dl 1.1 */
858 jsr166 1.9 public void testPutFirstWithTake() throws InterruptedException {
859 jsr166 1.17 final int capacity = 2;
860 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(capacity);
861 jsr166 1.39 final CountDownLatch pleaseTake = new CountDownLatch(1);
862     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
863     Thread t = newStartedThread(new CheckedRunnable() {
864 jsr166 1.17 public void realRun() throws InterruptedException {
865 jsr166 1.39 for (int i = 0; i < capacity; i++)
866 dl 1.88 q.putFirst(itemFor(i));
867 jsr166 1.39 pleaseTake.countDown();
868 dl 1.88 q.putFirst(eightysix);
869 jsr166 1.39
870     pleaseInterrupt.countDown();
871 jsr166 1.11 try {
872 dl 1.88 q.putFirst(ninetynine);
873 jsr166 1.17 shouldThrow();
874     } catch (InterruptedException success) {}
875 jsr166 1.39 assertFalse(Thread.interrupted());
876 jsr166 1.11 }});
877 jsr166 1.9
878 jsr166 1.39 await(pleaseTake);
879 dl 1.88 mustEqual(0, q.remainingCapacity());
880     mustEqual(capacity - 1, q.take());
881 jsr166 1.39
882     await(pleaseInterrupt);
883 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
884 jsr166 1.9 t.interrupt();
885 jsr166 1.39 awaitTermination(t);
886 dl 1.88 mustEqual(0, q.remainingCapacity());
887 dl 1.1 }
888    
889     /**
890     * timed offerFirst times out if full and elements not taken
891     */
892 jsr166 1.80 public void testTimedOfferFirst() {
893 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
894 jsr166 1.38 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
895     Thread t = newStartedThread(new CheckedRunnable() {
896 jsr166 1.9 public void realRun() throws InterruptedException {
897 dl 1.88 q.putFirst(zero);
898     q.putFirst(one);
899 jsr166 1.38 long startTime = System.nanoTime();
900 jsr166 1.84
901 dl 1.88 assertFalse(q.offerFirst(two, timeoutMillis(), MILLISECONDS));
902 jsr166 1.38 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
903 jsr166 1.80
904     Thread.currentThread().interrupt();
905     try {
906 dl 1.88 q.offerFirst(three, randomTimeout(), randomTimeUnit());
907 jsr166 1.80 shouldThrow();
908     } catch (InterruptedException success) {}
909     assertFalse(Thread.interrupted());
910    
911 jsr166 1.38 pleaseInterrupt.countDown();
912 jsr166 1.16 try {
913 dl 1.88 q.offerFirst(four, LONGER_DELAY_MS, MILLISECONDS);
914 jsr166 1.16 shouldThrow();
915     } catch (InterruptedException success) {}
916 jsr166 1.77 assertFalse(Thread.interrupted());
917 jsr166 1.16 }});
918 jsr166 1.4
919 jsr166 1.38 await(pleaseInterrupt);
920 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
921 jsr166 1.9 t.interrupt();
922 jsr166 1.38 awaitTermination(t);
923 dl 1.1 }
924    
925     /**
926     * take retrieves elements in FIFO order
927     */
928 jsr166 1.9 public void testTakeFirst() throws InterruptedException {
929 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
930 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
931 dl 1.88 mustEqual(i, q.takeFirst());
932 jsr166 1.7 }
933 dl 1.1 }
934    
935     /**
936 jsr166 1.39 * takeFirst() blocks interruptibly when empty
937     */
938     public void testTakeFirstFromEmptyBlocksInterruptibly() {
939 dl 1.88 final BlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
940 jsr166 1.39 final CountDownLatch threadStarted = new CountDownLatch(1);
941     Thread t = newStartedThread(new CheckedRunnable() {
942     public void realRun() {
943     threadStarted.countDown();
944     try {
945     q.takeFirst();
946     shouldThrow();
947     } catch (InterruptedException success) {}
948     assertFalse(Thread.interrupted());
949     }});
950    
951     await(threadStarted);
952 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
953 jsr166 1.39 t.interrupt();
954     awaitTermination(t);
955     }
956    
957     /**
958     * takeFirst() throws InterruptedException immediately if interrupted
959     * before waiting
960     */
961     public void testTakeFirstFromEmptyAfterInterrupt() {
962 dl 1.88 final BlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
963 jsr166 1.39 Thread t = newStartedThread(new CheckedRunnable() {
964     public void realRun() {
965     Thread.currentThread().interrupt();
966     try {
967     q.takeFirst();
968     shouldThrow();
969     } catch (InterruptedException success) {}
970     assertFalse(Thread.interrupted());
971     }});
972    
973     awaitTermination(t);
974     }
975    
976     /**
977     * takeLast() blocks interruptibly when empty
978 dl 1.1 */
979 jsr166 1.39 public void testTakeLastFromEmptyBlocksInterruptibly() {
980 dl 1.88 final BlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
981 jsr166 1.39 final CountDownLatch threadStarted = new CountDownLatch(1);
982     Thread t = newStartedThread(new CheckedRunnable() {
983     public void realRun() {
984     threadStarted.countDown();
985     try {
986     q.takeLast();
987     shouldThrow();
988     } catch (InterruptedException success) {}
989     assertFalse(Thread.interrupted());
990     }});
991 jsr166 1.9
992 jsr166 1.39 await(threadStarted);
993 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
994 jsr166 1.9 t.interrupt();
995 jsr166 1.39 awaitTermination(t);
996     }
997    
998     /**
999     * takeLast() throws InterruptedException immediately if interrupted
1000     * before waiting
1001     */
1002     public void testTakeLastFromEmptyAfterInterrupt() {
1003 dl 1.88 final BlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
1004 jsr166 1.39 Thread t = newStartedThread(new CheckedRunnable() {
1005     public void realRun() {
1006     Thread.currentThread().interrupt();
1007     try {
1008     q.takeLast();
1009     shouldThrow();
1010     } catch (InterruptedException success) {}
1011     assertFalse(Thread.interrupted());
1012     }});
1013    
1014     awaitTermination(t);
1015 dl 1.1 }
1016    
1017     /**
1018 jsr166 1.39 * takeFirst removes existing elements until empty, then blocks interruptibly
1019 dl 1.1 */
1020 jsr166 1.9 public void testBlockingTakeFirst() throws InterruptedException {
1021 dl 1.88 final LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1022 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1023     Thread t = newStartedThread(new CheckedRunnable() {
1024 jsr166 1.9 public void realRun() throws InterruptedException {
1025 dl 1.88 for (int i = 0; i < SIZE; i++) mustEqual(i, q.takeFirst());
1026 jsr166 1.39
1027     Thread.currentThread().interrupt();
1028     try {
1029     q.takeFirst();
1030     shouldThrow();
1031     } catch (InterruptedException success) {}
1032     assertFalse(Thread.interrupted());
1033    
1034     pleaseInterrupt.countDown();
1035 jsr166 1.17 try {
1036     q.takeFirst();
1037     shouldThrow();
1038     } catch (InterruptedException success) {}
1039 jsr166 1.39 assertFalse(Thread.interrupted());
1040 jsr166 1.17 }});
1041 jsr166 1.9
1042 jsr166 1.39 await(pleaseInterrupt);
1043 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1044 jsr166 1.9 t.interrupt();
1045 jsr166 1.39 awaitTermination(t);
1046 dl 1.1 }
1047    
1048     /**
1049     * timed pollFirst with zero timeout succeeds when non-empty, else times out
1050     */
1051 jsr166 1.9 public void testTimedPollFirst0() throws InterruptedException {
1052 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1053 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
1054 dl 1.88 mustEqual(i, q.pollFirst(0, MILLISECONDS));
1055 jsr166 1.7 }
1056 jsr166 1.9 assertNull(q.pollFirst(0, MILLISECONDS));
1057 dl 1.1 }
1058    
1059     /**
1060     * timed pollFirst with nonzero timeout succeeds when non-empty, else times out
1061     */
1062 jsr166 1.9 public void testTimedPollFirst() throws InterruptedException {
1063 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1064 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
1065 jsr166 1.39 long startTime = System.nanoTime();
1066 dl 1.88 mustEqual(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1067 jsr166 1.39 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1068     }
1069     long startTime = System.nanoTime();
1070     assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1071     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1072     checkEmpty(q);
1073 dl 1.1 }
1074    
1075     /**
1076     * Interrupted timed pollFirst throws InterruptedException instead of
1077     * returning timeout status
1078     */
1079 jsr166 1.9 public void testInterruptedTimedPollFirst() throws InterruptedException {
1080 dl 1.88 final LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1081 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1082     Thread t = newStartedThread(new CheckedRunnable() {
1083 jsr166 1.9 public void realRun() throws InterruptedException {
1084 jsr166 1.78 for (int i = 0; i < SIZE; i++)
1085 dl 1.88 mustEqual(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1086 jsr166 1.39
1087     Thread.currentThread().interrupt();
1088     try {
1089 jsr166 1.84 q.pollFirst(randomTimeout(), randomTimeUnit());
1090 jsr166 1.39 shouldThrow();
1091     } catch (InterruptedException success) {}
1092     assertFalse(Thread.interrupted());
1093    
1094     pleaseInterrupt.countDown();
1095 jsr166 1.13 try {
1096 jsr166 1.86 q.pollFirst(LONGER_DELAY_MS, MILLISECONDS);
1097 jsr166 1.13 shouldThrow();
1098     } catch (InterruptedException success) {}
1099 jsr166 1.39 assertFalse(Thread.interrupted());
1100 jsr166 1.13 }});
1101 jsr166 1.9
1102 jsr166 1.39 await(pleaseInterrupt);
1103 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1104 jsr166 1.9 t.interrupt();
1105 jsr166 1.39 awaitTermination(t);
1106 dl 1.1 }
1107    
1108     /**
1109 jsr166 1.25 * timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds;
1110     * on interruption throws
1111 dl 1.1 */
1112 jsr166 1.9 public void testTimedPollFirstWithOfferFirst() throws InterruptedException {
1113 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
1114 jsr166 1.39 final CheckedBarrier barrier = new CheckedBarrier(2);
1115     Thread t = newStartedThread(new CheckedRunnable() {
1116 jsr166 1.9 public void realRun() throws InterruptedException {
1117 jsr166 1.39 long startTime = System.nanoTime();
1118     assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
1119     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1120    
1121     barrier.await();
1122    
1123 jsr166 1.14 assertSame(zero, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
1124 jsr166 1.39
1125     Thread.currentThread().interrupt();
1126     try {
1127 jsr166 1.84 q.pollFirst(randomTimeout(), randomTimeUnit());
1128 jsr166 1.39 shouldThrow();
1129     } catch (InterruptedException success) {}
1130    
1131     barrier.await();
1132 jsr166 1.14 try {
1133     q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1134     shouldThrow();
1135     } catch (InterruptedException success) {}
1136 jsr166 1.77 assertFalse(Thread.interrupted());
1137 jsr166 1.84
1138 jsr166 1.39 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1139 jsr166 1.14 }});
1140 jsr166 1.9
1141 jsr166 1.39 barrier.await();
1142     long startTime = System.nanoTime();
1143     assertTrue(q.offerFirst(zero, LONG_DELAY_MS, MILLISECONDS));
1144     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1145     barrier.await();
1146 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1147 jsr166 1.9 t.interrupt();
1148 jsr166 1.39 awaitTermination(t);
1149 jsr166 1.4 }
1150 dl 1.1
1151     /**
1152     * putLast(null) throws NPE
1153     */
1154 jsr166 1.36 public void testPutLastNull() throws InterruptedException {
1155 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
1156 jsr166 1.7 try {
1157 dl 1.1 q.putLast(null);
1158     shouldThrow();
1159 jsr166 1.9 } catch (NullPointerException success) {}
1160 jsr166 1.36 }
1161 dl 1.1
1162     /**
1163     * all elements successfully putLast are contained
1164     */
1165 jsr166 1.36 public void testPutLast() throws InterruptedException {
1166 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
1167 jsr166 1.36 for (int i = 0; i < SIZE; ++i) {
1168 dl 1.88 Item x = itemFor(i);
1169 jsr166 1.54 q.putLast(x);
1170 dl 1.88 mustContain(q, x);
1171 jsr166 1.36 }
1172 dl 1.88 mustEqual(0, q.remainingCapacity());
1173 dl 1.1 }
1174    
1175     /**
1176     * putLast blocks interruptibly if full
1177     */
1178 jsr166 1.9 public void testBlockingPutLast() throws InterruptedException {
1179 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(SIZE);
1180 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1181     Thread t = newStartedThread(new CheckedRunnable() {
1182 jsr166 1.17 public void realRun() throws InterruptedException {
1183     for (int i = 0; i < SIZE; ++i)
1184 dl 1.88 q.putLast(itemFor(i));
1185     mustEqual(SIZE, q.size());
1186     mustEqual(0, q.remainingCapacity());
1187 jsr166 1.39
1188     Thread.currentThread().interrupt();
1189     try {
1190 dl 1.88 q.putLast(ninetynine);
1191 jsr166 1.39 shouldThrow();
1192     } catch (InterruptedException success) {}
1193     assertFalse(Thread.interrupted());
1194    
1195     pleaseInterrupt.countDown();
1196 jsr166 1.11 try {
1197 dl 1.88 q.putLast(ninetynine);
1198 jsr166 1.17 shouldThrow();
1199     } catch (InterruptedException success) {}
1200 jsr166 1.39 assertFalse(Thread.interrupted());
1201 jsr166 1.11 }});
1202    
1203 jsr166 1.39 await(pleaseInterrupt);
1204 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1205 jsr166 1.9 t.interrupt();
1206 jsr166 1.39 awaitTermination(t);
1207 dl 1.88 mustEqual(SIZE, q.size());
1208     mustEqual(0, q.remainingCapacity());
1209 dl 1.1 }
1210    
1211     /**
1212 jsr166 1.39 * putLast blocks interruptibly waiting for take when full
1213 dl 1.1 */
1214 jsr166 1.9 public void testPutLastWithTake() throws InterruptedException {
1215 jsr166 1.17 final int capacity = 2;
1216 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(capacity);
1217 jsr166 1.39 final CountDownLatch pleaseTake = new CountDownLatch(1);
1218     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1219     Thread t = newStartedThread(new CheckedRunnable() {
1220 jsr166 1.17 public void realRun() throws InterruptedException {
1221 jsr166 1.39 for (int i = 0; i < capacity; i++)
1222 dl 1.88 q.putLast(itemFor(i));
1223 jsr166 1.39 pleaseTake.countDown();
1224 dl 1.88 q.putLast(eightysix);
1225 jsr166 1.39
1226 jsr166 1.80 Thread.currentThread().interrupt();
1227     try {
1228 dl 1.88 q.putLast(ninetynine);
1229 jsr166 1.80 shouldThrow();
1230     } catch (InterruptedException success) {}
1231     assertFalse(Thread.interrupted());
1232    
1233 jsr166 1.39 pleaseInterrupt.countDown();
1234 jsr166 1.11 try {
1235 dl 1.88 q.putLast(ninetynine);
1236 jsr166 1.17 shouldThrow();
1237     } catch (InterruptedException success) {}
1238 jsr166 1.39 assertFalse(Thread.interrupted());
1239 jsr166 1.11 }});
1240 jsr166 1.9
1241 jsr166 1.39 await(pleaseTake);
1242 dl 1.88 mustEqual(0, q.remainingCapacity());
1243     mustEqual(0, q.take());
1244 jsr166 1.39
1245     await(pleaseInterrupt);
1246 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1247 jsr166 1.9 t.interrupt();
1248 jsr166 1.39 awaitTermination(t);
1249 dl 1.88 mustEqual(0, q.remainingCapacity());
1250 dl 1.1 }
1251    
1252     /**
1253     * timed offerLast times out if full and elements not taken
1254     */
1255 jsr166 1.80 public void testTimedOfferLast() {
1256 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
1257 jsr166 1.38 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1258     Thread t = newStartedThread(new CheckedRunnable() {
1259 jsr166 1.9 public void realRun() throws InterruptedException {
1260 dl 1.88 q.putLast(zero);
1261     q.putLast(one);
1262 jsr166 1.38 long startTime = System.nanoTime();
1263 jsr166 1.84
1264 dl 1.88 assertFalse(q.offerLast(two, timeoutMillis(), MILLISECONDS));
1265 jsr166 1.38 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1266 jsr166 1.80
1267     Thread.currentThread().interrupt();
1268     try {
1269 dl 1.88 q.offerLast(three, randomTimeout(), randomTimeUnit());
1270 jsr166 1.80 shouldThrow();
1271     } catch (InterruptedException success) {}
1272    
1273 jsr166 1.38 pleaseInterrupt.countDown();
1274 jsr166 1.16 try {
1275 dl 1.88 q.offerLast(four, LONGER_DELAY_MS, MILLISECONDS);
1276 jsr166 1.16 shouldThrow();
1277     } catch (InterruptedException success) {}
1278     }});
1279 jsr166 1.4
1280 jsr166 1.38 await(pleaseInterrupt);
1281 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1282 jsr166 1.9 t.interrupt();
1283 jsr166 1.38 awaitTermination(t);
1284 dl 1.1 }
1285    
1286     /**
1287     * takeLast retrieves elements in FIFO order
1288     */
1289 jsr166 1.9 public void testTakeLast() throws InterruptedException {
1290 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1291 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
1292 dl 1.88 mustEqual(SIZE - i - 1, q.takeLast());
1293 jsr166 1.7 }
1294 dl 1.1 }
1295    
1296     /**
1297 jsr166 1.39 * takeLast removes existing elements until empty, then blocks interruptibly
1298 dl 1.1 */
1299 jsr166 1.39 public void testBlockingTakeLast() throws InterruptedException {
1300 dl 1.88 final LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1301 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1302     Thread t = newStartedThread(new CheckedRunnable() {
1303 jsr166 1.9 public void realRun() throws InterruptedException {
1304 jsr166 1.69 for (int i = 0; i < SIZE; i++)
1305 dl 1.88 mustEqual(SIZE - i - 1, q.takeLast());
1306 jsr166 1.9
1307 jsr166 1.39 Thread.currentThread().interrupt();
1308     try {
1309     q.takeLast();
1310     shouldThrow();
1311     } catch (InterruptedException success) {}
1312     assertFalse(Thread.interrupted());
1313 dl 1.1
1314 jsr166 1.39 pleaseInterrupt.countDown();
1315 jsr166 1.17 try {
1316     q.takeLast();
1317     shouldThrow();
1318     } catch (InterruptedException success) {}
1319 jsr166 1.39 assertFalse(Thread.interrupted());
1320 jsr166 1.17 }});
1321 jsr166 1.9
1322 jsr166 1.39 await(pleaseInterrupt);
1323 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
1324 jsr166 1.9 t.interrupt();
1325 jsr166 1.39 awaitTermination(t);
1326 dl 1.1 }
1327    
1328     /**
1329     * timed pollLast with zero timeout succeeds when non-empty, else times out
1330     */
1331 jsr166 1.9 public void testTimedPollLast0() throws InterruptedException {
1332 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1333 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
1334 dl 1.88 mustEqual(SIZE - i - 1, q.pollLast(0, MILLISECONDS));
1335 jsr166 1.7 }
1336 jsr166 1.9 assertNull(q.pollLast(0, MILLISECONDS));
1337 dl 1.1 }
1338    
1339     /**
1340     * timed pollLast with nonzero timeout succeeds when non-empty, else times out
1341     */
1342 jsr166 1.9 public void testTimedPollLast() throws InterruptedException {
1343 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1344 jsr166 1.9 for (int i = 0; i < SIZE; ++i) {
1345 jsr166 1.39 long startTime = System.nanoTime();
1346 dl 1.88 mustEqual(SIZE - i - 1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1347 jsr166 1.39 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1348     }
1349     long startTime = System.nanoTime();
1350     assertNull(q.pollLast(timeoutMillis(), MILLISECONDS));
1351     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1352     checkEmpty(q);
1353 dl 1.1 }
1354    
1355     /**
1356     * Interrupted timed pollLast throws InterruptedException instead of
1357     * returning timeout status
1358     */
1359 jsr166 1.9 public void testInterruptedTimedPollLast() throws InterruptedException {
1360 dl 1.88 final LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1361 jsr166 1.39 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1362     Thread t = newStartedThread(new CheckedRunnable() {
1363 jsr166 1.9 public void realRun() throws InterruptedException {
1364 jsr166 1.78 for (int i = 0; i < SIZE; i++)
1365 dl 1.88 mustEqual(SIZE - i - 1,
1366 jsr166 1.60 q.pollLast(LONG_DELAY_MS, MILLISECONDS));
1367 jsr166 1.39
1368     Thread.currentThread().interrupt();
1369 jsr166 1.13 try {
1370 jsr166 1.84 q.pollLast(randomTimeout(), randomTimeUnit());
1371 jsr166 1.13 shouldThrow();
1372     } catch (InterruptedException success) {}
1373 jsr166 1.39 assertFalse(Thread.interrupted());
1374    
1375     pleaseInterrupt.countDown();
1376     try {
1377 jsr166 1.86 q.pollLast(LONGER_DELAY_MS, MILLISECONDS);
1378 jsr166 1.39 shouldThrow();
1379     } catch (InterruptedException success) {}
1380     assertFalse(Thread.interrupted());
1381 jsr166 1.13 }});
1382 jsr166 1.9
1383 jsr166 1.39 await(pleaseInterrupt);
1384 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1385 jsr166 1.9 t.interrupt();
1386 jsr166 1.39 awaitTermination(t);
1387 jsr166 1.62 checkEmpty(q);
1388 dl 1.1 }
1389    
1390     /**
1391 jsr166 1.24 * timed poll before a delayed offerLast fails; after offerLast succeeds;
1392     * on interruption throws
1393 dl 1.1 */
1394 jsr166 1.9 public void testTimedPollWithOfferLast() throws InterruptedException {
1395 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
1396 jsr166 1.39 final CheckedBarrier barrier = new CheckedBarrier(2);
1397     Thread t = newStartedThread(new CheckedRunnable() {
1398 jsr166 1.9 public void realRun() throws InterruptedException {
1399 jsr166 1.39 long startTime = System.nanoTime();
1400     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
1401     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1402    
1403     barrier.await();
1404    
1405 jsr166 1.9 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
1406 jsr166 1.39
1407     Thread.currentThread().interrupt();
1408 jsr166 1.9 try {
1409 jsr166 1.84 q.poll(randomTimeout(), randomTimeUnit());
1410 jsr166 1.9 shouldThrow();
1411     } catch (InterruptedException success) {}
1412 jsr166 1.39 assertFalse(Thread.interrupted());
1413    
1414     barrier.await();
1415     try {
1416     q.poll(LONG_DELAY_MS, MILLISECONDS);
1417     shouldThrow();
1418     } catch (InterruptedException success) {}
1419     assertFalse(Thread.interrupted());
1420 jsr166 1.63
1421     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1422 jsr166 1.9 }});
1423    
1424 jsr166 1.39 barrier.await();
1425     long startTime = System.nanoTime();
1426     assertTrue(q.offerLast(zero, LONG_DELAY_MS, MILLISECONDS));
1427     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1428    
1429     barrier.await();
1430 jsr166 1.84 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
1431 jsr166 1.9 t.interrupt();
1432 jsr166 1.39 awaitTermination(t);
1433 jsr166 1.4 }
1434 dl 1.1
1435     /**
1436     * element returns next element, or throws NSEE if empty
1437     */
1438     public void testElement() {
1439 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1440 dl 1.1 for (int i = 0; i < SIZE; ++i) {
1441 dl 1.88 mustEqual(i, q.element());
1442 dl 1.1 q.poll();
1443     }
1444     try {
1445     q.element();
1446     shouldThrow();
1447 jsr166 1.9 } catch (NoSuchElementException success) {}
1448 dl 1.1 }
1449    
1450     /**
1451     * contains(x) reports true when elements added but not yet removed
1452     */
1453     public void testContains() {
1454 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1455 dl 1.1 for (int i = 0; i < SIZE; ++i) {
1456 dl 1.88 mustContain(q, i);
1457 dl 1.1 q.poll();
1458 dl 1.88 mustNotContain(q, i);
1459 dl 1.1 }
1460     }
1461    
1462     /**
1463     * clear removes all elements
1464     */
1465     public void testClear() {
1466 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1467 dl 1.1 q.clear();
1468     assertTrue(q.isEmpty());
1469 dl 1.88 mustEqual(0, q.size());
1470     mustEqual(SIZE, q.remainingCapacity());
1471 dl 1.1 q.add(one);
1472     assertFalse(q.isEmpty());
1473 dl 1.88 mustContain(q, one);
1474 dl 1.1 q.clear();
1475     assertTrue(q.isEmpty());
1476     }
1477    
1478     /**
1479     * containsAll(c) is true when c contains a subset of elements
1480     */
1481     public void testContainsAll() {
1482 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1483     LinkedBlockingDeque<Item> p = new LinkedBlockingDeque<Item>(SIZE);
1484 dl 1.1 for (int i = 0; i < SIZE; ++i) {
1485     assertTrue(q.containsAll(p));
1486     assertFalse(p.containsAll(q));
1487 dl 1.88 mustAdd(p, i);
1488 dl 1.1 }
1489     assertTrue(p.containsAll(q));
1490     }
1491    
1492     /**
1493     * retainAll(c) retains only those elements of c and reports true if changed
1494     */
1495     public void testRetainAll() {
1496 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1497     LinkedBlockingDeque<Item> p = populatedDeque(SIZE);
1498 dl 1.1 for (int i = 0; i < SIZE; ++i) {
1499     boolean changed = q.retainAll(p);
1500     if (i == 0)
1501     assertFalse(changed);
1502     else
1503     assertTrue(changed);
1504    
1505     assertTrue(q.containsAll(p));
1506 dl 1.88 mustEqual(SIZE - i, q.size());
1507 dl 1.1 p.remove();
1508     }
1509     }
1510    
1511     /**
1512     * removeAll(c) removes only those elements of c and reports true if changed
1513     */
1514     public void testRemoveAll() {
1515     for (int i = 1; i < SIZE; ++i) {
1516 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1517     LinkedBlockingDeque<Item> p = populatedDeque(i);
1518 dl 1.1 assertTrue(q.removeAll(p));
1519 dl 1.88 mustEqual(SIZE - i, q.size());
1520 dl 1.1 for (int j = 0; j < i; ++j) {
1521 dl 1.88 mustNotContain(q, p.remove());
1522 dl 1.1 }
1523     }
1524     }
1525    
1526     /**
1527 jsr166 1.31 * toArray contains all elements in FIFO order
1528 dl 1.1 */
1529 jsr166 1.43 public void testToArray() throws InterruptedException {
1530 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1531 jsr166 1.83 Object[] a = q.toArray();
1532     assertSame(Object[].class, a.getClass());
1533     for (Object o : a)
1534     assertSame(o, q.poll());
1535     assertTrue(q.isEmpty());
1536 dl 1.1 }
1537    
1538     /**
1539 jsr166 1.31 * toArray(a) contains all elements in FIFO order
1540 dl 1.1 */
1541 jsr166 1.31 public void testToArray2() {
1542 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1543     Item[] items = new Item[SIZE];
1544     Item[] array = q.toArray(items);
1545     assertSame(items, array);
1546     for (Item o : items)
1547 jsr166 1.83 assertSame(o, q.remove());
1548     assertTrue(q.isEmpty());
1549 dl 1.1 }
1550    
1551     /**
1552 jsr166 1.29 * toArray(incompatible array type) throws ArrayStoreException
1553 dl 1.1 */
1554     public void testToArray1_BadArg() {
1555 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1556 jsr166 1.7 try {
1557 jsr166 1.29 q.toArray(new String[10]);
1558 jsr166 1.7 shouldThrow();
1559 jsr166 1.9 } catch (ArrayStoreException success) {}
1560 dl 1.1 }
1561    
1562     /**
1563     * iterator iterates through all elements
1564     */
1565 jsr166 1.9 public void testIterator() throws InterruptedException {
1566 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1567     Iterator<? extends Item> it = q.iterator();
1568 jsr166 1.55 int i;
1569     for (i = 0; it.hasNext(); i++)
1570 dl 1.88 mustContain(q, it.next());
1571     mustEqual(i, SIZE);
1572 jsr166 1.55 assertIteratorExhausted(it);
1573    
1574     it = q.iterator();
1575     for (i = 0; it.hasNext(); i++)
1576 dl 1.88 mustEqual(it.next(), q.take());
1577     mustEqual(i, SIZE);
1578 jsr166 1.55 assertIteratorExhausted(it);
1579     }
1580    
1581     /**
1582     * iterator of empty collection has no elements
1583     */
1584     public void testEmptyIterator() {
1585 dl 1.88 Deque<Item> c = new LinkedBlockingDeque<Item>();
1586 jsr166 1.55 assertIteratorExhausted(c.iterator());
1587     assertIteratorExhausted(c.descendingIterator());
1588 dl 1.1 }
1589    
1590     /**
1591     * iterator.remove removes current element
1592     */
1593 jsr166 1.21 public void testIteratorRemove() {
1594 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(3);
1595 dl 1.1 q.add(two);
1596     q.add(one);
1597     q.add(three);
1598    
1599 dl 1.88 Iterator<? extends Item> it = q.iterator();
1600 dl 1.1 it.next();
1601     it.remove();
1602 jsr166 1.4
1603 dl 1.1 it = q.iterator();
1604 jsr166 1.20 assertSame(it.next(), one);
1605     assertSame(it.next(), three);
1606 dl 1.1 assertFalse(it.hasNext());
1607     }
1608    
1609     /**
1610     * iterator ordering is FIFO
1611     */
1612     public void testIteratorOrdering() {
1613 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(3);
1614 dl 1.1 q.add(one);
1615     q.add(two);
1616     q.add(three);
1617 dl 1.88 mustEqual(0, q.remainingCapacity());
1618 dl 1.1 int k = 0;
1619 dl 1.88 for (Iterator<? extends Item> it = q.iterator(); it.hasNext();) {
1620     mustEqual(++k, it.next());
1621 dl 1.1 }
1622 dl 1.88 mustEqual(3, k);
1623 dl 1.1 }
1624    
1625     /**
1626     * Modifications do not cause iterators to fail
1627     */
1628 jsr166 1.21 public void testWeaklyConsistentIteration() {
1629 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(3);
1630 dl 1.1 q.add(one);
1631     q.add(two);
1632     q.add(three);
1633 dl 1.88 for (Iterator<? extends Item> it = q.iterator(); it.hasNext();) {
1634 jsr166 1.9 q.remove();
1635     it.next();
1636 dl 1.1 }
1637 dl 1.88 mustEqual(0, q.size());
1638 dl 1.1 }
1639    
1640     /**
1641 jsr166 1.25 * Descending iterator iterates through all elements
1642 dl 1.2 */
1643     public void testDescendingIterator() {
1644 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1645 dl 1.2 int i = 0;
1646 dl 1.88 Iterator<? extends Item> it = q.descendingIterator();
1647 jsr166 1.5 while (it.hasNext()) {
1648 dl 1.88 mustContain(q, it.next());
1649 dl 1.2 ++i;
1650     }
1651 dl 1.88 mustEqual(i, SIZE);
1652 dl 1.2 assertFalse(it.hasNext());
1653     try {
1654     it.next();
1655 jsr166 1.9 shouldThrow();
1656     } catch (NoSuchElementException success) {}
1657 dl 1.2 }
1658    
1659     /**
1660 jsr166 1.25 * Descending iterator ordering is reverse FIFO
1661 dl 1.2 */
1662     public void testDescendingIteratorOrdering() {
1663 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
1664 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
1665 dl 1.88 mustAdd(q, three);
1666     mustAdd(q, two);
1667     mustAdd(q, one);
1668    
1669 dl 1.3 int k = 0;
1670 dl 1.88 for (Iterator<? extends Item> it = q.descendingIterator(); it.hasNext();) {
1671     mustEqual(++k, it.next());
1672 dl 1.3 }
1673 jsr166 1.4
1674 dl 1.88 mustEqual(3, k);
1675 dl 1.3 q.remove();
1676     q.remove();
1677     q.remove();
1678 dl 1.2 }
1679     }
1680    
1681     /**
1682     * descendingIterator.remove removes current element
1683     */
1684 jsr166 1.21 public void testDescendingIteratorRemove() {
1685 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
1686 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
1687 dl 1.88 mustAdd(q, three);
1688     mustAdd(q, two);
1689     mustAdd(q, one);
1690     Iterator<? extends Item> it = q.descendingIterator();
1691     mustEqual(it.next(), one);
1692 dl 1.3 it.remove();
1693 dl 1.88 mustEqual(it.next(), two);
1694 dl 1.3 it = q.descendingIterator();
1695 dl 1.88 mustEqual(it.next(), two);
1696     mustEqual(it.next(), three);
1697 dl 1.3 it.remove();
1698     assertFalse(it.hasNext());
1699     q.remove();
1700     }
1701 dl 1.2 }
1702    
1703     /**
1704 dl 1.1 * toString contains toStrings of elements
1705     */
1706     public void testToString() {
1707 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1708 dl 1.1 String s = q.toString();
1709     for (int i = 0; i < SIZE; ++i) {
1710 jsr166 1.39 assertTrue(s.contains(String.valueOf(i)));
1711 dl 1.1 }
1712 jsr166 1.4 }
1713 dl 1.1
1714     /**
1715     * offer transfers elements across Executor tasks
1716     */
1717     public void testOfferInExecutor() {
1718 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
1719 dl 1.1 q.add(one);
1720     q.add(two);
1721 jsr166 1.39 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1722 jsr166 1.61 final ExecutorService executor = Executors.newFixedThreadPool(2);
1723     try (PoolCleaner cleaner = cleaner(executor)) {
1724     executor.execute(new CheckedRunnable() {
1725     public void realRun() throws InterruptedException {
1726     assertFalse(q.offer(three));
1727     threadsStarted.await();
1728     assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
1729 dl 1.88 mustEqual(0, q.remainingCapacity());
1730 jsr166 1.61 }});
1731    
1732     executor.execute(new CheckedRunnable() {
1733     public void realRun() throws InterruptedException {
1734     threadsStarted.await();
1735     assertSame(one, q.take());
1736     }});
1737     }
1738 dl 1.1 }
1739    
1740     /**
1741 jsr166 1.39 * timed poll retrieves elements across Executor threads
1742 dl 1.1 */
1743     public void testPollInExecutor() {
1744 dl 1.88 final LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>(2);
1745 jsr166 1.39 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
1746 jsr166 1.61 final ExecutorService executor = Executors.newFixedThreadPool(2);
1747     try (PoolCleaner cleaner = cleaner(executor)) {
1748     executor.execute(new CheckedRunnable() {
1749     public void realRun() throws InterruptedException {
1750     assertNull(q.poll());
1751     threadsStarted.await();
1752     assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
1753     checkEmpty(q);
1754     }});
1755    
1756     executor.execute(new CheckedRunnable() {
1757     public void realRun() throws InterruptedException {
1758     threadsStarted.await();
1759     q.put(one);
1760     }});
1761     }
1762 dl 1.1 }
1763    
1764     /**
1765 jsr166 1.82 * A deserialized/reserialized deque has same elements in same order
1766 dl 1.1 */
1767 jsr166 1.9 public void testSerialization() throws Exception {
1768 dl 1.88 Queue<Item> x = populatedDeque(SIZE);
1769     Queue<Item> y = serialClone(x);
1770 dl 1.1
1771 jsr166 1.49 assertNotSame(y, x);
1772 dl 1.88 mustEqual(x.size(), y.size());
1773     mustEqual(x.toString(), y.toString());
1774 jsr166 1.41 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
1775     while (!x.isEmpty()) {
1776     assertFalse(y.isEmpty());
1777 dl 1.88 mustEqual(x.remove(), y.remove());
1778 jsr166 1.41 }
1779     assertTrue(y.isEmpty());
1780 dl 1.1 }
1781    
1782     /**
1783     * drainTo(c) empties deque into another collection c
1784 jsr166 1.4 */
1785 dl 1.1 public void testDrainTo() {
1786 dl 1.88 LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1787     ArrayList<Item> l = new ArrayList<Item>();
1788 dl 1.1 q.drainTo(l);
1789 dl 1.88 mustEqual(0, q.size());
1790     mustEqual(SIZE, l.size());
1791 jsr166 1.4 for (int i = 0; i < SIZE; ++i)
1792 dl 1.88 mustEqual(l.get(i), i);
1793 dl 1.1 q.add(zero);
1794     q.add(one);
1795     assertFalse(q.isEmpty());
1796 dl 1.88 mustContain(q, zero);
1797     mustContain(q, one);
1798 dl 1.1 l.clear();
1799     q.drainTo(l);
1800 dl 1.88 mustEqual(0, q.size());
1801     mustEqual(2, l.size());
1802 jsr166 1.4 for (int i = 0; i < 2; ++i)
1803 dl 1.88 mustEqual(l.get(i), i);
1804 dl 1.1 }
1805    
1806     /**
1807     * drainTo empties full deque, unblocking a waiting put.
1808 jsr166 1.4 */
1809 jsr166 1.9 public void testDrainToWithActivePut() throws InterruptedException {
1810 dl 1.88 final LinkedBlockingDeque<Item> q = populatedDeque(SIZE);
1811 jsr166 1.9 Thread t = new Thread(new CheckedRunnable() {
1812     public void realRun() throws InterruptedException {
1813 dl 1.88 q.put(new Item(SIZE + 1));
1814 jsr166 1.9 }});
1815    
1816     t.start();
1817 dl 1.88 ArrayList<Item> l = new ArrayList<Item>();
1818 jsr166 1.9 q.drainTo(l);
1819     assertTrue(l.size() >= SIZE);
1820     for (int i = 0; i < SIZE; ++i)
1821 dl 1.88 mustEqual(l.get(i), i);
1822 jsr166 1.9 t.join();
1823     assertTrue(q.size() + l.size() >= SIZE);
1824 dl 1.1 }
1825    
1826     /**
1827 jsr166 1.26 * drainTo(c, n) empties first min(n, size) elements of queue into c
1828 jsr166 1.4 */
1829 dl 1.1 public void testDrainToN() {
1830 dl 1.88 LinkedBlockingDeque<Item> q = new LinkedBlockingDeque<Item>();
1831 dl 1.1 for (int i = 0; i < SIZE + 2; ++i) {
1832 jsr166 1.5 for (int j = 0; j < SIZE; j++)
1833 dl 1.88 mustOffer(q, j);
1834     ArrayList<Item> l = new ArrayList<Item>();
1835 dl 1.1 q.drainTo(l, i);
1836 jsr166 1.27 int k = (i < SIZE) ? i : SIZE;
1837 dl 1.88 mustEqual(k, l.size());
1838     mustEqual(SIZE - k, q.size());
1839 jsr166 1.4 for (int j = 0; j < k; ++j)
1840 dl 1.88 mustEqual(l.get(j), j);
1841 jsr166 1.52 do {} while (q.poll() != null);
1842 dl 1.1 }
1843     }
1844    
1845 jsr166 1.50 /**
1846     * remove(null), contains(null) always return false
1847     */
1848     public void testNeverContainsNull() {
1849     Deque<?>[] qs = {
1850     new LinkedBlockingDeque<Object>(),
1851     populatedDeque(2),
1852     };
1853    
1854     for (Deque<?> q : qs) {
1855     assertFalse(q.contains(null));
1856     assertFalse(q.remove(null));
1857     assertFalse(q.removeFirstOccurrence(null));
1858     assertFalse(q.removeLastOccurrence(null));
1859     }
1860     }
1861    
1862 dl 1.1 }