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

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines