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.4 by dl, Sat Sep 20 18:20:07 2003 UTC vs.
Revision 1.30 by jsr166, Wed Aug 25 01:44:48 2010 UTC

# Line 1 | Line 1
1   /*
2 < * Written by members of JCP JSR-166 Expert Group and released to the
3 < * public domain. Use, modify, and redistribute this code in any way
4 < * without acknowledgement. Other contributors include Andrew Wright,
5 < * Jeffrey Hayes, Pat Fischer, Mike Judd.
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
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.*;
13 + import static java.util.concurrent.TimeUnit.MILLISECONDS;
14   import java.io.*;
15  
16   public class ArrayBlockingQueueTest extends JSR166TestCase {
17      public static void main(String[] args) {
18 <        junit.textui.TestRunner.run (suite());  
18 >        junit.textui.TestRunner.run(suite());
19      }
20      public static Test suite() {
21 <        return new TestSuite(ArrayBlockingQueueTest.class);
21 >        return new TestSuite(ArrayBlockingQueueTest.class);
22      }
23  
24      /**
# Line 26 | Line 28 | public class ArrayBlockingQueueTest exte
28      private ArrayBlockingQueue populatedQueue(int n) {
29          ArrayBlockingQueue q = new ArrayBlockingQueue(n);
30          assertTrue(q.isEmpty());
31 <        for(int i = 0; i < n; i++)
32 <            assertTrue(q.offer(new Integer(i)));
31 >        for (int i = 0; i < n; i++)
32 >            assertTrue(q.offer(new Integer(i)));
33          assertFalse(q.isEmpty());
34          assertEquals(0, q.remainingCapacity());
35 <        assertEquals(n, q.size());
35 >        assertEquals(n, q.size());
36          return q;
37      }
38 <
38 >
39      /**
40 <     *
40 >     * A new queue has the indicated capacity
41       */
42      public void testConstructor1() {
43          assertEquals(SIZE, new ArrayBlockingQueue(SIZE).remainingCapacity());
44      }
45  
46      /**
47 <     *
47 >     * Constructor throws IAE if capacity argument nonpositive
48       */
49      public void testConstructor2() {
50          try {
51              ArrayBlockingQueue q = new ArrayBlockingQueue(0);
52              shouldThrow();
53 <        }
52 <        catch (IllegalArgumentException success) {}
53 >        } catch (IllegalArgumentException success) {}
54      }
55  
56      /**
57 <     *
57 >     * Initializing from null Collection throws NPE
58       */
59      public void testConstructor3() {
59
60          try {
61              ArrayBlockingQueue q = new ArrayBlockingQueue(1, true, null);
62              shouldThrow();
63 <        }
64 <        catch (NullPointerException success) {}
63 >        } catch (NullPointerException success) {}
64      }
65  
66      /**
67 <     *
67 >     * Initializing from Collection of null elements throws NPE
68       */
69      public void testConstructor4() {
70          try {
71              Integer[] ints = new Integer[SIZE];
72              ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
73              shouldThrow();
74 <        }
76 <        catch (NullPointerException success) {}
74 >        } catch (NullPointerException success) {}
75      }
76  
77      /**
78 <     *
78 >     * Initializing from Collection with some null elements throws NPE
79       */
80      public void testConstructor5() {
81          try {
# Line 86 | Line 84 | public class ArrayBlockingQueueTest exte
84                  ints[i] = new Integer(i);
85              ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
86              shouldThrow();
87 <        }
90 <        catch (NullPointerException success) {}
87 >        } catch (NullPointerException success) {}
88      }
89  
90      /**
91 <     *
91 >     * Initializing from too large collection throws IAE
92       */
93      public void testConstructor6() {
94          try {
# Line 100 | Line 97 | public class ArrayBlockingQueueTest exte
97                  ints[i] = new Integer(i);
98              ArrayBlockingQueue q = new ArrayBlockingQueue(1, false, Arrays.asList(ints));
99              shouldThrow();
100 <        }
104 <        catch (IllegalArgumentException success) {}
100 >        } catch (IllegalArgumentException success) {}
101      }
102  
103      /**
104 <     *
104 >     * Queue contains all elements of collection used to initialize
105       */
106      public void testConstructor7() {
107 <        try {
108 <            Integer[] ints = new Integer[SIZE];
109 <            for (int i = 0; i < SIZE; ++i)
110 <                ints[i] = new Integer(i);
111 <            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, Arrays.asList(ints));
112 <            for (int i = 0; i < SIZE; ++i)
117 <                assertEquals(ints[i], q.poll());
118 <        }
119 <        finally {}
107 >        Integer[] ints = new Integer[SIZE];
108 >        for (int i = 0; i < SIZE; ++i)
109 >            ints[i] = new Integer(i);
110 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, Arrays.asList(ints));
111 >        for (int i = 0; i < SIZE; ++i)
112 >            assertEquals(ints[i], q.poll());
113      }
114  
115      /**
116 <     *
116 >     * Queue transitions from empty to full when elements added
117       */
118      public void testEmptyFull() {
119          ArrayBlockingQueue q = new ArrayBlockingQueue(2);
# Line 135 | Line 128 | public class ArrayBlockingQueueTest exte
128      }
129  
130      /**
131 <     *
131 >     * remainingCapacity decreases on add, increases on remove
132       */
133      public void testRemainingCapacity() {
134          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 152 | Line 145 | public class ArrayBlockingQueueTest exte
145      }
146  
147      /**
148 <     *
148 >     *  offer(null) throws NPE
149       */
150      public void testOfferNull() {
151 <        try {
151 >        try {
152              ArrayBlockingQueue q = new ArrayBlockingQueue(1);
153              q.offer(null);
154              shouldThrow();
155 <        } catch (NullPointerException success) { }  
155 >        } catch (NullPointerException success) {}
156      }
157  
158      /**
159 <     *
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 >    /**
170 >     * Offer succeeds if not full; fails if full
171       */
172      public void testOffer() {
173          ArrayBlockingQueue q = new ArrayBlockingQueue(1);
# Line 172 | Line 176 | public class ArrayBlockingQueueTest exte
176      }
177  
178      /**
179 <     *
179 >     * add succeeds if not full; throws ISE if full
180       */
181      public void testAdd() {
182 <        try {
182 >        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());
188              q.add(new Integer(SIZE));
189 <        } catch (IllegalStateException success){
190 <        }  
189 >            shouldThrow();
190 >        } catch (IllegalStateException success) {}
191      }
192  
193      /**
194 <     *
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 <        }
202 <        catch (NullPointerException success) {}
201 >        } catch (NullPointerException success) {}
202 >    }
203 >
204 >    /**
205 >     * addAll(this) throws IAE
206 >     */
207 >    public void testAddAllSelf() {
208 >        try {
209 >            ArrayBlockingQueue q = populatedQueue(SIZE);
210 >            q.addAll(q);
211 >            shouldThrow();
212 >        } catch (IllegalArgumentException success) {}
213      }
214 +
215 +
216      /**
217 <     *
217 >     *  addAll of a collection with null elements throws NPE
218       */
219      public void testAddAll2() {
220          try {
# Line 206 | Line 222 | public class ArrayBlockingQueueTest exte
222              Integer[] ints = new Integer[SIZE];
223              q.addAll(Arrays.asList(ints));
224              shouldThrow();
225 <        }
210 <        catch (NullPointerException success) {}
225 >        } catch (NullPointerException success) {}
226      }
227 +
228      /**
229 <     *
229 >     * addAll of a collection with any null elements throws NPE after
230 >     * possibly adding some elements
231       */
232      public void testAddAll3() {
233          try {
# Line 220 | Line 237 | public class ArrayBlockingQueueTest exte
237                  ints[i] = new Integer(i);
238              q.addAll(Arrays.asList(ints));
239              shouldThrow();
240 <        }
224 <        catch (NullPointerException success) {}
240 >        } catch (NullPointerException success) {}
241      }
242 +
243      /**
244 <     *
244 >     * addAll throws ISE if not enough room
245       */
246      public void testAddAll4() {
247          try {
# Line 234 | Line 251 | public class ArrayBlockingQueueTest exte
251                  ints[i] = new Integer(i);
252              q.addAll(Arrays.asList(ints));
253              shouldThrow();
254 <        }
238 <        catch (IllegalStateException success) {}
254 >        } catch (IllegalStateException success) {}
255      }
256 +
257      /**
258 <     *
258 >     * Queue contains all elements, in traversal order, of successful addAll
259       */
260      public void testAddAll5() {
261 <        try {
262 <            Integer[] empty = new Integer[0];
263 <            Integer[] ints = new Integer[SIZE];
264 <            for (int i = 0; i < SIZE; ++i)
265 <                ints[i] = new Integer(i);
266 <            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
267 <            assertFalse(q.addAll(Arrays.asList(empty)));
268 <            assertTrue(q.addAll(Arrays.asList(ints)));
269 <            for (int i = 0; i < SIZE; ++i)
253 <                assertEquals(ints[i], q.poll());
254 <        }
255 <        finally {}
261 >        Integer[] empty = new Integer[0];
262 >        Integer[] ints = new Integer[SIZE];
263 >        for (int i = 0; i < SIZE; ++i)
264 >            ints[i] = new Integer(i);
265 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
266 >        assertFalse(q.addAll(Arrays.asList(empty)));
267 >        assertTrue(q.addAll(Arrays.asList(ints)));
268 >        for (int i = 0; i < SIZE; ++i)
269 >            assertEquals(ints[i], q.poll());
270      }
271  
272      /**
273 <     *
273 >     *  put(null) throws NPE
274       */
275 <     public void testPutNull() {
276 <        try {
275 >    public void testPutNull() throws InterruptedException {
276 >        try {
277              ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
278              q.put(null);
279              shouldThrow();
280 <        }
267 <        catch (NullPointerException success){
268 <        }  
269 <        catch (InterruptedException ie) {
270 <            unexpectedException();
271 <        }
280 >        } catch (NullPointerException success) {}
281       }
282  
283      /**
284 <     *
284 >     * all elements successfully put are contained
285       */
286 <     public void testPut() {
287 <         try {
288 <             ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
289 <             for (int i = 0; i < SIZE; ++i) {
290 <                 Integer I = new Integer(i);
291 <                 q.put(I);
283 <                 assertTrue(q.contains(I));
284 <             }
285 <             assertEquals(0, q.remainingCapacity());
286 <         }
287 <        catch (InterruptedException ie) {
288 <            unexpectedException();
286 >    public void testPut() throws InterruptedException {
287 >        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
288 >        for (int i = 0; i < SIZE; ++i) {
289 >            Integer I = new Integer(i);
290 >            q.put(I);
291 >            assertTrue(q.contains(I));
292          }
293 +        assertEquals(0, q.remainingCapacity());
294      }
295  
296      /**
297 <     *
298 <     */
299 <    public void testBlockingPut() {
300 <        Thread t = new Thread(new Runnable() {
301 <                public void run() {
302 <                    int added = 0;
303 <                    try {
304 <                        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
305 <                        for (int i = 0; i < SIZE; ++i) {
306 <                            q.put(new Integer(i));
307 <                            ++added;
308 <                        }
309 <                        q.put(new Integer(SIZE));
310 <                        threadShouldThrow();
311 <                    } catch (InterruptedException ie){
312 <                        threadAssertEquals(added, SIZE);
313 <                    }  
314 <                }});
315 <        try {
316 <            t.start();
317 <           Thread.sleep(SHORT_DELAY_MS);
318 <           t.interrupt();
315 <           t.join();
316 <        }
317 <        catch (InterruptedException ie) {
318 <            unexpectedException();
319 <        }
297 >     * put blocks interruptibly if full
298 >     */
299 >    public void testBlockingPut() throws InterruptedException {
300 >        final ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
301 >        Thread t = new Thread(new CheckedRunnable() {
302 >            public void realRun() throws InterruptedException {
303 >                for (int i = 0; i < SIZE; ++i)
304 >                    q.put(i);
305 >                assertEquals(SIZE, q.size());
306 >                assertEquals(0, q.remainingCapacity());
307 >                try {
308 >                    q.put(99);
309 >                    shouldThrow();
310 >                } catch (InterruptedException success) {}
311 >            }});
312 >
313 >        t.start();
314 >        Thread.sleep(SHORT_DELAY_MS);
315 >        t.interrupt();
316 >        t.join();
317 >        assertEquals(SIZE, q.size());
318 >        assertEquals(0, q.remainingCapacity());
319      }
320  
321      /**
322 <     *
322 >     * put blocks waiting for take when full
323       */
324 <    public void testPutWithTake() {
325 <        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
326 <        Thread t = new Thread(new Runnable() {
327 <                public void run() {
328 <                    int added = 0;
329 <                    try {
330 <                        q.put(new Object());
331 <                        ++added;
332 <                        q.put(new Object());
333 <                        ++added;
334 <                        q.put(new Object());
335 <                        ++added;
336 <                        q.put(new Object());
337 <                        ++added;
338 <                        threadShouldThrow();
339 <                    } catch (InterruptedException e){
340 <                        threadAssertTrue(added >= 2);
341 <                    }
342 <                }
343 <            });
344 <        try {
346 <            t.start();
347 <            Thread.sleep(SHORT_DELAY_MS);
348 <            q.take();
349 <            t.interrupt();
350 <            t.join();
351 <        } catch (Exception e){
352 <            unexpectedException();
353 <        }
324 >    public void testPutWithTake() throws InterruptedException {
325 >        final int capacity = 2;
326 >        final ArrayBlockingQueue q = new ArrayBlockingQueue(capacity);
327 >        Thread t = new Thread(new CheckedRunnable() {
328 >            public void realRun() throws InterruptedException {
329 >                for (int i = 0; i < capacity + 1; i++)
330 >                    q.put(i);
331 >                try {
332 >                    q.put(99);
333 >                    shouldThrow();
334 >                } catch (InterruptedException success) {}
335 >            }});
336 >
337 >        t.start();
338 >        Thread.sleep(SHORT_DELAY_MS);
339 >        assertEquals(q.remainingCapacity(), 0);
340 >        assertEquals(0, q.take());
341 >        Thread.sleep(SHORT_DELAY_MS);
342 >        t.interrupt();
343 >        t.join();
344 >        assertEquals(q.remainingCapacity(), 0);
345      }
346  
347      /**
348 <     *
348 >     * timed offer times out if full and elements not taken
349       */
350 <    public void testTimedOffer() {
350 >    public void testTimedOffer() throws InterruptedException {
351          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
352 <        Thread t = new Thread(new Runnable() {
353 <                public void run() {
354 <                    try {
355 <                        q.put(new Object());
356 <                        q.put(new Object());
357 <                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS/2, TimeUnit.MILLISECONDS));
358 <                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
359 <                        threadShouldThrow();
360 <                    } catch (InterruptedException success){}
361 <                }
362 <            });
363 <        
364 <        try {
365 <            t.start();
366 <            Thread.sleep(SHORT_DELAY_MS);
376 <            t.interrupt();
377 <            t.join();
378 <        } catch (Exception e){
379 <            unexpectedException();
380 <        }
352 >        Thread t = new Thread(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));
357 >                try {
358 >                    q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
359 >                    shouldThrow();
360 >                } catch (InterruptedException success) {}
361 >            }});
362 >
363 >        t.start();
364 >        Thread.sleep(SHORT_DELAY_MS);
365 >        t.interrupt();
366 >        t.join();
367      }
368  
369      /**
370 <     *
370 >     * take retrieves elements in FIFO order
371       */
372 <    public void testTake() {
373 <        try {
374 <            ArrayBlockingQueue q = populatedQueue(SIZE);
375 <            for (int i = 0; i < SIZE; ++i) {
376 <                assertEquals(i, ((Integer)q.take()).intValue());
391 <            }
392 <        } catch (InterruptedException e){
393 <            unexpectedException();
394 <        }  
372 >    public void testTake() throws InterruptedException {
373 >        ArrayBlockingQueue q = populatedQueue(SIZE);
374 >        for (int i = 0; i < SIZE; ++i) {
375 >            assertEquals(i, q.take());
376 >        }
377      }
378  
379      /**
380 <     *
380 >     * take blocks interruptibly when empty
381       */
382 <    public void testTakeFromEmpty() {
382 >    public void testTakeFromEmpty() throws InterruptedException {
383          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
384 <        Thread t = new Thread(new Runnable() {
385 <                public void run() {
386 <                    try {
387 <                        q.take();
388 <                        threadShouldThrow();
389 <                    } catch (InterruptedException success){ }                
390 <                }
391 <            });
392 <        try {
411 <            t.start();
412 <            Thread.sleep(SHORT_DELAY_MS);
413 <            t.interrupt();
414 <            t.join();
415 <        } catch (Exception e){
416 <            unexpectedException();
417 <        }
384 >        Thread t = new ThreadShouldThrow(InterruptedException.class) {
385 >            public void realRun() throws InterruptedException {
386 >                q.take();
387 >            }};
388 >
389 >        t.start();
390 >        Thread.sleep(SHORT_DELAY_MS);
391 >        t.interrupt();
392 >        t.join();
393      }
394  
395      /**
396 <     *
397 <     */
398 <    public void testBlockingTake() {
399 <        Thread t = new Thread(new Runnable() {
400 <                public void run() {
401 <                    try {
402 <                        ArrayBlockingQueue q = populatedQueue(SIZE);
403 <                        for (int i = 0; i < SIZE; ++i) {
404 <                            threadAssertEquals(i, ((Integer)q.take()).intValue());
405 <                        }
406 <                        q.take();
407 <                        threadShouldThrow();
408 <                    } catch (InterruptedException success){
409 <                    }  
410 <                }});
411 <        try {
412 <            t.start();
413 <            Thread.sleep(SHORT_DELAY_MS);
414 <            t.interrupt();
440 <            t.join();
441 <        }
442 <        catch (InterruptedException ie) {
443 <            unexpectedException();
444 <        }
396 >     * Take removes existing elements until empty, then blocks interruptibly
397 >     */
398 >    public void testBlockingTake() throws InterruptedException {
399 >        final ArrayBlockingQueue q = populatedQueue(SIZE);
400 >        Thread t = new Thread(new CheckedRunnable() {
401 >            public void realRun() throws InterruptedException {
402 >                for (int i = 0; i < SIZE; ++i) {
403 >                    assertEquals(i, q.take());
404 >                }
405 >                try {
406 >                    q.take();
407 >                    shouldThrow();
408 >                } catch (InterruptedException success) {}
409 >            }});
410 >
411 >        t.start();
412 >        Thread.sleep(SHORT_DELAY_MS);
413 >        t.interrupt();
414 >        t.join();
415      }
416  
417  
418      /**
419 <     *
419 >     * poll succeeds unless empty
420       */
421      public void testPoll() {
422          ArrayBlockingQueue q = populatedQueue(SIZE);
423          for (int i = 0; i < SIZE; ++i) {
424 <            assertEquals(i, ((Integer)q.poll()).intValue());
424 >            assertEquals(i, q.poll());
425          }
426 <        assertNull(q.poll());
426 >        assertNull(q.poll());
427      }
428  
429      /**
430 <     *
430 >     * timed pool with zero timeout succeeds when non-empty, else times out
431       */
432 <    public void testTimedPoll0() {
433 <        try {
434 <            ArrayBlockingQueue q = populatedQueue(SIZE);
435 <            for (int i = 0; i < SIZE; ++i) {
436 <                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
437 <            }
468 <            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
469 <        } catch (InterruptedException e){
470 <            unexpectedException();
471 <        }  
432 >    public void testTimedPoll0() throws InterruptedException {
433 >        ArrayBlockingQueue q = populatedQueue(SIZE);
434 >        for (int i = 0; i < SIZE; ++i) {
435 >            assertEquals(i, q.poll(0, MILLISECONDS));
436 >        }
437 >        assertNull(q.poll(0, MILLISECONDS));
438      }
439  
440      /**
441 <     *
441 >     * timed pool with nonzero timeout succeeds when non-empty, else times out
442       */
443 <    public void testTimedPoll() {
444 <        try {
445 <            ArrayBlockingQueue q = populatedQueue(SIZE);
446 <            for (int i = 0; i < SIZE; ++i) {
447 <                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
448 <            }
483 <            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
484 <        } catch (InterruptedException e){
485 <            unexpectedException();
486 <        }  
443 >    public void testTimedPoll() throws InterruptedException {
444 >        ArrayBlockingQueue q = populatedQueue(SIZE);
445 >        for (int i = 0; i < SIZE; ++i) {
446 >            assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
447 >        }
448 >        assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
449      }
450  
451      /**
452 <     *
452 >     * Interrupted timed poll throws InterruptedException instead of
453 >     * returning timeout status
454       */
455 <    public void testInterruptedTimedPoll() {
456 <        Thread t = new Thread(new Runnable() {
457 <                public void run() {
458 <                    try {
459 <                        ArrayBlockingQueue q = populatedQueue(SIZE);
460 <                        for (int i = 0; i < SIZE; ++i) {
461 <                            threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
462 <                        }
463 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
464 <                    } catch (InterruptedException success){
465 <                    }  
466 <                }});
467 <        try {
468 <            t.start();
469 <            Thread.sleep(SHORT_DELAY_MS);
470 <            t.interrupt();
471 <            t.join();
509 <        }
510 <        catch (InterruptedException ie) {
511 <            unexpectedException();
512 <        }
455 >    public void testInterruptedTimedPoll() throws InterruptedException {
456 >        Thread t = new Thread(new CheckedRunnable() {
457 >            public void realRun() throws InterruptedException {
458 >                ArrayBlockingQueue q = populatedQueue(SIZE);
459 >                for (int i = 0; i < SIZE; ++i) {
460 >                    assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));;
461 >                }
462 >                try {
463 >                    q.poll(SMALL_DELAY_MS, MILLISECONDS);
464 >                    shouldThrow();
465 >                } catch (InterruptedException success) {}
466 >            }});
467 >
468 >        t.start();
469 >        Thread.sleep(SHORT_DELAY_MS);
470 >        t.interrupt();
471 >        t.join();
472      }
473  
474      /**
475 <     *
475 >     *  timed poll before a delayed offer fails; after offer succeeds;
476 >     *  on interruption throws
477       */
478 <    public void testTimedPollWithOffer() {
478 >    public void testTimedPollWithOffer() throws InterruptedException {
479          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
480 <        Thread t = new Thread(new Runnable() {
481 <                public void run() {
482 <                    try {
483 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
484 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
485 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
486 <                        threadShouldThrow();
487 <                    } catch (InterruptedException success) { }                
488 <                }
489 <            });
490 <        try {
491 <            t.start();
492 <            Thread.sleep(SMALL_DELAY_MS);
493 <            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
494 <            t.interrupt();
495 <            t.join();
536 <        } catch (Exception e){
537 <            unexpectedException();
538 <        }
539 <    }  
480 >        Thread t = new Thread(new CheckedRunnable() {
481 >            public void realRun() throws InterruptedException {
482 >                assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
483 >                assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
484 >                try {
485 >                    q.poll(LONG_DELAY_MS, MILLISECONDS);
486 >                    shouldThrow();
487 >                } catch (InterruptedException success) {}
488 >            }});
489 >
490 >        t.start();
491 >        Thread.sleep(SMALL_DELAY_MS);
492 >        assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
493 >        t.interrupt();
494 >        t.join();
495 >    }
496  
497  
498      /**
499 <     *
499 >     * peek returns next element, or null if empty
500       */
501      public void testPeek() {
502          ArrayBlockingQueue q = populatedQueue(SIZE);
503          for (int i = 0; i < SIZE; ++i) {
504 <            assertEquals(i, ((Integer)q.peek()).intValue());
505 <            q.poll();
504 >            assertEquals(i, q.peek());
505 >            assertEquals(i, q.poll());
506              assertTrue(q.peek() == null ||
507 <                       i != ((Integer)q.peek()).intValue());
507 >                       !q.peek().equals(i));
508          }
509 <        assertNull(q.peek());
509 >        assertNull(q.peek());
510      }
511  
512      /**
513 <     *
513 >     * element returns next element, or throws NSEE if empty
514       */
515      public void testElement() {
516          ArrayBlockingQueue q = populatedQueue(SIZE);
517          for (int i = 0; i < SIZE; ++i) {
518 <            assertEquals(i, ((Integer)q.element()).intValue());
519 <            q.poll();
518 >            assertEquals(i, q.element());
519 >            assertEquals(i, q.poll());
520          }
521          try {
522              q.element();
523              shouldThrow();
524 <        }
569 <        catch (NoSuchElementException success) {}
524 >        } catch (NoSuchElementException success) {}
525      }
526  
527      /**
528 <     *
528 >     * remove removes next element, or throws NSEE if empty
529       */
530      public void testRemove() {
531          ArrayBlockingQueue q = populatedQueue(SIZE);
532          for (int i = 0; i < SIZE; ++i) {
533 <            assertEquals(i, ((Integer)q.remove()).intValue());
533 >            assertEquals(i, q.remove());
534          }
535          try {
536              q.remove();
537              shouldThrow();
538 <        } catch (NoSuchElementException success){
584 <        }  
538 >        } catch (NoSuchElementException success) {}
539      }
540  
541      /**
542 <     *
542 >     * remove(x) removes x and returns true if present
543       */
544      public void testRemoveElement() {
545          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 598 | Line 552 | public class ArrayBlockingQueueTest exte
552          }
553          assertTrue(q.isEmpty());
554      }
555 <        
555 >
556      /**
557 <     *
557 >     * contains(x) reports true when elements added but not yet removed
558       */
559      public void testContains() {
560          ArrayBlockingQueue q = populatedQueue(SIZE);
561          for (int i = 0; i < SIZE; ++i) {
562              assertTrue(q.contains(new Integer(i)));
563 <            q.poll();
563 >            assertEquals(i, q.poll());
564              assertFalse(q.contains(new Integer(i)));
565          }
566      }
567  
568      /**
569 <     *
569 >     * clear removes all elements
570       */
571      public void testClear() {
572          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 622 | Line 576 | public class ArrayBlockingQueueTest exte
576          assertEquals(SIZE, q.remainingCapacity());
577          q.add(one);
578          assertFalse(q.isEmpty());
579 +        assertTrue(q.contains(one));
580          q.clear();
581          assertTrue(q.isEmpty());
582      }
583  
584      /**
585 <     *
585 >     * containsAll(c) is true when c contains a subset of elements
586       */
587      public void testContainsAll() {
588          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 641 | Line 596 | public class ArrayBlockingQueueTest exte
596      }
597  
598      /**
599 <     *
599 >     * retainAll(c) retains only those elements of c and reports true if changed
600       */
601      public void testRetainAll() {
602          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 660 | Line 615 | public class ArrayBlockingQueueTest exte
615      }
616  
617      /**
618 <     *
618 >     * removeAll(c) removes only those elements of c and reports true if changed
619       */
620      public void testRemoveAll() {
621          for (int i = 1; i < SIZE; ++i) {
# Line 675 | Line 630 | public class ArrayBlockingQueueTest exte
630          }
631      }
632  
633 +    /**
634 +     *  toArray contains all elements
635 +     */
636 +    public void testToArray() throws InterruptedException {
637 +        ArrayBlockingQueue q = populatedQueue(SIZE);
638 +        Object[] o = q.toArray();
639 +        for (int i = 0; i < o.length; i++)
640 +            assertEquals(o[i], q.take());
641 +    }
642  
643      /**
644 <     *
644 >     * toArray(a) contains all elements
645       */
646 <    public void testToArray() {
646 >    public void testToArray2() throws InterruptedException {
647          ArrayBlockingQueue q = populatedQueue(SIZE);
648 <        Object[] o = q.toArray();
649 <        try {
650 <        for(int i = 0; i < o.length; i++)
651 <            assertEquals(o[i], q.take());
652 <        } catch (InterruptedException e){
653 <            unexpectedException();
654 <        }    
648 >        Integer[] ints = new Integer[SIZE];
649 >        ints = (Integer[])q.toArray(ints);
650 >        for (int i = 0; i < ints.length; i++)
651 >            assertEquals(ints[i], q.take());
652 >    }
653 >
654 >    /**
655 >     * toArray(null) throws NPE
656 >     */
657 >    public void testToArray_BadArg() {
658 >        ArrayBlockingQueue q = populatedQueue(SIZE);
659 >        try {
660 >            Object o[] = q.toArray(null);
661 >            shouldThrow();
662 >        } catch (NullPointerException success) {}
663      }
664  
665      /**
666 <     *
666 >     * toArray with incompatible array type throws CCE
667       */
668 <    public void testToArray2() {
668 >    public void testToArray1_BadArg() {
669          ArrayBlockingQueue q = populatedQueue(SIZE);
670 <        Integer[] ints = new Integer[SIZE];
671 <        ints = (Integer[])q.toArray(ints);
672 <        try {
673 <            for(int i = 0; i < ints.length; i++)
702 <                assertEquals(ints[i], q.take());
703 <        } catch (InterruptedException e){
704 <            unexpectedException();
705 <        }    
670 >        try {
671 >            Object o[] = q.toArray(new String[10]);
672 >            shouldThrow();
673 >        } catch (ArrayStoreException success) {}
674      }
675 <    
675 >
676 >
677      /**
678 <     *
678 >     * iterator iterates through all elements
679       */
680 <    public void testIterator() {
680 >    public void testIterator() throws InterruptedException {
681          ArrayBlockingQueue q = populatedQueue(SIZE);
682 <        Iterator it = q.iterator();
683 <        try {
684 <            while(it.hasNext()){
685 <                assertEquals(it.next(), q.take());
686 <            }
687 <        } catch (InterruptedException e){
688 <            unexpectedException();
689 <        }    
682 >        Iterator it = q.iterator();
683 >        while (it.hasNext()) {
684 >            assertEquals(it.next(), q.take());
685 >        }
686 >    }
687 >
688 >    /**
689 >     * iterator.remove removes current element
690 >     */
691 >    public void testIteratorRemove() {
692 >        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
693 >        q.add(two);
694 >        q.add(one);
695 >        q.add(three);
696 >
697 >        Iterator it = q.iterator();
698 >        it.next();
699 >        it.remove();
700 >
701 >        it = q.iterator();
702 >        assertSame(it.next(), one);
703 >        assertSame(it.next(), three);
704 >        assertFalse(it.hasNext());
705      }
706  
707      /**
708 <     *
708 >     * iterator ordering is FIFO
709       */
710      public void testIteratorOrdering() {
711          final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
# Line 733 | Line 717 | public class ArrayBlockingQueueTest exte
717  
718          int k = 0;
719          for (Iterator it = q.iterator(); it.hasNext();) {
720 <            int i = ((Integer)(it.next())).intValue();
737 <            assertEquals(++k, i);
720 >            assertEquals(++k, it.next());
721          }
722          assertEquals(3, k);
723      }
724  
725      /**
726 <     *
726 >     * Modifications do not cause iterators to fail
727       */
728 <    public void testWeaklyConsistentIteration () {
728 >    public void testWeaklyConsistentIteration() {
729          final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
730          q.add(one);
731          q.add(two);
732          q.add(three);
733 <        try {
734 <            for (Iterator it = q.iterator(); it.hasNext();) {
735 <                q.remove();
753 <                it.next();
754 <            }
755 <        }
756 <        catch (ConcurrentModificationException e) {
757 <            unexpectedException();
733 >        for (Iterator it = q.iterator(); it.hasNext();) {
734 >            q.remove();
735 >            it.next();
736          }
759
737          assertEquals(0, q.size());
738      }
739  
740  
741      /**
742 <     *
742 >     * toString contains toStrings of elements
743       */
744      public void testToString() {
745          ArrayBlockingQueue q = populatedQueue(SIZE);
# Line 770 | Line 747 | public class ArrayBlockingQueueTest exte
747          for (int i = 0; i < SIZE; ++i) {
748              assertTrue(s.indexOf(String.valueOf(i)) >= 0);
749          }
750 <    }        
750 >    }
751  
752  
753      /**
754 <     *
754 >     * offer transfers elements across Executor tasks
755       */
756      public void testOfferInExecutor() {
780
757          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
782
758          q.add(one);
759          q.add(two);
785
760          ExecutorService executor = Executors.newFixedThreadPool(2);
761 +        executor.execute(new CheckedRunnable() {
762 +            public void realRun() throws InterruptedException {
763 +                assertFalse(q.offer(three));
764 +                assertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
765 +                assertEquals(0, q.remainingCapacity());
766 +            }});
767 +
768 +        executor.execute(new CheckedRunnable() {
769 +            public void realRun() throws InterruptedException {
770 +                Thread.sleep(SMALL_DELAY_MS);
771 +                assertSame(one, q.take());
772 +            }});
773  
788        executor.execute(new Runnable() {
789            public void run() {
790                threadAssertFalse(q.offer(three));
791                try {
792                    threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
793                    threadAssertEquals(0, q.remainingCapacity());
794                }
795                catch (InterruptedException e) {
796                    threadUnexpectedException();
797                }
798            }
799        });
800
801        executor.execute(new Runnable() {
802            public void run() {
803                try {
804                    Thread.sleep(SMALL_DELAY_MS);
805                    threadAssertEquals(one, q.take());
806                }
807                catch (InterruptedException e) {
808                    threadUnexpectedException();
809                }
810            }
811        });
812        
774          joinPool(executor);
814
775      }
776  
777      /**
778 <     *
778 >     * poll retrieves elements across Executor threads
779       */
780      public void testPollInExecutor() {
821
781          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
823
782          ExecutorService executor = Executors.newFixedThreadPool(2);
783 +        executor.execute(new CheckedRunnable() {
784 +            public void realRun() throws InterruptedException {
785 +                assertNull(q.poll());
786 +                assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
787 +                assertTrue(q.isEmpty());
788 +            }});
789 +
790 +        executor.execute(new CheckedRunnable() {
791 +            public void realRun() throws InterruptedException {
792 +                Thread.sleep(SMALL_DELAY_MS);
793 +                q.put(one);
794 +            }});
795  
826        executor.execute(new Runnable() {
827            public void run() {
828                threadAssertNull(q.poll());
829                try {
830                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
831                    threadAssertTrue(q.isEmpty());
832                }
833                catch (InterruptedException e) {
834                    threadUnexpectedException();
835                }
836            }
837        });
838
839        executor.execute(new Runnable() {
840            public void run() {
841                try {
842                    Thread.sleep(SMALL_DELAY_MS);
843                    q.put(one);
844                }
845                catch (InterruptedException e) {
846                    threadUnexpectedException();
847                }
848            }
849        });
850        
796          joinPool(executor);
797 +    }
798 +
799 +    /**
800 +     * A deserialized serialized queue has same elements in same order
801 +     */
802 +    public void testSerialization() throws Exception {
803 +        ArrayBlockingQueue q = populatedQueue(SIZE);
804  
805 +        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
806 +        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
807 +        out.writeObject(q);
808 +        out.close();
809 +
810 +        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
811 +        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
812 +        ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
813 +        assertEquals(q.size(), r.size());
814 +        while (!q.isEmpty())
815 +            assertEquals(q.remove(), r.remove());
816      }
817  
818      /**
819 <     *
819 >     * drainTo(null) throws NPE
820       */
821 <    public void testSerialization() {
821 >    public void testDrainToNull() {
822          ArrayBlockingQueue q = populatedQueue(SIZE);
823 +        try {
824 +            q.drainTo(null);
825 +            shouldThrow();
826 +        } catch (NullPointerException success) {}
827 +    }
828  
829 +    /**
830 +     * drainTo(this) throws IAE
831 +     */
832 +    public void testDrainToSelf() {
833 +        ArrayBlockingQueue q = populatedQueue(SIZE);
834          try {
835 <            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
836 <            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
837 <            out.writeObject(q);
838 <            out.close();
835 >            q.drainTo(q);
836 >            shouldThrow();
837 >        } catch (IllegalArgumentException success) {}
838 >    }
839  
840 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
841 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
842 <            ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
843 <            assertEquals(q.size(), r.size());
844 <            while (!q.isEmpty())
845 <                assertEquals(q.remove(), r.remove());
846 <        } catch(Exception e){
847 <            unexpectedException();
848 <        }
840 >    /**
841 >     * drainTo(c) empties queue into another collection c
842 >     */
843 >    public void testDrainTo() {
844 >        ArrayBlockingQueue q = populatedQueue(SIZE);
845 >        ArrayList l = new ArrayList();
846 >        q.drainTo(l);
847 >        assertEquals(q.size(), 0);
848 >        assertEquals(l.size(), SIZE);
849 >        for (int i = 0; i < SIZE; ++i)
850 >            assertEquals(l.get(i), new Integer(i));
851 >        q.add(zero);
852 >        q.add(one);
853 >        assertFalse(q.isEmpty());
854 >        assertTrue(q.contains(zero));
855 >        assertTrue(q.contains(one));
856 >        l.clear();
857 >        q.drainTo(l);
858 >        assertEquals(q.size(), 0);
859 >        assertEquals(l.size(), 2);
860 >        for (int i = 0; i < 2; ++i)
861 >            assertEquals(l.get(i), new Integer(i));
862 >    }
863 >
864 >    /**
865 >     * drainTo empties full queue, unblocking a waiting put.
866 >     */
867 >    public void testDrainToWithActivePut() throws InterruptedException {
868 >        final ArrayBlockingQueue q = populatedQueue(SIZE);
869 >        Thread t = new Thread(new CheckedRunnable() {
870 >            public void realRun() throws InterruptedException {
871 >                q.put(new Integer(SIZE+1));
872 >            }});
873 >
874 >        t.start();
875 >        ArrayList l = new ArrayList();
876 >        q.drainTo(l);
877 >        assertTrue(l.size() >= SIZE);
878 >        for (int i = 0; i < SIZE; ++i)
879 >            assertEquals(l.get(i), new Integer(i));
880 >        t.join();
881 >        assertTrue(q.size() + l.size() >= SIZE);
882      }
883  
884 +    /**
885 +     * drainTo(null, n) throws NPE
886 +     */
887 +    public void testDrainToNullN() {
888 +        ArrayBlockingQueue q = populatedQueue(SIZE);
889 +        try {
890 +            q.drainTo(null, 0);
891 +            shouldThrow();
892 +        } catch (NullPointerException success) {}
893 +    }
894 +
895 +    /**
896 +     * drainTo(this, n) throws IAE
897 +     */
898 +    public void testDrainToSelfN() {
899 +        ArrayBlockingQueue q = populatedQueue(SIZE);
900 +        try {
901 +            q.drainTo(q, 0);
902 +            shouldThrow();
903 +        } catch (IllegalArgumentException success) {}
904 +    }
905 +
906 +    /**
907 +     * drainTo(c, n) empties first max {n, size} elements of queue into c
908 +     */
909 +    public void testDrainToN() {
910 +        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE*2);
911 +        for (int i = 0; i < SIZE + 2; ++i) {
912 +            for (int j = 0; j < SIZE; j++)
913 +                assertTrue(q.offer(new Integer(j)));
914 +            ArrayList l = new ArrayList();
915 +            q.drainTo(l, i);
916 +            int k = (i < SIZE)? i : SIZE;
917 +            assertEquals(l.size(), k);
918 +            assertEquals(q.size(), SIZE-k);
919 +            for (int j = 0; j < k; ++j)
920 +                assertEquals(l.get(j), new Integer(j));
921 +            while (q.poll() != null) ;
922 +        }
923 +    }
924  
925   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines