ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
(Generate patch)

Comparing jsr166/src/test/tck/LinkedBlockingDequeTest.java (file contents):
Revision 1.12 by jsr166, Sat Nov 21 10:29:50 2009 UTC vs.
Revision 1.79 by jsr166, Sun May 14 04:02:06 2017 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines