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

Comparing jsr166/src/test/tck/ArrayBlockingQueueTest.java (file contents):
Revision 1.29 by jsr166, Wed Aug 25 00:07:02 2010 UTC vs.
Revision 1.73 by jsr166, Mon Oct 17 01:52:04 2016 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   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
8  
9
10 import junit.framework.*;
11 import java.util.*;
12 import java.util.concurrent.*;
9   import static java.util.concurrent.TimeUnit.MILLISECONDS;
10 < import java.io.*;
10 >
11 > import java.util.ArrayList;
12 > import java.util.Arrays;
13 > import java.util.Collection;
14 > import java.util.Iterator;
15 > import java.util.NoSuchElementException;
16 > import java.util.Queue;
17 > import java.util.concurrent.ArrayBlockingQueue;
18 > import java.util.concurrent.BlockingQueue;
19 > import java.util.concurrent.CountDownLatch;
20 > import java.util.concurrent.Executors;
21 > import java.util.concurrent.ExecutorService;
22 >
23 > import junit.framework.Test;
24  
25   public class ArrayBlockingQueueTest extends JSR166TestCase {
26 +
27 +    public static class Fair extends BlockingQueueTest {
28 +        protected BlockingQueue emptyCollection() {
29 +            return new ArrayBlockingQueue(SIZE, true);
30 +        }
31 +    }
32 +
33 +    public static class NonFair extends BlockingQueueTest {
34 +        protected BlockingQueue emptyCollection() {
35 +            return new ArrayBlockingQueue(SIZE, false);
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(ArrayBlockingQueueTest.class);
44 >        class Implementation implements CollectionImplementation {
45 >            public Class<?> klazz() { return ArrayBlockingQueue.class; }
46 >            public Collection emptyCollection() { return new ArrayBlockingQueue(SIZE, false); }
47 >            public Object makeElement(int i) { return i; }
48 >            public boolean isConcurrent() { return true; }
49 >            public boolean permitsNulls() { return false; }
50 >        }
51 >        return newTestSuite(ArrayBlockingQueueTest.class,
52 >                            new Fair().testSuite(),
53 >                            new NonFair().testSuite(),
54 >                            CollectionTest.testSuite(new Implementation()));
55      }
56  
57      /**
58 <     * Create a queue of given size containing consecutive
59 <     * Integers 0 ... n.
58 >     * Returns a new queue of given size containing consecutive
59 >     * Integers 0 ... n - 1.
60       */
61 <    private ArrayBlockingQueue populatedQueue(int n) {
62 <        ArrayBlockingQueue q = new ArrayBlockingQueue(n);
61 >    private ArrayBlockingQueue<Integer> populatedQueue(int n) {
62 >        ArrayBlockingQueue<Integer> q = new ArrayBlockingQueue<Integer>(n);
63          assertTrue(q.isEmpty());
64          for (int i = 0; i < n; i++)
65              assertTrue(q.offer(new Integer(i)));
66          assertFalse(q.isEmpty());
67          assertEquals(0, q.remainingCapacity());
68          assertEquals(n, q.size());
69 +        assertEquals((Integer) 0, q.peek());
70          return q;
71      }
72  
# Line 48 | Line 82 | public class ArrayBlockingQueueTest exte
82       */
83      public void testConstructor2() {
84          try {
85 <            ArrayBlockingQueue q = new ArrayBlockingQueue(0);
85 >            new ArrayBlockingQueue(0);
86              shouldThrow();
87          } catch (IllegalArgumentException success) {}
88      }
# Line 58 | Line 92 | public class ArrayBlockingQueueTest exte
92       */
93      public void testConstructor3() {
94          try {
95 <            ArrayBlockingQueue q = new ArrayBlockingQueue(1, true, null);
95 >            new ArrayBlockingQueue(1, true, null);
96              shouldThrow();
97          } catch (NullPointerException success) {}
98      }
# Line 67 | Line 101 | public class ArrayBlockingQueueTest exte
101       * Initializing from Collection of null elements throws NPE
102       */
103      public void testConstructor4() {
104 +        Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
105          try {
106 <            Integer[] ints = new Integer[SIZE];
72 <            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
106 >            new ArrayBlockingQueue(SIZE, false, elements);
107              shouldThrow();
108          } catch (NullPointerException success) {}
109      }
# Line 78 | Line 112 | public class ArrayBlockingQueueTest exte
112       * Initializing from Collection with some null elements throws NPE
113       */
114      public void testConstructor5() {
115 +        Integer[] ints = new Integer[SIZE];
116 +        for (int i = 0; i < SIZE - 1; ++i)
117 +            ints[i] = i;
118 +        Collection<Integer> elements = Arrays.asList(ints);
119          try {
120 <            Integer[] ints = new Integer[SIZE];
83 <            for (int i = 0; i < SIZE-1; ++i)
84 <                ints[i] = new Integer(i);
85 <            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
120 >            new ArrayBlockingQueue(SIZE, false, elements);
121              shouldThrow();
122          } catch (NullPointerException success) {}
123      }
# Line 91 | Line 126 | public class ArrayBlockingQueueTest exte
126       * Initializing from too large collection throws IAE
127       */
128      public void testConstructor6() {
129 +        Integer[] ints = new Integer[SIZE];
130 +        for (int i = 0; i < SIZE; ++i)
131 +            ints[i] = i;
132 +        Collection<Integer> elements = Arrays.asList(ints);
133          try {
134 <            Integer[] ints = new Integer[SIZE];
96 <            for (int i = 0; i < SIZE; ++i)
97 <                ints[i] = new Integer(i);
98 <            ArrayBlockingQueue q = new ArrayBlockingQueue(1, false, Arrays.asList(ints));
134 >            new ArrayBlockingQueue(SIZE - 1, false, elements);
135              shouldThrow();
136          } catch (IllegalArgumentException success) {}
137      }
# Line 106 | Line 142 | public class ArrayBlockingQueueTest exte
142      public void testConstructor7() {
143          Integer[] ints = new Integer[SIZE];
144          for (int i = 0; i < SIZE; ++i)
145 <            ints[i] = new Integer(i);
146 <        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, Arrays.asList(ints));
145 >            ints[i] = i;
146 >        Collection<Integer> elements = Arrays.asList(ints);
147 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, elements);
148          for (int i = 0; i < SIZE; ++i)
149              assertEquals(ints[i], q.poll());
150      }
# Line 131 | Line 168 | public class ArrayBlockingQueueTest exte
168       * remainingCapacity decreases on add, increases on remove
169       */
170      public void testRemainingCapacity() {
171 <        ArrayBlockingQueue q = populatedQueue(SIZE);
171 >        BlockingQueue q = populatedQueue(SIZE);
172          for (int i = 0; i < SIZE; ++i) {
173              assertEquals(i, q.remainingCapacity());
174 <            assertEquals(SIZE-i, q.size());
175 <            q.remove();
174 >            assertEquals(SIZE, q.size() + q.remainingCapacity());
175 >            assertEquals(i, q.remove());
176          }
177          for (int i = 0; i < SIZE; ++i) {
178 <            assertEquals(SIZE-i, q.remainingCapacity());
179 <            assertEquals(i, q.size());
180 <            q.add(new Integer(i));
178 >            assertEquals(SIZE - i, q.remainingCapacity());
179 >            assertEquals(SIZE, q.size() + q.remainingCapacity());
180 >            assertTrue(q.add(i));
181          }
182      }
183  
184      /**
148     *  offer(null) throws NPE
149     */
150    public void testOfferNull() {
151        try {
152            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
153            q.offer(null);
154            shouldThrow();
155        } catch (NullPointerException success) {}
156    }
157
158    /**
159     *  add(null) throws NPE
160     */
161    public void testAddNull() {
162        try {
163            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
164            q.add(null);
165            shouldThrow();
166        } catch (NullPointerException success) {}
167    }
168
169    /**
185       * Offer succeeds if not full; fails if full
186       */
187      public void testOffer() {
# Line 179 | Line 194 | public class ArrayBlockingQueueTest exte
194       * add succeeds if not full; throws ISE if full
195       */
196      public void testAdd() {
197 +        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
198 +        for (int i = 0; i < SIZE; ++i) {
199 +            assertTrue(q.add(new Integer(i)));
200 +        }
201 +        assertEquals(0, q.remainingCapacity());
202          try {
183            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
184            for (int i = 0; i < SIZE; ++i) {
185                assertTrue(q.add(new Integer(i)));
186            }
187            assertEquals(0, q.remainingCapacity());
203              q.add(new Integer(SIZE));
204              shouldThrow();
205          } catch (IllegalStateException success) {}
206      }
207  
208      /**
194     *  addAll(null) throws NPE
195     */
196    public void testAddAll1() {
197        try {
198            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
199            q.addAll(null);
200            shouldThrow();
201        } catch (NullPointerException success) {}
202    }
203
204    /**
209       * addAll(this) throws IAE
210       */
211      public void testAddAllSelf() {
212 +        ArrayBlockingQueue q = populatedQueue(SIZE);
213          try {
209            ArrayBlockingQueue q = populatedQueue(SIZE);
214              q.addAll(q);
215              shouldThrow();
216          } catch (IllegalArgumentException success) {}
217      }
218  
215
216    /**
217     *  addAll of a collection with null elements throws NPE
218     */
219    public void testAddAll2() {
220        try {
221            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
222            Integer[] ints = new Integer[SIZE];
223            q.addAll(Arrays.asList(ints));
224            shouldThrow();
225        } catch (NullPointerException success) {}
226    }
219      /**
220       * addAll of a collection with any null elements throws NPE after
221       * possibly adding some elements
222       */
223      public void testAddAll3() {
224 +        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
225 +        Integer[] ints = new Integer[SIZE];
226 +        for (int i = 0; i < SIZE - 1; ++i)
227 +            ints[i] = new Integer(i);
228          try {
233            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
234            Integer[] ints = new Integer[SIZE];
235            for (int i = 0; i < SIZE-1; ++i)
236                ints[i] = new Integer(i);
229              q.addAll(Arrays.asList(ints));
230              shouldThrow();
231          } catch (NullPointerException success) {}
232      }
233 +
234      /**
235       * addAll throws ISE if not enough room
236       */
237      public void testAddAll4() {
238 +        ArrayBlockingQueue q = new ArrayBlockingQueue(1);
239 +        Integer[] ints = new Integer[SIZE];
240 +        for (int i = 0; i < SIZE; ++i)
241 +            ints[i] = new Integer(i);
242          try {
246            ArrayBlockingQueue q = new ArrayBlockingQueue(1);
247            Integer[] ints = new Integer[SIZE];
248            for (int i = 0; i < SIZE; ++i)
249                ints[i] = new Integer(i);
243              q.addAll(Arrays.asList(ints));
244              shouldThrow();
245          } catch (IllegalStateException success) {}
246      }
247 +
248      /**
249       * Queue contains all elements, in traversal order, of successful addAll
250       */
# Line 267 | Line 261 | public class ArrayBlockingQueueTest exte
261      }
262  
263      /**
270     *  put(null) throws NPE
271     */
272    public void testPutNull() throws InterruptedException {
273        try {
274            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
275            q.put(null);
276            shouldThrow();
277        } catch (NullPointerException success) {}
278     }
279
280    /**
264       * all elements successfully put are contained
265       */
266      public void testPut() throws InterruptedException {
267          ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
268          for (int i = 0; i < SIZE; ++i) {
269 <            Integer I = new Integer(i);
270 <            q.put(I);
271 <            assertTrue(q.contains(I));
269 >            Integer x = new Integer(i);
270 >            q.put(x);
271 >            assertTrue(q.contains(x));
272          }
273          assertEquals(0, q.remainingCapacity());
274      }
# Line 295 | Line 278 | public class ArrayBlockingQueueTest exte
278       */
279      public void testBlockingPut() throws InterruptedException {
280          final ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
281 <        Thread t = new Thread(new CheckedRunnable() {
281 >        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
282 >        Thread t = newStartedThread(new CheckedRunnable() {
283              public void realRun() throws InterruptedException {
284                  for (int i = 0; i < SIZE; ++i)
285                      q.put(i);
286                  assertEquals(SIZE, q.size());
287                  assertEquals(0, q.remainingCapacity());
288 +
289 +                Thread.currentThread().interrupt();
290                  try {
291                      q.put(99);
292                      shouldThrow();
293                  } catch (InterruptedException success) {}
294 +                assertFalse(Thread.interrupted());
295 +
296 +                pleaseInterrupt.countDown();
297 +                try {
298 +                    q.put(99);
299 +                    shouldThrow();
300 +                } catch (InterruptedException success) {}
301 +                assertFalse(Thread.interrupted());
302              }});
303  
304 <        t.start();
305 <        Thread.sleep(SHORT_DELAY_MS);
304 >        await(pleaseInterrupt);
305 >        assertThreadStaysAlive(t);
306          t.interrupt();
307 <        t.join();
307 >        awaitTermination(t);
308          assertEquals(SIZE, q.size());
309          assertEquals(0, q.remainingCapacity());
310      }
311  
312      /**
313 <     * put blocks waiting for take when full
313 >     * put blocks interruptibly waiting for take when full
314       */
315      public void testPutWithTake() throws InterruptedException {
316          final int capacity = 2;
317          final ArrayBlockingQueue q = new ArrayBlockingQueue(capacity);
318 <        Thread t = new Thread(new CheckedRunnable() {
318 >        final CountDownLatch pleaseTake = new CountDownLatch(1);
319 >        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
320 >        Thread t = newStartedThread(new CheckedRunnable() {
321              public void realRun() throws InterruptedException {
322 <                for (int i = 0; i < capacity + 1; i++)
322 >                for (int i = 0; i < capacity; i++)
323                      q.put(i);
324 +                pleaseTake.countDown();
325 +                q.put(86);
326 +
327 +                pleaseInterrupt.countDown();
328                  try {
329                      q.put(99);
330                      shouldThrow();
331                  } catch (InterruptedException success) {}
332 +                assertFalse(Thread.interrupted());
333              }});
334  
335 <        t.start();
336 <        Thread.sleep(SHORT_DELAY_MS);
336 <        assertEquals(q.remainingCapacity(), 0);
335 >        await(pleaseTake);
336 >        assertEquals(0, q.remainingCapacity());
337          assertEquals(0, q.take());
338 <        Thread.sleep(SHORT_DELAY_MS);
338 >
339 >        await(pleaseInterrupt);
340 >        assertThreadStaysAlive(t);
341          t.interrupt();
342 <        t.join();
343 <        assertEquals(q.remainingCapacity(), 0);
342 >        awaitTermination(t);
343 >        assertEquals(0, q.remainingCapacity());
344      }
345  
346      /**
# Line 346 | Line 348 | public class ArrayBlockingQueueTest exte
348       */
349      public void testTimedOffer() throws InterruptedException {
350          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
351 <        Thread t = new Thread(new CheckedRunnable() {
351 >        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
352 >        Thread t = newStartedThread(new CheckedRunnable() {
353              public void realRun() throws InterruptedException {
354                  q.put(new Object());
355                  q.put(new Object());
356 <                assertFalse(q.offer(new Object(), SHORT_DELAY_MS/2, MILLISECONDS));
356 >                long startTime = System.nanoTime();
357 >                assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
358 >                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
359 >                pleaseInterrupt.countDown();
360                  try {
361 <                    q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
361 >                    q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
362                      shouldThrow();
363                  } catch (InterruptedException success) {}
364              }});
365  
366 <        t.start();
367 <        Thread.sleep(SHORT_DELAY_MS);
366 >        await(pleaseInterrupt);
367 >        assertThreadStaysAlive(t);
368          t.interrupt();
369 <        t.join();
369 >        awaitTermination(t);
370      }
371  
372      /**
# Line 374 | Line 380 | public class ArrayBlockingQueueTest exte
380      }
381  
382      /**
377     * take blocks interruptibly when empty
378     */
379    public void testTakeFromEmpty() throws InterruptedException {
380        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
381        Thread t = new ThreadShouldThrow(InterruptedException.class) {
382            public void realRun() throws InterruptedException {
383                q.take();
384            }};
385
386        t.start();
387        Thread.sleep(SHORT_DELAY_MS);
388        t.interrupt();
389        t.join();
390    }
391
392    /**
383       * Take removes existing elements until empty, then blocks interruptibly
384       */
385      public void testBlockingTake() throws InterruptedException {
386          final ArrayBlockingQueue q = populatedQueue(SIZE);
387 <        Thread t = new Thread(new CheckedRunnable() {
387 >        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
388 >        Thread t = newStartedThread(new CheckedRunnable() {
389              public void realRun() throws InterruptedException {
390                  for (int i = 0; i < SIZE; ++i) {
391                      assertEquals(i, q.take());
392                  }
393 +
394 +                Thread.currentThread().interrupt();
395                  try {
396                      q.take();
397                      shouldThrow();
398                  } catch (InterruptedException success) {}
399 +                assertFalse(Thread.interrupted());
400 +
401 +                pleaseInterrupt.countDown();
402 +                try {
403 +                    q.take();
404 +                    shouldThrow();
405 +                } catch (InterruptedException success) {}
406 +                assertFalse(Thread.interrupted());
407              }});
408  
409 <        t.start();
410 <        Thread.sleep(SHORT_DELAY_MS);
409 >        await(pleaseInterrupt);
410 >        assertThreadStaysAlive(t);
411          t.interrupt();
412 <        t.join();
412 >        awaitTermination(t);
413      }
414  
414
415      /**
416       * poll succeeds unless empty
417       */
# Line 424 | Line 424 | public class ArrayBlockingQueueTest exte
424      }
425  
426      /**
427 <     * timed pool with zero timeout succeeds when non-empty, else times out
427 >     * timed poll with zero timeout succeeds when non-empty, else times out
428       */
429      public void testTimedPoll0() throws InterruptedException {
430          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 432 | Line 432 | public class ArrayBlockingQueueTest exte
432              assertEquals(i, q.poll(0, MILLISECONDS));
433          }
434          assertNull(q.poll(0, MILLISECONDS));
435 +        checkEmpty(q);
436      }
437  
438      /**
439 <     * timed pool with nonzero timeout succeeds when non-empty, else times out
439 >     * timed poll with nonzero timeout succeeds when non-empty, else times out
440       */
441      public void testTimedPoll() throws InterruptedException {
442          ArrayBlockingQueue q = populatedQueue(SIZE);
443          for (int i = 0; i < SIZE; ++i) {
444 <            assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
445 <        }
446 <        assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
444 >            long startTime = System.nanoTime();
445 >            assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
446 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
447 >        }
448 >        long startTime = System.nanoTime();
449 >        assertNull(q.poll(timeoutMillis(), MILLISECONDS));
450 >        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
451 >        checkEmpty(q);
452      }
453  
454      /**
# Line 450 | Line 456 | public class ArrayBlockingQueueTest exte
456       * returning timeout status
457       */
458      public void testInterruptedTimedPoll() throws InterruptedException {
459 <        Thread t = new Thread(new CheckedRunnable() {
459 >        final BlockingQueue<Integer> q = populatedQueue(SIZE);
460 >        final CountDownLatch aboutToWait = new CountDownLatch(1);
461 >        Thread t = newStartedThread(new CheckedRunnable() {
462              public void realRun() throws InterruptedException {
463 <                ArrayBlockingQueue q = populatedQueue(SIZE);
463 >                long startTime = System.nanoTime();
464                  for (int i = 0; i < SIZE; ++i) {
465 <                    assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));;
465 >                    assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
466                  }
467 <                try {
460 <                    q.poll(SMALL_DELAY_MS, MILLISECONDS);
461 <                    shouldThrow();
462 <                } catch (InterruptedException success) {}
463 <            }});
464 <
465 <        t.start();
466 <        Thread.sleep(SHORT_DELAY_MS);
467 <        t.interrupt();
468 <        t.join();
469 <    }
470 <
471 <    /**
472 <     *  timed poll before a delayed offer fails; after offer succeeds;
473 <     *  on interruption throws
474 <     */
475 <    public void testTimedPollWithOffer() throws InterruptedException {
476 <        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
477 <        Thread t = new Thread(new CheckedRunnable() {
478 <            public void realRun() throws InterruptedException {
479 <                assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
480 <                assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
467 >                aboutToWait.countDown();
468                  try {
469                      q.poll(LONG_DELAY_MS, MILLISECONDS);
470                      shouldThrow();
471 <                } catch (InterruptedException success) {}
471 >                } catch (InterruptedException success) {
472 >                    assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
473 >                }
474              }});
475  
476 <        t.start();
477 <        Thread.sleep(SMALL_DELAY_MS);
489 <        assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
476 >        await(aboutToWait);
477 >        waitForThreadToEnterWaitState(t);
478          t.interrupt();
479 <        t.join();
479 >        awaitTermination(t);
480 >        checkEmpty(q);
481      }
482  
494
483      /**
484       * peek returns next element, or null if empty
485       */
# Line 536 | Line 524 | public class ArrayBlockingQueueTest exte
524      }
525  
526      /**
539     * remove(x) removes x and returns true if present
540     */
541    public void testRemoveElement() {
542        ArrayBlockingQueue q = populatedQueue(SIZE);
543        for (int i = 1; i < SIZE; i+=2) {
544            assertTrue(q.remove(new Integer(i)));
545        }
546        for (int i = 0; i < SIZE; i+=2) {
547            assertTrue(q.remove(new Integer(i)));
548            assertFalse(q.remove(new Integer(i+1)));
549        }
550        assertTrue(q.isEmpty());
551    }
552
553    /**
527       * contains(x) reports true when elements added but not yet removed
528       */
529      public void testContains() {
# Line 606 | Line 579 | public class ArrayBlockingQueueTest exte
579                  assertTrue(changed);
580  
581              assertTrue(q.containsAll(p));
582 <            assertEquals(SIZE-i, q.size());
582 >            assertEquals(SIZE - i, q.size());
583              p.remove();
584          }
585      }
# Line 619 | Line 592 | public class ArrayBlockingQueueTest exte
592              ArrayBlockingQueue q = populatedQueue(SIZE);
593              ArrayBlockingQueue p = populatedQueue(i);
594              assertTrue(q.removeAll(p));
595 <            assertEquals(SIZE-i, q.size());
595 >            assertEquals(SIZE - i, q.size());
596              for (int j = 0; j < i; ++j) {
597 <                Integer I = (Integer)(p.remove());
598 <                assertFalse(q.contains(I));
597 >                Integer x = (Integer)(p.remove());
598 >                assertFalse(q.contains(x));
599              }
600          }
601      }
602  
603 <    /**
604 <     *  toArray contains all elements
632 <     */
633 <    public void testToArray() throws InterruptedException {
634 <        ArrayBlockingQueue q = populatedQueue(SIZE);
603 >    void checkToArray(ArrayBlockingQueue q) {
604 >        int size = q.size();
605          Object[] o = q.toArray();
606 <        for (int i = 0; i < o.length; i++)
607 <            assertEquals(o[i], q.take());
606 >        assertEquals(size, o.length);
607 >        Iterator it = q.iterator();
608 >        for (int i = 0; i < size; i++) {
609 >            Integer x = (Integer) it.next();
610 >            assertEquals((Integer)o[0] + i, (int) x);
611 >            assertSame(o[i], x);
612 >        }
613      }
614  
615      /**
616 <     * toArray(a) contains all elements
616 >     * toArray() contains all elements in FIFO order
617       */
618 <    public void testToArray2() throws InterruptedException {
619 <        ArrayBlockingQueue q = populatedQueue(SIZE);
620 <        Integer[] ints = new Integer[SIZE];
621 <        ints = (Integer[])q.toArray(ints);
622 <        for (int i = 0; i < ints.length; i++)
623 <            assertEquals(ints[i], q.take());
618 >    public void testToArray() {
619 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
620 >        for (int i = 0; i < SIZE; i++) {
621 >            checkToArray(q);
622 >            q.add(i);
623 >        }
624 >        // Provoke wraparound
625 >        for (int i = 0; i < SIZE; i++) {
626 >            checkToArray(q);
627 >            assertEquals(i, q.poll());
628 >            checkToArray(q);
629 >            q.add(SIZE + i);
630 >        }
631 >        for (int i = 0; i < SIZE; i++) {
632 >            checkToArray(q);
633 >            assertEquals(SIZE + i, q.poll());
634 >        }
635 >    }
636 >
637 >    void checkToArray2(ArrayBlockingQueue q) {
638 >        int size = q.size();
639 >        Integer[] a1 = (size == 0) ? null : new Integer[size - 1];
640 >        Integer[] a2 = new Integer[size];
641 >        Integer[] a3 = new Integer[size + 2];
642 >        if (size > 0) Arrays.fill(a1, 42);
643 >        Arrays.fill(a2, 42);
644 >        Arrays.fill(a3, 42);
645 >        Integer[] b1 = (size == 0) ? null : (Integer[]) q.toArray(a1);
646 >        Integer[] b2 = (Integer[]) q.toArray(a2);
647 >        Integer[] b3 = (Integer[]) q.toArray(a3);
648 >        assertSame(a2, b2);
649 >        assertSame(a3, b3);
650 >        Iterator it = q.iterator();
651 >        for (int i = 0; i < size; i++) {
652 >            Integer x = (Integer) it.next();
653 >            assertSame(b1[i], x);
654 >            assertEquals(b1[0] + i, (int) x);
655 >            assertSame(b2[i], x);
656 >            assertSame(b3[i], x);
657 >        }
658 >        assertNull(a3[size]);
659 >        assertEquals(42, (int) a3[size + 1]);
660 >        if (size > 0) {
661 >            assertNotSame(a1, b1);
662 >            assertEquals(size, b1.length);
663 >            for (int i = 0; i < a1.length; i++) {
664 >                assertEquals(42, (int) a1[i]);
665 >            }
666 >        }
667      }
668  
669      /**
670 <     * toArray(null) throws NPE
670 >     * toArray(a) contains all elements in FIFO order
671       */
672 <    public void testToArray_BadArg() {
673 <        ArrayBlockingQueue q = populatedQueue(SIZE);
674 <        try {
675 <            Object o[] = q.toArray(null);
676 <            shouldThrow();
677 <        } catch (NullPointerException success) {}
672 >    public void testToArray2() {
673 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
674 >        for (int i = 0; i < SIZE; i++) {
675 >            checkToArray2(q);
676 >            q.add(i);
677 >        }
678 >        // Provoke wraparound
679 >        for (int i = 0; i < SIZE; i++) {
680 >            checkToArray2(q);
681 >            assertEquals(i, q.poll());
682 >            checkToArray2(q);
683 >            q.add(SIZE + i);
684 >        }
685 >        for (int i = 0; i < SIZE; i++) {
686 >            checkToArray2(q);
687 >            assertEquals(SIZE + i, q.poll());
688 >        }
689      }
690  
691      /**
692 <     * toArray with incompatible array type throws CCE
692 >     * toArray(incompatible array type) throws ArrayStoreException
693       */
694      public void testToArray1_BadArg() {
695          ArrayBlockingQueue q = populatedQueue(SIZE);
696          try {
697 <            Object o[] = q.toArray(new String[10]);
697 >            q.toArray(new String[10]);
698              shouldThrow();
699          } catch (ArrayStoreException success) {}
700      }
701  
673
702      /**
703       * iterator iterates through all elements
704       */
705      public void testIterator() throws InterruptedException {
706          ArrayBlockingQueue q = populatedQueue(SIZE);
707          Iterator it = q.iterator();
708 <        while (it.hasNext()) {
708 >        int i;
709 >        for (i = 0; it.hasNext(); i++)
710 >            assertTrue(q.contains(it.next()));
711 >        assertEquals(i, SIZE);
712 >        assertIteratorExhausted(it);
713 >
714 >        it = q.iterator();
715 >        for (i = 0; it.hasNext(); i++)
716              assertEquals(it.next(), q.take());
717 <        }
717 >        assertEquals(i, SIZE);
718 >        assertIteratorExhausted(it);
719 >    }
720 >
721 >    /**
722 >     * iterator of empty collection has no elements
723 >     */
724 >    public void testEmptyIterator() {
725 >        assertIteratorExhausted(new ArrayBlockingQueue(SIZE).iterator());
726      }
727  
728      /**
# Line 734 | Line 777 | public class ArrayBlockingQueueTest exte
777          assertEquals(0, q.size());
778      }
779  
737
780      /**
781       * toString contains toStrings of elements
782       */
# Line 742 | Line 784 | public class ArrayBlockingQueueTest exte
784          ArrayBlockingQueue q = populatedQueue(SIZE);
785          String s = q.toString();
786          for (int i = 0; i < SIZE; ++i) {
787 <            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
787 >            assertTrue(s.contains(String.valueOf(i)));
788          }
789      }
790  
749
791      /**
792       * offer transfers elements across Executor tasks
793       */
# Line 754 | Line 795 | public class ArrayBlockingQueueTest exte
795          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
796          q.add(one);
797          q.add(two);
798 <        ExecutorService executor = Executors.newFixedThreadPool(2);
799 <        executor.execute(new CheckedRunnable() {
800 <            public void realRun() throws InterruptedException {
801 <                assertFalse(q.offer(three));
802 <                assertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
803 <                assertEquals(0, q.remainingCapacity());
804 <            }});
805 <
806 <        executor.execute(new CheckedRunnable() {
807 <            public void realRun() throws InterruptedException {
808 <                Thread.sleep(SMALL_DELAY_MS);
809 <                assertSame(one, q.take());
810 <            }});
811 <
812 <        joinPool(executor);
798 >        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
799 >        final ExecutorService executor = Executors.newFixedThreadPool(2);
800 >        try (PoolCleaner cleaner = cleaner(executor)) {
801 >            executor.execute(new CheckedRunnable() {
802 >                public void realRun() throws InterruptedException {
803 >                    assertFalse(q.offer(three));
804 >                    threadsStarted.await();
805 >                    assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
806 >                    assertEquals(0, q.remainingCapacity());
807 >                }});
808 >
809 >            executor.execute(new CheckedRunnable() {
810 >                public void realRun() throws InterruptedException {
811 >                    threadsStarted.await();
812 >                    assertEquals(0, q.remainingCapacity());
813 >                    assertSame(one, q.take());
814 >                }});
815 >        }
816      }
817  
818      /**
819 <     * poll retrieves elements across Executor threads
819 >     * timed poll retrieves elements across Executor threads
820       */
821      public void testPollInExecutor() {
822          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
823 <        ExecutorService executor = Executors.newFixedThreadPool(2);
824 <        executor.execute(new CheckedRunnable() {
825 <            public void realRun() throws InterruptedException {
826 <                assertNull(q.poll());
827 <                assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
828 <                assertTrue(q.isEmpty());
829 <            }});
830 <
831 <        executor.execute(new CheckedRunnable() {
832 <            public void realRun() throws InterruptedException {
833 <                Thread.sleep(SMALL_DELAY_MS);
834 <                q.put(one);
835 <            }});
836 <
837 <        joinPool(executor);
823 >        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
824 >        final ExecutorService executor = Executors.newFixedThreadPool(2);
825 >        try (PoolCleaner cleaner = cleaner(executor)) {
826 >            executor.execute(new CheckedRunnable() {
827 >                public void realRun() throws InterruptedException {
828 >                    assertNull(q.poll());
829 >                    threadsStarted.await();
830 >                    assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
831 >                    checkEmpty(q);
832 >                }});
833 >
834 >            executor.execute(new CheckedRunnable() {
835 >                public void realRun() throws InterruptedException {
836 >                    threadsStarted.await();
837 >                    q.put(one);
838 >                }});
839 >        }
840      }
841  
842      /**
843       * A deserialized serialized queue has same elements in same order
844       */
845      public void testSerialization() throws Exception {
846 <        ArrayBlockingQueue q = populatedQueue(SIZE);
847 <
802 <        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
803 <        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
804 <        out.writeObject(q);
805 <        out.close();
806 <
807 <        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
808 <        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
809 <        ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
810 <        assertEquals(q.size(), r.size());
811 <        while (!q.isEmpty())
812 <            assertEquals(q.remove(), r.remove());
813 <    }
814 <
815 <    /**
816 <     * drainTo(null) throws NPE
817 <     */
818 <    public void testDrainToNull() {
819 <        ArrayBlockingQueue q = populatedQueue(SIZE);
820 <        try {
821 <            q.drainTo(null);
822 <            shouldThrow();
823 <        } catch (NullPointerException success) {}
824 <    }
846 >        Queue x = populatedQueue(SIZE);
847 >        Queue y = serialClone(x);
848  
849 <    /**
850 <     * drainTo(this) throws IAE
851 <     */
852 <    public void testDrainToSelf() {
853 <        ArrayBlockingQueue q = populatedQueue(SIZE);
854 <        try {
855 <            q.drainTo(q);
856 <            shouldThrow();
857 <        } catch (IllegalArgumentException success) {}
849 >        assertNotSame(x, y);
850 >        assertEquals(x.size(), y.size());
851 >        assertEquals(x.toString(), y.toString());
852 >        assertTrue(Arrays.equals(x.toArray(), y.toArray()));
853 >        while (!x.isEmpty()) {
854 >            assertFalse(y.isEmpty());
855 >            assertEquals(x.remove(), y.remove());
856 >        }
857 >        assertTrue(y.isEmpty());
858      }
859  
860      /**
# Line 841 | Line 864 | public class ArrayBlockingQueueTest exte
864          ArrayBlockingQueue q = populatedQueue(SIZE);
865          ArrayList l = new ArrayList();
866          q.drainTo(l);
867 <        assertEquals(q.size(), 0);
868 <        assertEquals(l.size(), SIZE);
867 >        assertEquals(0, q.size());
868 >        assertEquals(SIZE, l.size());
869          for (int i = 0; i < SIZE; ++i)
870              assertEquals(l.get(i), new Integer(i));
871          q.add(zero);
# Line 852 | Line 875 | public class ArrayBlockingQueueTest exte
875          assertTrue(q.contains(one));
876          l.clear();
877          q.drainTo(l);
878 <        assertEquals(q.size(), 0);
879 <        assertEquals(l.size(), 2);
878 >        assertEquals(0, q.size());
879 >        assertEquals(2, l.size());
880          for (int i = 0; i < 2; ++i)
881              assertEquals(l.get(i), new Integer(i));
882      }
# Line 865 | Line 888 | public class ArrayBlockingQueueTest exte
888          final ArrayBlockingQueue q = populatedQueue(SIZE);
889          Thread t = new Thread(new CheckedRunnable() {
890              public void realRun() throws InterruptedException {
891 <                q.put(new Integer(SIZE+1));
891 >                q.put(new Integer(SIZE + 1));
892              }});
893  
894          t.start();
# Line 879 | Line 902 | public class ArrayBlockingQueueTest exte
902      }
903  
904      /**
905 <     * drainTo(null, n) throws NPE
883 <     */
884 <    public void testDrainToNullN() {
885 <        ArrayBlockingQueue q = populatedQueue(SIZE);
886 <        try {
887 <            q.drainTo(null, 0);
888 <            shouldThrow();
889 <        } catch (NullPointerException success) {}
890 <    }
891 <
892 <    /**
893 <     * drainTo(this, n) throws IAE
894 <     */
895 <    public void testDrainToSelfN() {
896 <        ArrayBlockingQueue q = populatedQueue(SIZE);
897 <        try {
898 <            q.drainTo(q, 0);
899 <            shouldThrow();
900 <        } catch (IllegalArgumentException success) {}
901 <    }
902 <
903 <    /**
904 <     * drainTo(c, n) empties first max {n, size} elements of queue into c
905 >     * drainTo(c, n) empties first min(n, size) elements of queue into c
906       */
907      public void testDrainToN() {
908 <        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE*2);
908 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE * 2);
909          for (int i = 0; i < SIZE + 2; ++i) {
910              for (int j = 0; j < SIZE; j++)
911                  assertTrue(q.offer(new Integer(j)));
912              ArrayList l = new ArrayList();
913              q.drainTo(l, i);
914 <            int k = (i < SIZE)? i : SIZE;
915 <            assertEquals(l.size(), k);
916 <            assertEquals(q.size(), SIZE-k);
914 >            int k = (i < SIZE) ? i : SIZE;
915 >            assertEquals(k, l.size());
916 >            assertEquals(SIZE - k, q.size());
917              for (int j = 0; j < k; ++j)
918                  assertEquals(l.get(j), new Integer(j));
919 <            while (q.poll() != null) ;
919 >            do {} while (q.poll() != null);
920          }
921      }
922  
923 +    /**
924 +     * remove(null), contains(null) always return false
925 +     */
926 +    public void testNeverContainsNull() {
927 +        Collection<?>[] qs = {
928 +            new ArrayBlockingQueue<Object>(10),
929 +            populatedQueue(2),
930 +        };
931 +
932 +        for (Collection<?> q : qs) {
933 +            assertFalse(q.contains(null));
934 +            assertFalse(q.remove(null));
935 +        }
936 +    }
937   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines