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.29 by jsr166, Wed Oct 6 07:49:22 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 blocks interruptibly when empty
385       */
386 <    public void testTakeFromEmpty() {
386 >    public void testTakeFromEmpty() throws InterruptedException {
387          final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
388 <        Thread t = new Thread(new Runnable() {
389 <                public void run() {
390 <                    try {
391 <                        q.take();
392 <                        threadShouldThrow();
393 <                    } catch (InterruptedException success){ }                
394 <                }
395 <            });
396 <        try {
399 <            t.start();
400 <            Thread.sleep(SHORT_DELAY_MS);
401 <            t.interrupt();
402 <            t.join();
403 <        } catch (Exception e){
404 <            unexpectedException();
405 <        }
388 >        Thread t = new ThreadShouldThrow(InterruptedException.class) {
389 >            public void realRun() throws InterruptedException {
390 >                q.take();
391 >            }};
392 >
393 >        t.start();
394 >        Thread.sleep(SHORT_DELAY_MS);
395 >        t.interrupt();
396 >        t.join();
397      }
398  
399      /**
400 <     *
401 <     */
402 <    public void testBlockingTake() {
403 <        Thread t = new Thread(new Runnable() {
404 <                public void run() {
405 <                    try {
406 <                        LinkedBlockingQueue q = populatedQueue(SIZE);
407 <                        for (int i = 0; i < SIZE; ++i) {
408 <                            assertEquals(i, ((Integer)q.take()).intValue());
409 <                        }
410 <                        q.take();
411 <                        threadShouldThrow();
412 <                    } catch (InterruptedException success){
413 <                    }  
414 <                }});
400 >     * Take removes existing elements until empty, then blocks interruptibly
401 >     */
402 >    public void testBlockingTake() throws InterruptedException {
403 >        final LinkedBlockingQueue q = populatedQueue(SIZE);
404 >        Thread t = new Thread(new CheckedRunnable() {
405 >            public void realRun() throws InterruptedException {
406 >                for (int i = 0; i < SIZE; ++i) {
407 >                    assertEquals(i, q.take());
408 >                }
409 >                try {
410 >                    q.take();
411 >                    shouldThrow();
412 >                } catch (InterruptedException success) {}
413 >            }});
414 >
415          t.start();
416 <        try {
417 <           Thread.sleep(SHORT_DELAY_MS);
418 <           t.interrupt();
428 <           t.join();
429 <        }
430 <        catch (InterruptedException ie) {
431 <            unexpectedException();
432 <        }
416 >        Thread.sleep(SHORT_DELAY_MS);
417 >        t.interrupt();
418 >        t.join();
419      }
420  
435
421      /**
422 <     *
422 >     * poll succeeds unless empty
423       */
424      public void testPoll() {
425          LinkedBlockingQueue q = populatedQueue(SIZE);
426          for (int i = 0; i < SIZE; ++i) {
427 <            assertEquals(i, ((Integer)q.poll()).intValue());
427 >            assertEquals(i, q.poll());
428          }
429 <        assertNull(q.poll());
429 >        assertNull(q.poll());
430      }
431  
432      /**
433 <     *
433 >     * timed pool with zero timeout succeeds when non-empty, else times out
434       */
435 <    public void testTimedPoll0() {
436 <        try {
437 <            LinkedBlockingQueue q = populatedQueue(SIZE);
438 <            for (int i = 0; i < SIZE; ++i) {
439 <                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
440 <            }
456 <            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
457 <        } catch (InterruptedException e){
458 <            unexpectedException();
459 <        }  
435 >    public void testTimedPoll0() throws InterruptedException {
436 >        LinkedBlockingQueue q = populatedQueue(SIZE);
437 >        for (int i = 0; i < SIZE; ++i) {
438 >            assertEquals(i, q.poll(0, MILLISECONDS));
439 >        }
440 >        assertNull(q.poll(0, MILLISECONDS));
441      }
442  
443      /**
444 <     *
444 >     * timed pool with nonzero timeout succeeds when non-empty, else times out
445       */
446 <    public void testTimedPoll() {
447 <        try {
448 <            LinkedBlockingQueue q = populatedQueue(SIZE);
449 <            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();
446 >    public void testTimedPoll() throws InterruptedException {
447 >        LinkedBlockingQueue q = populatedQueue(SIZE);
448 >        for (int i = 0; i < SIZE; ++i) {
449 >            assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
450          }
451 +        assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
452      }
453  
454      /**
455 <     *
455 >     * Interrupted timed poll throws InterruptedException instead of
456 >     * returning timeout status
457       */
458 <    public void testTimedPollWithOffer() {
459 <        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
460 <        Thread t = new Thread(new Runnable() {
461 <                public void run() {
462 <                    try {
463 <                        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) { }                
458 >    public void testInterruptedTimedPoll() throws InterruptedException {
459 >        Thread t = new Thread(new CheckedRunnable() {
460 >            public void realRun() throws InterruptedException {
461 >                LinkedBlockingQueue q = populatedQueue(SIZE);
462 >                for (int i = 0; i < SIZE; ++i) {
463 >                    assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
464                  }
465 <            });
466 <        try {
467 <            t.start();
468 <            Thread.sleep(SMALL_DELAY_MS);
469 <            assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
522 <            t.interrupt();
523 <            t.join();
524 <        } catch (Exception e){
525 <            unexpectedException();
526 <        }
527 <    }  
465 >                try {
466 >                    q.poll(SMALL_DELAY_MS, MILLISECONDS);
467 >                    shouldThrow();
468 >                } catch (InterruptedException success) {}
469 >            }});
470  
471 +        t.start();
472 +        Thread.sleep(SHORT_DELAY_MS);
473 +        t.interrupt();
474 +        t.join();
475 +    }
476  
477      /**
478 <     *
478 >     * peek returns next element, or null if empty
479       */
480      public void testPeek() {
481          LinkedBlockingQueue q = populatedQueue(SIZE);
482          for (int i = 0; i < SIZE; ++i) {
483 <            assertEquals(i, ((Integer)q.peek()).intValue());
484 <            q.poll();
483 >            assertEquals(i, q.peek());
484 >            assertEquals(i, q.poll());
485              assertTrue(q.peek() == null ||
486 <                       i != ((Integer)q.peek()).intValue());
486 >                       !q.peek().equals(i));
487          }
488 <        assertNull(q.peek());
488 >        assertNull(q.peek());
489      }
490  
491      /**
492 <     *
492 >     * element returns next element, or throws NSEE if empty
493       */
494      public void testElement() {
495          LinkedBlockingQueue q = populatedQueue(SIZE);
496          for (int i = 0; i < SIZE; ++i) {
497 <            assertEquals(i, ((Integer)q.element()).intValue());
498 <            q.poll();
497 >            assertEquals(i, q.element());
498 >            assertEquals(i, q.poll());
499          }
500          try {
501              q.element();
502              shouldThrow();
503 <        }
557 <        catch (NoSuchElementException success) {}
503 >        } catch (NoSuchElementException success) {}
504      }
505  
506      /**
507 <     *
507 >     * remove removes next element, or throws NSEE if empty
508       */
509      public void testRemove() {
510          LinkedBlockingQueue q = populatedQueue(SIZE);
511          for (int i = 0; i < SIZE; ++i) {
512 <            assertEquals(i, ((Integer)q.remove()).intValue());
512 >            assertEquals(i, q.remove());
513          }
514          try {
515              q.remove();
516              shouldThrow();
517 <        } catch (NoSuchElementException success){
572 <        }  
517 >        } catch (NoSuchElementException success) {}
518      }
519  
520      /**
521 <     *
521 >     * remove(x) removes x and returns true if present
522       */
523      public void testRemoveElement() {
524          LinkedBlockingQueue q = populatedQueue(SIZE);
# Line 586 | Line 531 | public class LinkedBlockingQueueTest ext
531          }
532          assertTrue(q.isEmpty());
533      }
534 <        
534 >
535      /**
536 <     *
536 >     * An add following remove(x) succeeds
537 >     */
538 >    public void testRemoveElementAndAdd() throws InterruptedException {
539 >        LinkedBlockingQueue q = new LinkedBlockingQueue();
540 >        assertTrue(q.add(new Integer(1)));
541 >        assertTrue(q.add(new Integer(2)));
542 >        assertTrue(q.remove(new Integer(1)));
543 >        assertTrue(q.remove(new Integer(2)));
544 >        assertTrue(q.add(new Integer(3)));
545 >        assertTrue(q.take() != null);
546 >    }
547 >
548 >    /**
549 >     * contains(x) reports true when elements added but not yet removed
550       */
551      public void testContains() {
552          LinkedBlockingQueue q = populatedQueue(SIZE);
# Line 600 | Line 558 | public class LinkedBlockingQueueTest ext
558      }
559  
560      /**
561 <     *
561 >     * clear removes all elements
562       */
563      public void testClear() {
564          LinkedBlockingQueue q = populatedQueue(SIZE);
# Line 610 | Line 568 | public class LinkedBlockingQueueTest ext
568          assertEquals(SIZE, q.remainingCapacity());
569          q.add(one);
570          assertFalse(q.isEmpty());
571 +        assertTrue(q.contains(one));
572          q.clear();
573          assertTrue(q.isEmpty());
574      }
575  
576      /**
577 <     *
577 >     * containsAll(c) is true when c contains a subset of elements
578       */
579      public void testContainsAll() {
580          LinkedBlockingQueue q = populatedQueue(SIZE);
# Line 629 | Line 588 | public class LinkedBlockingQueueTest ext
588      }
589  
590      /**
591 <     *
591 >     * retainAll(c) retains only those elements of c and reports true if changed
592       */
593      public void testRetainAll() {
594          LinkedBlockingQueue q = populatedQueue(SIZE);
# Line 648 | Line 607 | public class LinkedBlockingQueueTest ext
607      }
608  
609      /**
610 <     *
610 >     * removeAll(c) removes only those elements of c and reports true if changed
611       */
612      public void testRemoveAll() {
613          for (int i = 1; i < SIZE; ++i) {
# Line 663 | Line 622 | public class LinkedBlockingQueueTest ext
622          }
623      }
624  
625 +    /**
626 +     * toArray contains all elements
627 +     */
628 +    public void testToArray() throws InterruptedException {
629 +        LinkedBlockingQueue q = populatedQueue(SIZE);
630 +        Object[] o = q.toArray();
631 +        for (int i = 0; i < o.length; i++)
632 +            assertEquals(o[i], q.take());
633 +    }
634  
635      /**
636 <     *
636 >     * toArray(a) contains all elements
637       */
638 <    public void testToArray() {
638 >    public void testToArray2() throws InterruptedException {
639          LinkedBlockingQueue q = populatedQueue(SIZE);
640 <        Object[] o = q.toArray();
641 <        try {
642 <        for(int i = 0; i < o.length; i++)
643 <            assertEquals(o[i], q.take());
676 <        } catch (InterruptedException e){
677 <            unexpectedException();
678 <        }    
640 >        Integer[] ints = new Integer[SIZE];
641 >        ints = (Integer[])q.toArray(ints);
642 >        for (int i = 0; i < ints.length; i++)
643 >            assertEquals(ints[i], q.take());
644      }
645  
646      /**
647 <     *
647 >     * toArray(null) throws NPE
648       */
649 <    public void testToArray2() {
649 >    public void testToArray_BadArg() {
650          LinkedBlockingQueue q = populatedQueue(SIZE);
651 <        Integer[] ints = new Integer[SIZE];
652 <        ints = (Integer[])q.toArray(ints);
653 <        try {
654 <            for(int i = 0; i < ints.length; i++)
690 <                assertEquals(ints[i], q.take());
691 <        } catch (InterruptedException e){
692 <            unexpectedException();
693 <        }    
651 >        try {
652 >            Object o[] = q.toArray(null);
653 >            shouldThrow();
654 >        } catch (NullPointerException success) {}
655      }
656 <    
656 >
657      /**
658 <     *
658 >     * toArray with incompatible array type throws CCE
659       */
660 <    public void testIterator() {
660 >    public void testToArray1_BadArg() {
661          LinkedBlockingQueue q = populatedQueue(SIZE);
662 <        Iterator it = q.iterator();
663 <        try {
664 <            while(it.hasNext()){
665 <                assertEquals(it.next(), q.take());
705 <            }
706 <        } catch (InterruptedException e){
707 <            unexpectedException();
708 <        }    
662 >        try {
663 >            Object o[] = q.toArray(new String[10]);
664 >            shouldThrow();
665 >        } catch (ArrayStoreException success) {}
666      }
667  
668 +
669      /**
670 <     *
670 >     * iterator iterates through all elements
671       */
672 <    public void testIteratorOrdering() {
672 >    public void testIterator() throws InterruptedException {
673 >        LinkedBlockingQueue q = populatedQueue(SIZE);
674 >        Iterator it = q.iterator();
675 >        while (it.hasNext()) {
676 >            assertEquals(it.next(), q.take());
677 >        }
678 >    }
679  
680 +    /**
681 +     * iterator.remove removes current element
682 +     */
683 +    public void testIteratorRemove() {
684          final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
685 +        q.add(two);
686 +        q.add(one);
687 +        q.add(three);
688 +
689 +        Iterator it = q.iterator();
690 +        it.next();
691 +        it.remove();
692  
693 +        it = q.iterator();
694 +        assertSame(it.next(), one);
695 +        assertSame(it.next(), three);
696 +        assertFalse(it.hasNext());
697 +    }
698 +
699 +
700 +    /**
701 +     * iterator ordering is FIFO
702 +     */
703 +    public void testIteratorOrdering() {
704 +        final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
705          q.add(one);
706          q.add(two);
707          q.add(three);
721
708          assertEquals(0, q.remainingCapacity());
723
709          int k = 0;
710          for (Iterator it = q.iterator(); it.hasNext();) {
711 <            int i = ((Integer)(it.next())).intValue();
727 <            assertEquals(++k, i);
711 >            assertEquals(++k, it.next());
712          }
729
713          assertEquals(3, k);
714      }
715  
716      /**
717 <     *
717 >     * Modifications do not cause iterators to fail
718       */
719 <    public void testWeaklyConsistentIteration () {
737 <
719 >    public void testWeaklyConsistentIteration() {
720          final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
739
721          q.add(one);
722          q.add(two);
723          q.add(three);
724 <
725 <        try {
726 <            for (Iterator it = q.iterator(); it.hasNext();) {
746 <                q.remove();
747 <                it.next();
748 <            }
749 <        }
750 <        catch (ConcurrentModificationException e) {
751 <            unexpectedException();
724 >        for (Iterator it = q.iterator(); it.hasNext();) {
725 >            q.remove();
726 >            it.next();
727          }
753
728          assertEquals(0, q.size());
729      }
730  
731  
732      /**
733 <     *
733 >     * toString contains toStrings of elements
734       */
735      public void testToString() {
736          LinkedBlockingQueue q = populatedQueue(SIZE);
# Line 764 | Line 738 | public class LinkedBlockingQueueTest ext
738          for (int i = 0; i < SIZE; ++i) {
739              assertTrue(s.indexOf(String.valueOf(i)) >= 0);
740          }
741 <    }        
741 >    }
742  
743  
744      /**
745 <     *
745 >     * offer transfers elements across Executor tasks
746       */
747      public void testOfferInExecutor() {
774
748          final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
776
749          q.add(one);
750          q.add(two);
779
751          ExecutorService executor = Executors.newFixedThreadPool(2);
752 +        executor.execute(new CheckedRunnable() {
753 +            public void realRun() throws InterruptedException {
754 +                assertFalse(q.offer(three));
755 +                assertTrue(q.offer(three, MEDIUM_DELAY_MS, MILLISECONDS));
756 +                assertEquals(0, q.remainingCapacity());
757 +            }});
758 +
759 +        executor.execute(new CheckedRunnable() {
760 +            public void realRun() throws InterruptedException {
761 +                Thread.sleep(SMALL_DELAY_MS);
762 +                assertSame(one, q.take());
763 +            }});
764  
765 <        executor.execute(new Runnable() {
766 <            public void run() {
767 <                threadAssertFalse(q.offer(three));
768 <                try {
769 <                    threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
770 <                    threadAssertEquals(0, q.remainingCapacity());
771 <                }
772 <                catch (InterruptedException e) {
773 <                    threadUnexpectedException();
774 <                }
775 <            }
776 <        });
765 >        joinPool(executor);
766 >    }
767 >
768 >    /**
769 >     * poll retrieves elements across Executor threads
770 >     */
771 >    public void testPollInExecutor() {
772 >        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
773 >        ExecutorService executor = Executors.newFixedThreadPool(2);
774 >        executor.execute(new CheckedRunnable() {
775 >            public void realRun() throws InterruptedException {
776 >                assertNull(q.poll());
777 >                assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
778 >                assertTrue(q.isEmpty());
779 >            }});
780 >
781 >        executor.execute(new CheckedRunnable() {
782 >            public void realRun() throws InterruptedException {
783 >                Thread.sleep(SMALL_DELAY_MS);
784 >                q.put(one);
785 >            }});
786  
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        
787          joinPool(executor);
788 +    }
789  
790 +    /**
791 +     * A deserialized serialized queue has same elements in same order
792 +     */
793 +    public void testSerialization() throws Exception {
794 +        LinkedBlockingQueue q = populatedQueue(SIZE);
795 +
796 +        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
797 +        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
798 +        out.writeObject(q);
799 +        out.close();
800 +
801 +        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
802 +        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
803 +        LinkedBlockingQueue r = (LinkedBlockingQueue)in.readObject();
804 +        assertEquals(q.size(), r.size());
805 +        while (!q.isEmpty())
806 +            assertEquals(q.remove(), r.remove());
807      }
808  
809      /**
810 <     *
810 >     * drainTo(null) throws NPE
811       */
812 <    public void testPollInExecutor() {
812 >    public void testDrainToNull() {
813 >        LinkedBlockingQueue q = populatedQueue(SIZE);
814 >        try {
815 >            q.drainTo(null);
816 >            shouldThrow();
817 >        } catch (NullPointerException success) {}
818 >    }
819  
820 <        final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
820 >    /**
821 >     * drainTo(this) throws IAE
822 >     */
823 >    public void testDrainToSelf() {
824 >        LinkedBlockingQueue q = populatedQueue(SIZE);
825 >        try {
826 >            q.drainTo(q);
827 >            shouldThrow();
828 >        } catch (IllegalArgumentException success) {}
829 >    }
830  
831 <        ExecutorService executor = Executors.newFixedThreadPool(2);
831 >    /**
832 >     * drainTo(c) empties queue into another collection c
833 >     */
834 >    public void testDrainTo() {
835 >        LinkedBlockingQueue q = populatedQueue(SIZE);
836 >        ArrayList l = new ArrayList();
837 >        q.drainTo(l);
838 >        assertEquals(q.size(), 0);
839 >        assertEquals(l.size(), SIZE);
840 >        for (int i = 0; i < SIZE; ++i)
841 >            assertEquals(l.get(i), new Integer(i));
842 >        q.add(zero);
843 >        q.add(one);
844 >        assertFalse(q.isEmpty());
845 >        assertTrue(q.contains(zero));
846 >        assertTrue(q.contains(one));
847 >        l.clear();
848 >        q.drainTo(l);
849 >        assertEquals(q.size(), 0);
850 >        assertEquals(l.size(), 2);
851 >        for (int i = 0; i < 2; ++i)
852 >            assertEquals(l.get(i), new Integer(i));
853 >    }
854  
855 <        executor.execute(new Runnable() {
856 <            public void run() {
857 <                threadAssertNull(q.poll());
858 <                try {
859 <                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
860 <                    threadAssertTrue(q.isEmpty());
861 <                }
862 <                catch (InterruptedException e) {
863 <                    threadUnexpectedException();
829 <                }
830 <            }
831 <        });
855 >    /**
856 >     * drainTo empties full queue, unblocking a waiting put.
857 >     */
858 >    public void testDrainToWithActivePut() throws InterruptedException {
859 >        final LinkedBlockingQueue q = populatedQueue(SIZE);
860 >        Thread t = new Thread(new CheckedRunnable() {
861 >            public void realRun() throws InterruptedException {
862 >                q.put(new Integer(SIZE+1));
863 >            }});
864  
865 <        executor.execute(new Runnable() {
866 <            public void run() {
867 <                try {
868 <                    Thread.sleep(SMALL_DELAY_MS);
869 <                    q.put(one);
870 <                }
871 <                catch (InterruptedException e) {
872 <                    threadUnexpectedException();
841 <                }
842 <            }
843 <        });
844 <        
845 <        joinPool(executor);
865 >        t.start();
866 >        ArrayList l = new ArrayList();
867 >        q.drainTo(l);
868 >        assertTrue(l.size() >= SIZE);
869 >        for (int i = 0; i < SIZE; ++i)
870 >            assertEquals(l.get(i), new Integer(i));
871 >        t.join();
872 >        assertTrue(q.size() + l.size() >= SIZE);
873      }
874  
875      /**
876 <     *
876 >     * drainTo(null, n) throws NPE
877       */
878 <    public void testSerialization() {
878 >    public void testDrainToNullN() {
879          LinkedBlockingQueue q = populatedQueue(SIZE);
880 +        try {
881 +            q.drainTo(null, 0);
882 +            shouldThrow();
883 +        } catch (NullPointerException success) {}
884 +    }
885  
886 +    /**
887 +     * drainTo(this, n) throws IAE
888 +     */
889 +    public void testDrainToSelfN() {
890 +        LinkedBlockingQueue q = populatedQueue(SIZE);
891          try {
892 <            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
893 <            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
894 <            out.writeObject(q);
895 <            out.close();
892 >            q.drainTo(q, 0);
893 >            shouldThrow();
894 >        } catch (IllegalArgumentException success) {}
895 >    }
896  
897 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
898 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
899 <            LinkedBlockingQueue r = (LinkedBlockingQueue)in.readObject();
900 <            assertEquals(q.size(), r.size());
901 <            while (!q.isEmpty())
902 <                assertEquals(q.remove(), r.remove());
903 <        } catch(Exception e){
904 <            unexpectedException();
897 >    /**
898 >     * drainTo(c, n) empties first max {n, size} elements of queue into c
899 >     */
900 >    public void testDrainToN() {
901 >        LinkedBlockingQueue q = new LinkedBlockingQueue();
902 >        for (int i = 0; i < SIZE + 2; ++i) {
903 >            for (int j = 0; j < SIZE; j++)
904 >                assertTrue(q.offer(new Integer(j)));
905 >            ArrayList l = new ArrayList();
906 >            q.drainTo(l, i);
907 >            int k = (i < SIZE)? i : SIZE;
908 >            assertEquals(l.size(), k);
909 >            assertEquals(q.size(), SIZE-k);
910 >            for (int j = 0; j < k; ++j)
911 >                assertEquals(l.get(j), new Integer(j));
912 >            while (q.poll() != null) ;
913          }
914      }
915  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines