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.3 by dl, Sun Sep 14 20:42:40 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 {
14
17      public static void main(String[] args) {
18 <        junit.textui.TestRunner.run (suite());  
18 >        junit.textui.TestRunner.run(suite());
19      }
18
20      public static Test suite() {
21 <        return new TestSuite(ArrayBlockingQueueTest.class);
21 >        return new TestSuite(ArrayBlockingQueueTest.class);
22      }
23  
24      /**
# Line 27 | 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 <
39 <    public void testConstructor1(){
38 >
39 >    /**
40 >     * A new queue has the indicated capacity
41 >     */
42 >    public void testConstructor1() {
43          assertEquals(SIZE, new ArrayBlockingQueue(SIZE).remainingCapacity());
44      }
45  
46 <    public void testConstructor2(){
46 >    /**
47 >     * Constructor throws IAE if capacity argument nonpositive
48 >     */
49 >    public void testConstructor2() {
50          try {
51              ArrayBlockingQueue q = new ArrayBlockingQueue(0);
52 <            fail("Cannot make zero-sized");
53 <        }
47 <        catch (IllegalArgumentException success) {}
52 >            shouldThrow();
53 >        } catch (IllegalArgumentException success) {}
54      }
55  
56 <    public void testConstructor3(){
57 <
56 >    /**
57 >     * Initializing from null Collection throws NPE
58 >     */
59 >    public void testConstructor3() {
60          try {
61              ArrayBlockingQueue q = new ArrayBlockingQueue(1, true, null);
62 <            fail("Cannot make from null collection");
63 <        }
56 <        catch (NullPointerException success) {}
62 >            shouldThrow();
63 >        } catch (NullPointerException success) {}
64      }
65  
66 <    public void testConstructor4(){
66 >    /**
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 <            fail("Cannot make with null elements");
74 <        }
65 <        catch (NullPointerException success) {}
73 >            shouldThrow();
74 >        } catch (NullPointerException success) {}
75      }
76  
77 <    public void testConstructor5(){
77 >    /**
78 >     * Initializing from Collection with some null elements throws NPE
79 >     */
80 >    public void testConstructor5() {
81          try {
82              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));
86 <            fail("Cannot make with null elements");
87 <        }
76 <        catch (NullPointerException success) {}
86 >            shouldThrow();
87 >        } catch (NullPointerException success) {}
88      }
89  
90 <    public void testConstructor6(){
90 >    /**
91 >     * Initializing from too large collection throws IAE
92 >     */
93 >    public void testConstructor6() {
94          try {
95              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));
99 <            fail("Cannot make with insufficient capacity");
100 <        }
87 <        catch (IllegalArgumentException success) {}
99 >            shouldThrow();
100 >        } catch (IllegalArgumentException success) {}
101      }
102  
103 <    public void testConstructor7(){
104 <        try {
105 <            Integer[] ints = new Integer[SIZE];
106 <            for (int i = 0; i < SIZE; ++i)
107 <                ints[i] = new Integer(i);
108 <            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, Arrays.asList(ints));
109 <            for (int i = 0; i < SIZE; ++i)
110 <                assertEquals(ints[i], q.poll());
111 <        }
112 <        finally {}
103 >    /**
104 >     * Queue contains all elements of collection used to initialize
105 >     */
106 >    public void testConstructor7() {
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 +     * Queue transitions from empty to full when elements added
117 +     */
118      public void testEmptyFull() {
119          ArrayBlockingQueue q = new ArrayBlockingQueue(2);
120          assertTrue(q.isEmpty());
121 <        assertEquals("should have room for 2", 2, q.remainingCapacity());
121 >        assertEquals(2, q.remainingCapacity());
122          q.add(one);
123          assertFalse(q.isEmpty());
124          q.add(two);
125          assertFalse(q.isEmpty());
126 <        assertEquals("queue should be full", 0, q.remainingCapacity());
127 <        assertFalse("offer should be rejected", q.offer(three));
126 >        assertEquals(0, q.remainingCapacity());
127 >        assertFalse(q.offer(three));
128      }
129  
130 <    public void testRemainingCapacity(){
130 >    /**
131 >     * remainingCapacity decreases on add, increases on remove
132 >     */
133 >    public void testRemainingCapacity() {
134          ArrayBlockingQueue q = populatedQueue(SIZE);
135          for (int i = 0; i < SIZE; ++i) {
136              assertEquals(i, q.remainingCapacity());
# Line 125 | Line 144 | public class ArrayBlockingQueueTest exte
144          }
145      }
146  
147 <    public void testOfferNull(){
148 <        try {
147 >    /**
148 >     *  offer(null) throws NPE
149 >     */
150 >    public void testOfferNull() {
151 >        try {
152              ArrayBlockingQueue q = new ArrayBlockingQueue(1);
153              q.offer(null);
154 <            fail("should throw NPE");
155 <        } catch (NullPointerException success) { }  
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 <    public void testOffer(){
169 >    /**
170 >     * Offer succeeds if not full; fails if full
171 >     */
172 >    public void testOffer() {
173          ArrayBlockingQueue q = new ArrayBlockingQueue(1);
174          assertTrue(q.offer(zero));
175          assertFalse(q.offer(one));
176      }
177  
178 <    public void testAdd(){
179 <        try {
178 >    /**
179 >     * add succeeds if not full; throws ISE if full
180 >     */
181 >    public void testAdd() {
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 <    public void testAddAll1(){
193 >    /**
194 >     *  addAll(null) throws NPE
195 >     */
196 >    public void testAddAll1() {
197          try {
198              ArrayBlockingQueue q = new ArrayBlockingQueue(1);
199              q.addAll(null);
200 <            fail("Cannot add null collection");
201 <        }
202 <        catch (NullPointerException success) {}
200 >            shouldThrow();
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 <    public void testAddAll2(){
214 >
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 <            fail("Cannot add null elements");
225 <        }
169 <        catch (NullPointerException success) {}
224 >            shouldThrow();
225 >        } catch (NullPointerException success) {}
226      }
227 <    public void testAddAll3(){
227 >
228 >    /**
229 >     * addAll of a collection with any null elements throws NPE after
230 >     * possibly adding some elements
231 >     */
232 >    public void testAddAll3() {
233          try {
234              ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
235              Integer[] ints = new Integer[SIZE];
236              for (int i = 0; i < SIZE-1; ++i)
237                  ints[i] = new Integer(i);
238              q.addAll(Arrays.asList(ints));
239 <            fail("Cannot add null elements");
240 <        }
180 <        catch (NullPointerException success) {}
239 >            shouldThrow();
240 >        } catch (NullPointerException success) {}
241      }
242 <    public void testAddAll4(){
242 >
243 >    /**
244 >     * addAll throws ISE if not enough room
245 >     */
246 >    public void testAddAll4() {
247          try {
248              ArrayBlockingQueue q = new ArrayBlockingQueue(1);
249              Integer[] ints = new Integer[SIZE];
250              for (int i = 0; i < SIZE; ++i)
251                  ints[i] = new Integer(i);
252              q.addAll(Arrays.asList(ints));
253 <            fail("Cannot add with insufficient capacity");
254 <        }
191 <        catch (IllegalStateException success) {}
253 >            shouldThrow();
254 >        } catch (IllegalStateException success) {}
255      }
256 <    public void testAddAll5(){
257 <        try {
258 <            Integer[] empty = new Integer[0];
259 <            Integer[] ints = new Integer[SIZE];
260 <            for (int i = 0; i < SIZE; ++i)
261 <                ints[i] = new Integer(i);
262 <            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
263 <            assertFalse(q.addAll(Arrays.asList(empty)));
264 <            assertTrue(q.addAll(Arrays.asList(ints)));
265 <            for (int i = 0; i < SIZE; ++i)
266 <                assertEquals(ints[i], q.poll());
267 <        }
268 <        finally {}
256 >
257 >    /**
258 >     * Queue contains all elements, in traversal order, of successful addAll
259 >     */
260 >    public void testAddAll5() {
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 <     public void testPutNull() {
273 <        try {
272 >    /**
273 >     *  put(null) throws NPE
274 >     */
275 >    public void testPutNull() throws InterruptedException {
276 >        try {
277              ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
278              q.put(null);
279 <            fail("put should throw NPE");
280 <        }
214 <        catch (NullPointerException success){
215 <        }  
216 <        catch (InterruptedException ie) {
217 <            fail("Unexpected exception");
218 <        }
279 >            shouldThrow();
280 >        } catch (NullPointerException success) {}
281       }
282  
283 <     public void testPut() {
284 <         try {
285 <             ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
286 <             for (int i = 0; i < SIZE; ++i) {
287 <                 Integer I = new Integer(i);
288 <                 q.put(I);
289 <                 assertTrue(q.contains(I));
290 <             }
291 <             assertEquals(0, q.remainingCapacity());
230 <         }
231 <        catch (InterruptedException ie) {
232 <            fail("Unexpected exception");
283 >    /**
284 >     * all elements successfully put are contained
285 >     */
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 <    public void testBlockingPut(){
297 <        Thread t = new Thread(new Runnable() {
298 <                public void run() {
299 <                    int added = 0;
300 <                    try {
301 <                        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
302 <                        for (int i = 0; i < SIZE; ++i) {
303 <                            q.put(new Integer(i));
304 <                            ++added;
305 <                        }
306 <                        q.put(new Integer(SIZE));
307 <                        threadFail("put should block");
308 <                    } catch (InterruptedException ie){
309 <                        threadAssertEquals(added, SIZE);
310 <                    }  
311 <                }});
312 <        try {
313 <            t.start();
314 <           Thread.sleep(SHORT_DELAY_MS);
315 <           t.interrupt();
316 <           t.join();
317 <        }
318 <        catch (InterruptedException ie) {
259 <            fail("Unexpected exception");
260 <        }
296 >    /**
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 <    public void testPutWithTake() {
322 <        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
323 <        Thread t = new Thread(new Runnable() {
324 <                public void run(){
325 <                    int added = 0;
326 <                    try {
327 <                        q.put(new Object());
328 <                        ++added;
329 <                        q.put(new Object());
330 <                        ++added;
331 <                        q.put(new Object());
332 <                        ++added;
333 <                        q.put(new Object());
334 <                        ++added;
335 <                        threadFail("Should block");
336 <                    } catch (InterruptedException e){
337 <                        threadAssertTrue(added >= 2);
338 <                    }
339 <                }
340 <            });
341 <        try {
342 <            t.start();
343 <            Thread.sleep(SHORT_DELAY_MS);
344 <            q.take();
287 <            t.interrupt();
288 <            t.join();
289 <        } catch (Exception e){
290 <            fail("Unexpected exception");
291 <        }
321 >    /**
322 >     * put blocks waiting for take when full
323 >     */
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 <    public void testTimedOffer() {
347 >    /**
348 >     * timed offer times out if full and elements not taken
349 >     */
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 <                        threadFail("Should block");
360 <                    } catch (InterruptedException success){}
361 <                }
362 <            });
363 <        
364 <        try {
365 <            t.start();
366 <            Thread.sleep(SHORT_DELAY_MS);
311 <            t.interrupt();
312 <            t.join();
313 <        } catch (Exception e){
314 <            fail("Unexpected exception");
315 <        }
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 <    public void testTake(){
370 <        try {
371 <            ArrayBlockingQueue q = populatedQueue(SIZE);
372 <            for (int i = 0; i < SIZE; ++i) {
373 <                assertEquals(i, ((Integer)q.take()).intValue());
374 <            }
375 <        } catch (InterruptedException e){
376 <            fail("Unexpected exception");
326 <        }  
369 >    /**
370 >     * take retrieves elements in FIFO order
371 >     */
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 <    public void testTakeFromEmpty() {
379 >    /**
380 >     * take blocks interruptibly when empty
381 >     */
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 <                        threadFail("Should block");
389 <                    } catch (InterruptedException success){ }                
390 <                }
391 <            });
392 <        try {
340 <            t.start();
341 <            Thread.sleep(SHORT_DELAY_MS);
342 <            t.interrupt();
343 <            t.join();
344 <        } catch (Exception e){
345 <            fail("Unexpected exception");
346 <        }
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 <    public void testBlockingTake(){
396 <        Thread t = new Thread(new Runnable() {
397 <                public void run() {
398 <                    try {
399 <                        ArrayBlockingQueue q = populatedQueue(SIZE);
400 <                        for (int i = 0; i < SIZE; ++i) {
401 <                            threadAssertEquals(i, ((Integer)q.take()).intValue());
402 <                        }
403 <                        q.take();
404 <                        threadFail("take should block");
405 <                    } catch (InterruptedException success){
406 <                    }  
407 <                }});
408 <        try {
409 <            t.start();
410 <            Thread.sleep(SHORT_DELAY_MS);
411 <            t.interrupt();
412 <            t.join();
413 <        }
414 <        catch (InterruptedException ie) {
369 <            fail("Unexpected exception");
370 <        }
395 >    /**
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 <    public void testPoll(){
418 >    /**
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 <    public void testTimedPoll0() {
430 <        try {
431 <            ArrayBlockingQueue q = populatedQueue(SIZE);
432 <            for (int i = 0; i < SIZE; ++i) {
433 <                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
434 <            }
435 <            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
436 <        } catch (InterruptedException e){
437 <            fail("Unexpected exception");
391 <        }  
429 >    /**
430 >     * timed pool with zero timeout succeeds when non-empty, else times out
431 >     */
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 <    public void testTimedPoll() {
441 <        try {
442 <            ArrayBlockingQueue q = populatedQueue(SIZE);
443 <            for (int i = 0; i < SIZE; ++i) {
444 <                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
445 <            }
446 <            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
401 <        } catch (InterruptedException e){
402 <            fail("Unexpected exception");
403 <        }  
404 <    }
405 <
406 <    public void testInterruptedTimedPoll(){
407 <        Thread t = new Thread(new Runnable() {
408 <                public void run() {
409 <                    try {
410 <                        ArrayBlockingQueue q = populatedQueue(SIZE);
411 <                        for (int i = 0; i < SIZE; ++i) {
412 <                            threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
413 <                        }
414 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
415 <                    } catch (InterruptedException success){
416 <                    }  
417 <                }});
418 <        try {
419 <            t.start();
420 <            Thread.sleep(SHORT_DELAY_MS);
421 <            t.interrupt();
422 <            t.join();
423 <        }
424 <        catch (InterruptedException ie) {
425 <            fail("Unexpected exception");
440 >    /**
441 >     * timed pool with nonzero timeout succeeds when non-empty, else times out
442 >     */
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 <    public void testTimedPollWithOffer(){
452 <        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
453 <        Thread t = new Thread(new Runnable() {
454 <                public void run(){
455 <                    try {
456 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
457 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
458 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
459 <                        threadFail("Should block");
460 <                    } catch (InterruptedException success) { }                
451 >    /**
452 >     * Interrupted timed poll throws InterruptedException instead of
453 >     * returning timeout status
454 >     */
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 <            });
463 <        try {
464 <            t.start();
465 <            Thread.sleep(SMALL_DELAY_MS);
466 <            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
467 <            t.interrupt();
468 <            t.join();
469 <        } catch (Exception e){
470 <            fail("Unexpected exception");
471 <        }
472 <    }  
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 >     *  timed poll before a delayed offer fails; after offer succeeds;
476 >     *  on interruption throws
477 >     */
478 >    public void testTimedPollWithOffer() throws InterruptedException {
479 >        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
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 <    public void testPeek(){
498 >    /**
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 <    public void testElement(){
512 >    /**
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 <            fail("no such element");
524 <        }
474 <        catch (NoSuchElementException success) {}
523 >            shouldThrow();
524 >        } catch (NoSuchElementException success) {}
525      }
526  
527 <    public void testRemove(){
527 >    /**
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 <            fail("remove should throw");
538 <        } catch (NoSuchElementException success){
486 <        }  
537 >            shouldThrow();
538 >        } catch (NoSuchElementException success) {}
539      }
540  
541 <    public void testRemoveElement(){
541 >    /**
542 >     * remove(x) removes x and returns true if present
543 >     */
544 >    public void testRemoveElement() {
545          ArrayBlockingQueue q = populatedQueue(SIZE);
546          for (int i = 1; i < SIZE; i+=2) {
547              assertTrue(q.remove(new Integer(i)));
# Line 497 | Line 552 | public class ArrayBlockingQueueTest exte
552          }
553          assertTrue(q.isEmpty());
554      }
555 <        
556 <    public void testContains(){
555 >
556 >    /**
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 <    public void testClear(){
568 >    /**
569 >     * clear removes all elements
570 >     */
571 >    public void testClear() {
572          ArrayBlockingQueue q = populatedQueue(SIZE);
573          q.clear();
574          assertTrue(q.isEmpty());
# Line 515 | 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 <    public void testContainsAll(){
584 >    /**
585 >     * containsAll(c) is true when c contains a subset of elements
586 >     */
587 >    public void testContainsAll() {
588          ArrayBlockingQueue q = populatedQueue(SIZE);
589          ArrayBlockingQueue p = new ArrayBlockingQueue(SIZE);
590          for (int i = 0; i < SIZE; ++i) {
# Line 530 | Line 595 | public class ArrayBlockingQueueTest exte
595          assertTrue(p.containsAll(q));
596      }
597  
598 <    public void testRetainAll(){
598 >    /**
599 >     * retainAll(c) retains only those elements of c and reports true if changed
600 >     */
601 >    public void testRetainAll() {
602          ArrayBlockingQueue q = populatedQueue(SIZE);
603          ArrayBlockingQueue p = populatedQueue(SIZE);
604          for (int i = 0; i < SIZE; ++i) {
# Line 546 | Line 614 | public class ArrayBlockingQueueTest exte
614          }
615      }
616  
617 <    public void testRemoveAll(){
617 >    /**
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) {
622              ArrayBlockingQueue q = populatedQueue(SIZE);
623              ArrayBlockingQueue p = populatedQueue(i);
# Line 559 | 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 <    public void testToArray(){
643 >    /**
644 >     * toArray(a) contains all elements
645 >     */
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());
569 <        } catch (InterruptedException e){
570 <            fail("Unexpected exception");
571 <        }    
572 <    }
573 <
574 <    public void testToArray2(){
575 <        ArrayBlockingQueue q = populatedQueue(SIZE);
576 <        Integer[] ints = new Integer[SIZE];
577 <        ints = (Integer[])q.toArray(ints);
578 <        try {
579 <            for(int i = 0; i < ints.length; i++)
580 <                assertEquals(ints[i], q.take());
581 <        } catch (InterruptedException e){
582 <            fail("Unexpected exception");
583 <        }    
584 <    }
585 <    
586 <    public void testIterator(){
587 <        ArrayBlockingQueue q = populatedQueue(SIZE);
588 <        Iterator it = q.iterator();
589 <        try {
590 <            while(it.hasNext()){
591 <                assertEquals(it.next(), q.take());
592 <            }
593 <        } catch (InterruptedException e){
594 <            fail("Unexpected exception");
595 <        }    
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 <    public void testIteratorOrdering() {
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 >     * toArray with incompatible array type throws CCE
667 >     */
668 >    public void testToArray1_BadArg() {
669 >        ArrayBlockingQueue q = populatedQueue(SIZE);
670 >        try {
671 >            Object o[] = q.toArray(new String[10]);
672 >            shouldThrow();
673 >        } catch (ArrayStoreException success) {}
674 >    }
675  
676 +
677 +    /**
678 +     * iterator iterates through all elements
679 +     */
680 +    public void testIterator() throws InterruptedException {
681 +        ArrayBlockingQueue q = populatedQueue(SIZE);
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 +     * iterator ordering is FIFO
709 +     */
710 +    public void testIteratorOrdering() {
711 +        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
712          q.add(one);
713          q.add(two);
714          q.add(three);
# Line 607 | 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();
611 <            assertEquals("items should come out in order", ++k, i);
720 >            assertEquals(++k, it.next());
721          }
722 <
614 <        assertEquals("should go through 3 elements", 3, k);
722 >        assertEquals(3, k);
723      }
724  
725 <    public void testWeaklyConsistentIteration () {
726 <
725 >    /**
726 >     * Modifications do not cause iterators to fail
727 >     */
728 >    public void testWeaklyConsistentIteration() {
729          final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
620
730          q.add(one);
731          q.add(two);
732          q.add(three);
733 <
734 <        try {
735 <            for (Iterator it = q.iterator(); it.hasNext();) {
627 <                q.remove();
628 <                it.next();
629 <            }
630 <        }
631 <        catch (ConcurrentModificationException e) {
632 <            fail("weakly consistent iterator; should not get CME");
733 >        for (Iterator it = q.iterator(); it.hasNext();) {
734 >            q.remove();
735 >            it.next();
736          }
737 <
635 <        assertEquals("queue should be empty again", 0, q.size());
737 >        assertEquals(0, q.size());
738      }
739  
740  
741 <    public void testToString(){
741 >    /**
742 >     * toString contains toStrings of elements
743 >     */
744 >    public void testToString() {
745          ArrayBlockingQueue q = populatedQueue(SIZE);
746          String s = q.toString();
747          for (int i = 0; i < SIZE; ++i) {
748              assertTrue(s.indexOf(String.valueOf(i)) >= 0);
749          }
750 <    }        
750 >    }
751  
752  
753 +    /**
754 +     * offer transfers elements across Executor tasks
755 +     */
756      public void testOfferInExecutor() {
649
757          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
651
758          q.add(one);
759          q.add(two);
654
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  
657        executor.execute(new Runnable() {
658            public void run() {
659                threadAssertFalse(q.offer(three));
660                try {
661                    threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
662                    threadAssertEquals(0, q.remainingCapacity());
663                }
664                catch (InterruptedException e) {
665                    threadFail("should not be interrupted");
666                }
667            }
668        });
669
670        executor.execute(new Runnable() {
671            public void run() {
672                try {
673                    Thread.sleep(SMALL_DELAY_MS);
674                    threadAssertEquals(one, q.take());
675                }
676                catch (InterruptedException e) {
677                    threadFail("should not be interrupted");
678                }
679            }
680        });
681        
774          joinPool(executor);
683
775      }
776  
777 +    /**
778 +     * poll retrieves elements across Executor threads
779 +     */
780      public void testPollInExecutor() {
687
781          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
689
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  
692        executor.execute(new Runnable() {
693            public void run() {
694                threadAssertNull(q.poll());
695                try {
696                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
697                    threadAssertTrue(q.isEmpty());
698                }
699                catch (InterruptedException e) {
700                    threadFail("should not be interrupted");
701                }
702            }
703        });
704
705        executor.execute(new Runnable() {
706            public void run() {
707                try {
708                    Thread.sleep(SMALL_DELAY_MS);
709                    q.put(one);
710                }
711                catch (InterruptedException e) {
712                    threadFail("should not be interrupted");
713                }
714            }
715        });
716        
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 <    public void testSerialization() {
818 >    /**
819 >     * drainTo(null) throws NPE
820 >     */
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);
728 <            out.close();
729 <
730 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
731 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
732 <            ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
733 <            assertEquals(q.size(), r.size());
734 <            while (!q.isEmpty())
735 <                assertEquals(q.remove(), r.remove());
736 <        } catch(Exception e){
737 <            fail("unexpected exception");
738 <        }
835 >            q.drainTo(q);
836 >            shouldThrow();
837 >        } catch (IllegalArgumentException success) {}
838      }
839  
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