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.2 by dl, Sun Sep 7 20:39:11 2003 UTC vs.
Revision 1.31 by dl, Wed Sep 29 12:33: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 TestCase {
14 <
15 <    private static int N = 10;
16 <    private static long SHORT_DELAY_MS = 100;
17 <    private static long MEDIUM_DELAY_MS = 1000;
18 <    private static long LONG_DELAY_MS = 10000;
19 <
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      }
23
20      public static Test suite() {
21 <        return new TestSuite(ArrayBlockingQueueTest.class);
21 >        return new TestSuite(ArrayBlockingQueueTest.class);
22      }
23  
24      /**
25       * Create a queue of given size containing consecutive
26       * Integers 0 ... n.
27       */
28 <    private ArrayBlockingQueue fullQueue(int n) {
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(){
40 <        assertEquals(N, new ArrayBlockingQueue(N).remainingCapacity());
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 <        }
52 <        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 <        }
61 <        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[N];
72 <            ArrayBlockingQueue q = new ArrayBlockingQueue(N, false, Arrays.asList(ints));
73 <            fail("Cannot make with null elements");
74 <        }
70 <        catch (NullPointerException success) {}
71 >            Integer[] ints = new Integer[SIZE];
72 >            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
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[N];
83 <            for (int i = 0; i < N-1; ++i)
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(N, false, Arrays.asList(ints));
86 <            fail("Cannot make with null elements");
87 <        }
81 <        catch (NullPointerException success) {}
85 >            ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, false, Arrays.asList(ints));
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[N];
96 <            for (int i = 0; i < N; ++i)
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 <        }
92 <        catch (IllegalArgumentException success) {}
99 >            shouldThrow();
100 >        } catch (IllegalArgumentException success) {}
101      }
102  
103 <    public void testConstructor7(){
104 <        try {
105 <            Integer[] ints = new Integer[N];
106 <            for (int i = 0; i < N; ++i)
107 <                ints[i] = new Integer(i);
108 <            ArrayBlockingQueue q = new ArrayBlockingQueue(N, true, Arrays.asList(ints));
109 <            for (int i = 0; i < N; ++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());
122 <        q.add(new Integer(1));
121 >        assertEquals(2, q.remainingCapacity());
122 >        q.add(one);
123          assertFalse(q.isEmpty());
124 <        q.add(new Integer(2));
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(new Integer(3)));
126 >        assertEquals(0, q.remainingCapacity());
127 >        assertFalse(q.offer(three));
128      }
129  
130 <    public void testRemainingCapacity(){
131 <        ArrayBlockingQueue q = fullQueue(N);
132 <        for (int i = 0; i < N; ++i) {
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());
137 <            assertEquals(N-i, q.size());
137 >            assertEquals(SIZE-i, q.size());
138              q.remove();
139          }
140 <        for (int i = 0; i < N; ++i) {
141 <            assertEquals(N-i, q.remainingCapacity());
140 >        for (int i = 0; i < SIZE; ++i) {
141 >            assertEquals(SIZE-i, q.remainingCapacity());
142              assertEquals(i, q.size());
143              q.add(new Integer(i));
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 <    public void testOffer(){
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 >    /**
170 >     * Offer succeeds if not full; fails if full
171 >     */
172 >    public void testOffer() {
173          ArrayBlockingQueue q = new ArrayBlockingQueue(1);
174 <        assertTrue(q.offer(new Integer(0)));
175 <        assertFalse(q.offer(new Integer(1)));
174 >        assertTrue(q.offer(zero));
175 >        assertFalse(q.offer(one));
176      }
177  
178 <    public void testAdd(){
179 <        try {
180 <            ArrayBlockingQueue q = new ArrayBlockingQueue(N);
181 <            for (int i = 0; i < N; ++i) {
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(N));
189 <        } catch (IllegalStateException success){
190 <        }  
188 >            q.add(new Integer(SIZE));
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(N);
222 <            Integer[] ints = new Integer[N];
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 <        }
174 <        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(N);
235 <            Integer[] ints = new Integer[N];
236 <            for (int i = 0; i < N-1; ++i)
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 <        }
185 <        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[N];
250 <            for (int i = 0; i < N; ++i)
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 <        }
196 <        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[N];
260 <            for (int i = 0; i < N; ++i)
261 <                ints[i] = new Integer(i);
262 <            ArrayBlockingQueue q = new ArrayBlockingQueue(N);
263 <            assertFalse(q.addAll(Arrays.asList(empty)));
264 <            assertTrue(q.addAll(Arrays.asList(ints)));
265 <            for (int i = 0; i < N; ++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 {
274 <            ArrayBlockingQueue q = new ArrayBlockingQueue(N);
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 <        }
219 <        catch (NullPointerException success){
220 <        }  
221 <        catch (InterruptedException ie) {
222 <            fail("Unexpected exception");
223 <        }
279 >            shouldThrow();
280 >        } catch (NullPointerException success) {}
281       }
282  
283 <     public void testPut() {
284 <         try {
285 <             ArrayBlockingQueue q = new ArrayBlockingQueue(N);
286 <             for (int i = 0; i < N; ++i) {
287 <                 Integer I = new Integer(i);
288 <                 q.put(I);
289 <                 assertTrue(q.contains(I));
290 <             }
291 <             assertEquals(0, q.remainingCapacity());
235 <         }
236 <        catch (InterruptedException ie) {
237 <            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(N);
302 <                        for (int i = 0; i < N; ++i) {
303 <                            q.put(new Integer(i));
304 <                            ++added;
305 <                        }
306 <                        q.put(new Integer(N));
307 <                        fail("put should block");
308 <                    } catch (InterruptedException ie){
309 <                        assertEquals(added, N);
310 <                    }  
311 <                }});
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 <        try {
315 <           Thread.sleep(SHORT_DELAY_MS);
316 <           t.interrupt();
317 <           t.join();
318 <        }
263 <        catch (InterruptedException ie) {
264 <            fail("Unexpected exception");
265 <        }
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 <                        fail("Should block");
336 <                    } catch (InterruptedException e){
337 <                        assertTrue(added >= 2);
338 <                    }
339 <                }
340 <            });
341 <        try {
342 <            t.start();
343 <            Thread.sleep(SHORT_DELAY_MS);
344 <            q.take();
292 <            t.interrupt();
293 <            t.join();
294 <        } catch (Exception e){
295 <            fail("Unexpected exception");
296 <        }
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 <                        assertFalse(q.offer(new Object(), SHORT_DELAY_MS/2, TimeUnit.MILLISECONDS));
358 <                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
359 <                        fail("Should block");
360 <                    } catch (InterruptedException success){}
361 <                }
362 <            });
363 <        
364 <        try {
365 <            t.start();
366 <            Thread.sleep(SHORT_DELAY_MS);
316 <            t.interrupt();
317 <            t.join();
318 <        } catch (Exception e){
319 <            fail("Unexpected exception");
320 <        }
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 = fullQueue(N);
372 <            for (int i = 0; i < N; ++i) {
373 <                assertEquals(i, ((Integer)q.take()).intValue());
374 <            }
375 <        } catch (InterruptedException e){
376 <            fail("Unexpected exception");
331 <        }  
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 <                        fail("Should block");
389 <                    } catch (InterruptedException success){ }                
390 <                }
391 <            });
392 <        try {
345 <            t.start();
346 <            Thread.sleep(SHORT_DELAY_MS);
347 <            t.interrupt();
348 <            t.join();
349 <        } catch (Exception e){
350 <            fail("Unexpected exception");
351 <        }
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 = fullQueue(N);
400 <                        for (int i = 0; i < N; ++i) {
401 <                            assertEquals(i, ((Integer)q.take()).intValue());
402 <                        }
403 <                        q.take();
404 <                        fail("take should block");
405 <                    } catch (InterruptedException success){
406 <                    }  
407 <                }});
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 <        try {
413 <           Thread.sleep(SHORT_DELAY_MS);
414 <           t.interrupt();
371 <           t.join();
372 <        }
373 <        catch (InterruptedException ie) {
374 <            fail("Unexpected exception");
375 <        }
412 >        Thread.sleep(SHORT_DELAY_MS);
413 >        t.interrupt();
414 >        t.join();
415      }
416  
417  
418 <    public void testPoll(){
419 <        ArrayBlockingQueue q = fullQueue(N);
420 <        for (int i = 0; i < N; ++i) {
421 <            assertEquals(i, ((Integer)q.poll()).intValue());
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, q.poll());
425          }
426 <        assertNull(q.poll());
426 >        assertNull(q.poll());
427      }
428  
429 <    public void testTimedPoll0() {
430 <        try {
431 <            ArrayBlockingQueue q = fullQueue(N);
432 <            for (int i = 0; i < N; ++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");
396 <        }  
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 = fullQueue(N);
443 <            for (int i = 0; i < N; ++i) {
444 <                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
445 <            }
446 <            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
406 <        } catch (InterruptedException e){
407 <            fail("Unexpected exception");
408 <        }  
409 <    }
410 <
411 <    public void testInterruptedTimedPoll(){
412 <        Thread t = new Thread(new Runnable() {
413 <                public void run() {
414 <                    try {
415 <                        ArrayBlockingQueue q = fullQueue(N);
416 <                        for (int i = 0; i < N; ++i) {
417 <                            assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
418 <                        }
419 <                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
420 <                    } catch (InterruptedException success){
421 <                    }  
422 <                }});
423 <        t.start();
424 <        try {
425 <           Thread.sleep(SHORT_DELAY_MS);
426 <           t.interrupt();
427 <           t.join();
428 <        }
429 <        catch (InterruptedException ie) {
430 <            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 <                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
457 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
458 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
459 <                        fail("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(SHORT_DELAY_MS * 2);
466 <            assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
467 <            t.interrupt();
468 <            t.join();
469 <        } catch (Exception e){
470 <            fail("Unexpected exception");
471 <        }
472 <    }  
473 <
474 <
475 <    public void testPeek(){
476 <        ArrayBlockingQueue q = fullQueue(N);
477 <        for (int i = 0; i < N; ++i) {
478 <            assertEquals(i, ((Integer)q.peek()).intValue());
479 <            q.poll();
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 >                try {
483 >                    assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
484 >                    assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
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 >     * 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, 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(){
513 <        ArrayBlockingQueue q = fullQueue(N);
514 <        for (int i = 0; i < N; ++i) {
515 <            assertEquals(i, ((Integer)q.element()).intValue());
516 <            q.poll();
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, q.element());
519 >            assertEquals(i, q.poll());
520          }
521          try {
522              q.element();
523 <            fail("no such element");
524 <        }
479 <        catch (NoSuchElementException success) {}
523 >            shouldThrow();
524 >        } catch (NoSuchElementException success) {}
525      }
526  
527 <    public void testRemove(){
528 <        ArrayBlockingQueue q = fullQueue(N);
529 <        for (int i = 0; i < N; ++i) {
530 <            assertEquals(i, ((Integer)q.remove()).intValue());
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, q.remove());
534          }
535          try {
536              q.remove();
537 <            fail("remove should throw");
538 <        } catch (NoSuchElementException success){
491 <        }  
537 >            shouldThrow();
538 >        } catch (NoSuchElementException success) {}
539      }
540  
541 <    public void testRemoveElement(){
542 <        ArrayBlockingQueue q = fullQueue(N);
543 <        for (int i = 1; i < N; i+=2) {
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)));
548          }
549 <        for (int i = 0; i < N; i+=2) {
549 >        for (int i = 0; i < SIZE; i+=2) {
550              assertTrue(q.remove(new Integer(i)));
551              assertFalse(q.remove(new Integer(i+1)));
552          }
553          assertTrue(q.isEmpty());
554      }
555 <        
556 <    public void testContains(){
557 <        ArrayBlockingQueue q = fullQueue(N);
558 <        for (int i = 0; i < N; ++i) {
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(){
569 <        ArrayBlockingQueue q = fullQueue(N);
568 >    /**
569 >     * clear removes all elements
570 >     */
571 >    public void testClear() {
572 >        ArrayBlockingQueue q = populatedQueue(SIZE);
573          q.clear();
574          assertTrue(q.isEmpty());
575          assertEquals(0, q.size());
576 <        assertEquals(N, q.remainingCapacity());
577 <        q.add(new Integer(1));
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(){
585 <        ArrayBlockingQueue q = fullQueue(N);
586 <        ArrayBlockingQueue p = new ArrayBlockingQueue(N);
587 <        for (int i = 0; i < N; ++i) {
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) {
591              assertTrue(q.containsAll(p));
592              assertFalse(p.containsAll(q));
593              p.add(new Integer(i));
# Line 535 | Line 595 | public class ArrayBlockingQueueTest exte
595          assertTrue(p.containsAll(q));
596      }
597  
598 <    public void testRetainAll(){
599 <        ArrayBlockingQueue q = fullQueue(N);
600 <        ArrayBlockingQueue p = fullQueue(N);
601 <        for (int i = 0; i < N; ++i) {
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) {
605              boolean changed = q.retainAll(p);
606              if (i == 0)
607                  assertFalse(changed);
# Line 546 | Line 609 | public class ArrayBlockingQueueTest exte
609                  assertTrue(changed);
610  
611              assertTrue(q.containsAll(p));
612 <            assertEquals(N-i, q.size());
612 >            assertEquals(SIZE-i, q.size());
613              p.remove();
614          }
615      }
616  
617 <    public void testRemoveAll(){
618 <        for (int i = 1; i < N; ++i) {
619 <            ArrayBlockingQueue q = fullQueue(N);
620 <            ArrayBlockingQueue p = fullQueue(i);
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);
624              assertTrue(q.removeAll(p));
625 <            assertEquals(N-i, q.size());
625 >            assertEquals(SIZE-i, q.size());
626              for (int j = 0; j < i; ++j) {
627                  Integer I = (Integer)(p.remove());
628                  assertFalse(q.contains(I));
# Line 564 | 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(){
644 <        ArrayBlockingQueue q = fullQueue(N);
645 <        Object[] o = q.toArray();
646 <        try {
647 <        for(int i = 0; i < o.length; i++)
648 <            assertEquals(o[i], q.take());
649 <        } catch (InterruptedException e){
650 <            fail("Unexpected exception");
651 <        }    
652 <    }
653 <
654 <    public void testToArray2(){
655 <        ArrayBlockingQueue q = fullQueue(N);
656 <        Integer[] ints = new Integer[N];
657 <        ints = (Integer[])q.toArray(ints);
658 <        try {
659 <            for(int i = 0; i < ints.length; i++)
660 <                assertEquals(ints[i], q.take());
661 <        } catch (InterruptedException e){
662 <            fail("Unexpected exception");
663 <        }    
664 <    }
665 <    
666 <    public void testIterator(){
667 <        ArrayBlockingQueue q = fullQueue(N);
668 <        Iterator it = q.iterator();
669 <        try {
670 <            while(it.hasNext()){
671 <                assertEquals(it.next(), q.take());
672 <            }
673 <        } catch (InterruptedException e){
599 <            fail("Unexpected exception");
600 <        }    
643 >    /**
644 >     * toArray(a) contains all elements
645 >     */
646 >    public void testToArray2() throws InterruptedException {
647 >        ArrayBlockingQueue q = populatedQueue(SIZE);
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 >     * 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  
603    public void testIteratorOrdering() {
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 <        q.add(new Integer(1));
708 <        q.add(new Integer(2));
709 <        q.add(new Integer(3));
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);
715  
716          assertEquals("queue should be full", 0, q.remainingCapacity());
717  
718          int k = 0;
719          for (Iterator it = q.iterator(); it.hasNext();) {
720 <            int i = ((Integer)(it.next())).intValue();
616 <            assertEquals("items should come out in order", ++k, i);
720 >            assertEquals(++k, it.next());
721          }
722 <
619 <        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);
730 <
731 <        q.add(new Integer(1));
732 <        q.add(new Integer(2));
733 <        q.add(new Integer(3));
734 <
735 <        try {
631 <            for (Iterator it = q.iterator(); it.hasNext();) {
632 <                q.remove();
633 <                it.next();
634 <            }
635 <        }
636 <        catch (ConcurrentModificationException e) {
637 <            fail("weakly consistent iterator; should not get CME");
730 >        q.add(one);
731 >        q.add(two);
732 >        q.add(three);
733 >        for (Iterator it = q.iterator(); it.hasNext();) {
734 >            q.remove();
735 >            it.next();
736          }
737 <
640 <        assertEquals("queue should be empty again", 0, q.size());
737 >        assertEquals(0, q.size());
738      }
739  
740  
741 <    public void testToString(){
742 <        ArrayBlockingQueue q = fullQueue(N);
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 < N; ++i) {
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() {
654
757          final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
758 +        q.add(one);
759 +        q.add(two);
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  
774 <        q.add(new Integer(1));
775 <        q.add(new Integer(2));
774 >        joinPool(executor);
775 >    }
776  
777 +    /**
778 +     * poll retrieves elements across Executor threads
779 +     */
780 +    public void testPollInExecutor() {
781 +        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
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  
796 <        executor.execute(new Runnable() {
797 <            public void run() {
664 <                assertFalse("offer should be rejected", q.offer(new Integer(3)));
665 <                try {
666 <                    assertTrue("offer should be accepted", q.offer(new Integer(3), MEDIUM_DELAY_MS * 2, TimeUnit.MILLISECONDS));
667 <                    assertEquals(0, q.remainingCapacity());
668 <                }
669 <                catch (InterruptedException e) {
670 <                    fail("should not be interrupted");
671 <                }
672 <            }
673 <        });
796 >        joinPool(executor);
797 >    }
798  
799 <        executor.execute(new Runnable() {
800 <            public void run() {
801 <                try {
802 <                    Thread.sleep(MEDIUM_DELAY_MS);
803 <                    assertEquals("first item in queue should be 1", new Integer(1), q.take());
680 <                }
681 <                catch (InterruptedException e) {
682 <                    fail("should not be interrupted");
683 <                }
684 <            }
685 <        });
686 <        
687 <        executor.shutdown();
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 testPollInExecutor() {
819 <
820 <        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
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 <        ExecutorService executor = Executors.newFixedThreadPool(2);
829 >    /**
830 >     * drainTo(this) throws IAE
831 >     */
832 >    public void testDrainToSelf() {
833 >        ArrayBlockingQueue q = populatedQueue(SIZE);
834 >        try {
835 >            q.drainTo(q);
836 >            shouldThrow();
837 >        } catch (IllegalArgumentException success) {}
838 >    }
839  
840 <        executor.execute(new Runnable() {
841 <            public void run() {
842 <                assertNull("poll should fail", q.poll());
843 <                try {
844 <                    assertTrue(null != q.poll(MEDIUM_DELAY_MS * 2, TimeUnit.MILLISECONDS));
845 <                    assertTrue(q.isEmpty());
846 <                }
847 <                catch (InterruptedException e) {
848 <                    fail("should not be interrupted");
849 <                }
850 <            }
851 <        });
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 <        executor.execute(new Runnable() {
865 <            public void run() {
866 <                try {
867 <                    Thread.sleep(MEDIUM_DELAY_MS);
868 <                    q.put(new Integer(1));
869 <                }
870 <                catch (InterruptedException e) {
871 <                    fail("should not be interrupted");
872 <                }
719 <            }
720 <        });
721 <        
722 <        executor.shutdown();
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 <    public void testSerialization() {
885 <        ArrayBlockingQueue q = fullQueue(N);
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 <            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
902 <            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
903 <            out.writeObject(q);
904 <            out.close();
901 >            q.drainTo(q, 0);
902 >            shouldThrow();
903 >        } catch (IllegalArgumentException success) {}
904 >    }
905  
906 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
907 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
908 <            ArrayBlockingQueue r = (ArrayBlockingQueue)in.readObject();
909 <            assertEquals(q.size(), r.size());
910 <            while (!q.isEmpty())
911 <                assertEquals(q.remove(), r.remove());
912 <        } catch(Exception e){
913 <            fail("unexpected exception");
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  
746
925   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines