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

Comparing jsr166/src/test/tck/SynchronousQueueTest.java (file contents):
Revision 1.4 by dl, Sat Sep 20 18:20:08 2003 UTC vs.
Revision 1.26 by jsr166, Sat Oct 9 19:30:35 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 SynchronousQueueTest extends JSR166TestCase {
16  
17 +    public static class Fair extends BlockingQueueTest {
18 +        protected BlockingQueue emptyCollection() {
19 +            return new SynchronousQueue(true);
20 +        }
21 +    }
22 +
23 +    public static class NonFair extends BlockingQueueTest {
24 +        protected BlockingQueue emptyCollection() {
25 +            return new SynchronousQueue(false);
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(SynchronousQueueTest.class);
34 >        return newTestSuite(SynchronousQueueTest.class,
35 >                            new Fair().testSuite(),
36 >                            new NonFair().testSuite());
37      }
38  
39      /**
40 <     *
40 >     * A SynchronousQueue is both empty and full
41       */
42      public void testEmptyFull() {
43          SynchronousQueue q = new SynchronousQueue();
44          assertTrue(q.isEmpty());
45 <        assertEquals(0, q.size());
45 >        assertEquals(0, q.size());
46 >        assertEquals(0, q.remainingCapacity());
47 >        assertFalse(q.offer(zero));
48 >    }
49 >
50 >    /**
51 >     * A fair SynchronousQueue is both empty and full
52 >     */
53 >    public void testFairEmptyFull() {
54 >        SynchronousQueue q = new SynchronousQueue(true);
55 >        assertTrue(q.isEmpty());
56 >        assertEquals(0, q.size());
57          assertEquals(0, q.remainingCapacity());
58 <        assertFalse(q.offer(new Integer(3)));
58 >        assertFalse(q.offer(zero));
59      }
60  
61      /**
62 <     *
62 >     * offer(null) throws NPE
63       */
64      public void testOfferNull() {
65 <        try {
65 >        try {
66              SynchronousQueue q = new SynchronousQueue();
67              q.offer(null);
68              shouldThrow();
69 <        } catch (NullPointerException success) { }  
69 >        } catch (NullPointerException success) {}
70 >    }
71 >
72 >    /**
73 >     * add(null) throws NPE
74 >     */
75 >    public void testAddNull() {
76 >        try {
77 >            SynchronousQueue q = new SynchronousQueue();
78 >            q.add(null);
79 >            shouldThrow();
80 >        } catch (NullPointerException success) {}
81      }
82  
83      /**
84 <     *
84 >     * offer fails if no active taker
85       */
86      public void testOffer() {
87          SynchronousQueue q = new SynchronousQueue();
88 <        assertFalse(q.offer(new Integer(1)));
88 >        assertFalse(q.offer(one));
89      }
90  
91      /**
92 <     *
92 >     * add throws ISE if no active taker
93       */
94      public void testAdd() {
95 <        try {
95 >        try {
96              SynchronousQueue q = new SynchronousQueue();
97              assertEquals(0, q.remainingCapacity());
98 <            q.add(new Integer(0));
99 <        } catch (IllegalStateException success){
100 <        }  
98 >            q.add(one);
99 >            shouldThrow();
100 >        } catch (IllegalStateException success) {}
101      }
102  
103      /**
104 <     *
104 >     * addAll(null) throws NPE
105       */
106      public void testAddAll1() {
107          try {
108              SynchronousQueue q = new SynchronousQueue();
109              q.addAll(null);
110              shouldThrow();
111 <        }
74 <        catch (NullPointerException success) {}
111 >        } catch (NullPointerException success) {}
112      }
113 +
114      /**
115 <     *
115 >     * addAll(this) throws IAE
116 >     */
117 >    public void testAddAllSelf() {
118 >        try {
119 >            SynchronousQueue q = new SynchronousQueue();
120 >            q.addAll(q);
121 >            shouldThrow();
122 >        } catch (IllegalArgumentException success) {}
123 >    }
124 >
125 >    /**
126 >     * addAll of a collection with null elements throws NPE
127       */
128      public void testAddAll2() {
129          try {
# Line 82 | Line 131 | public class SynchronousQueueTest extend
131              Integer[] ints = new Integer[1];
132              q.addAll(Arrays.asList(ints));
133              shouldThrow();
134 <        }
86 <        catch (NullPointerException success) {}
134 >        } catch (NullPointerException success) {}
135      }
136 +
137      /**
138 <     *
138 >     * addAll throws ISE if no active taker
139       */
140      public void testAddAll4() {
141          try {
# Line 96 | Line 145 | public class SynchronousQueueTest extend
145                  ints[i] = new Integer(i);
146              q.addAll(Arrays.asList(ints));
147              shouldThrow();
148 <        }
100 <        catch (IllegalStateException success) {}
148 >        } catch (IllegalStateException success) {}
149      }
150  
151      /**
152 <     *
152 >     * put(null) throws NPE
153       */
154 <    public void testPutNull() {
155 <        try {
154 >    public void testPutNull() throws InterruptedException {
155 >        try {
156              SynchronousQueue q = new SynchronousQueue();
157              q.put(null);
158              shouldThrow();
159 <        }
112 <        catch (NullPointerException success){
113 <        }  
114 <        catch (InterruptedException ie) {
115 <            unexpectedException();
116 <        }
159 >        } catch (NullPointerException success) {}
160       }
161  
162      /**
163 <     *
163 >     * put blocks interruptibly if no active taker
164       */
165 <    public void testBlockingPut() {
166 <        Thread t = new Thread(new Runnable() {
167 <                public void run() {
168 <                    try {
169 <                        SynchronousQueue q = new SynchronousQueue();
170 <                        q.put(new Integer(0));
171 <                        threadShouldThrow();
172 <                    } catch (InterruptedException ie){
173 <                    }  
174 <                }});
175 <        t.start();
133 <        try {
134 <           Thread.sleep(SHORT_DELAY_MS);
135 <           t.interrupt();
136 <           t.join();
137 <        }
138 <        catch (InterruptedException ie) {
139 <            unexpectedException();
140 <        }
165 >    public void testBlockingPut() throws InterruptedException {
166 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
167 >            public void realRun() throws InterruptedException {
168 >                SynchronousQueue q = new SynchronousQueue();
169 >                q.put(zero);
170 >            }});
171 >
172 >        t.start();
173 >        Thread.sleep(SHORT_DELAY_MS);
174 >        t.interrupt();
175 >        t.join();
176      }
177  
178      /**
179 <     *
179 >     * put blocks waiting for take
180       */
181 <    public void testPutWithTake() {
181 >    public void testPutWithTake() throws InterruptedException {
182          final SynchronousQueue q = new SynchronousQueue();
183 <        Thread t = new Thread(new Runnable() {
184 <                public void run() {
185 <                    int added = 0;
186 <                    try {
187 <                        q.put(new Object());
188 <                        ++added;
154 <                        q.put(new Object());
155 <                        ++added;
156 <                        q.put(new Object());
157 <                        ++added;
158 <                        q.put(new Object());
183 >        Thread t = new Thread(new CheckedRunnable() {
184 >            public void realRun() throws InterruptedException {
185 >                int added = 0;
186 >                try {
187 >                    while (true) {
188 >                        q.put(added);
189                          ++added;
160                        threadShouldThrow();
161                    } catch (InterruptedException e){
162                        assertTrue(added >= 1);
190                      }
191 +                } catch (InterruptedException success) {
192 +                    assertEquals(1, added);
193                  }
194 <            });
195 <        try {
196 <            t.start();
197 <            Thread.sleep(SHORT_DELAY_MS);
198 <            q.take();
199 <            Thread.sleep(SHORT_DELAY_MS);
200 <            t.interrupt();
201 <            t.join();
173 <        } catch (Exception e){
174 <            unexpectedException();
175 <        }
194 >            }});
195 >
196 >        t.start();
197 >        Thread.sleep(SHORT_DELAY_MS);
198 >        assertEquals(0, q.take());
199 >        Thread.sleep(SHORT_DELAY_MS);
200 >        t.interrupt();
201 >        t.join();
202      }
203  
204      /**
205 <     *
205 >     * timed offer times out if elements not taken
206       */
207 <    public void testTimedOffer() {
207 >    public void testTimedOffer() throws InterruptedException {
208          final SynchronousQueue q = new SynchronousQueue();
209 <        Thread t = new Thread(new Runnable() {
210 <                public void run() {
211 <                    try {
212 <
213 <                        threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
214 <                        q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
215 <                        threadShouldThrow();
216 <                    } catch (InterruptedException success){}
217 <                }
218 <            });
193 <        
194 <        try {
195 <            t.start();
196 <            Thread.sleep(SMALL_DELAY_MS);
197 <            t.interrupt();
198 <            t.join();
199 <        } catch (Exception e){
200 <            unexpectedException();
201 <        }
209 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
210 >            public void realRun() throws InterruptedException {
211 >                assertFalse(q.offer(new Object(), SHORT_DELAY_MS, MILLISECONDS));
212 >                q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
213 >            }});
214 >
215 >        t.start();
216 >        Thread.sleep(SMALL_DELAY_MS);
217 >        t.interrupt();
218 >        t.join();
219      }
220  
221  
222      /**
223 <     *
223 >     * take blocks interruptibly when empty
224       */
225 <    public void testTakeFromEmpty() {
225 >    public void testTakeFromEmpty() throws InterruptedException {
226          final SynchronousQueue q = new SynchronousQueue();
227 <        Thread t = new Thread(new Runnable() {
228 <                public void run() {
229 <                    try {
230 <                        q.take();
231 <                        threadShouldThrow();
232 <                    } catch (InterruptedException success){ }                
227 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
228 >            public void realRun() throws InterruptedException {
229 >                q.take();
230 >            }});
231 >
232 >        t.start();
233 >        Thread.sleep(SHORT_DELAY_MS);
234 >        t.interrupt();
235 >        t.join();
236 >    }
237 >
238 >
239 >    /**
240 >     * put blocks interruptibly if no active taker
241 >     */
242 >    public void testFairBlockingPut() throws InterruptedException {
243 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
244 >            public void realRun() throws InterruptedException {
245 >                SynchronousQueue q = new SynchronousQueue(true);
246 >                q.put(zero);
247 >            }});
248 >
249 >        t.start();
250 >        Thread.sleep(SHORT_DELAY_MS);
251 >        t.interrupt();
252 >        t.join();
253 >    }
254 >
255 >    /**
256 >     * put blocks waiting for take
257 >     */
258 >    public void testFairPutWithTake() throws InterruptedException {
259 >        final SynchronousQueue q = new SynchronousQueue(true);
260 >        Thread t = new Thread(new CheckedRunnable() {
261 >            public void realRun() throws InterruptedException {
262 >                int added = 0;
263 >                try {
264 >                    while (true) {
265 >                        q.put(added);
266 >                        ++added;
267 >                    }
268 >                } catch (InterruptedException success) {
269 >                    assertEquals(1, added);
270                  }
271 <            });
272 <        try {
273 <            t.start();
274 <            Thread.sleep(SHORT_DELAY_MS);
275 <            t.interrupt();
276 <            t.join();
277 <        } catch (Exception e){
278 <            unexpectedException();
279 <        }
271 >            }});
272 >
273 >        t.start();
274 >        Thread.sleep(SHORT_DELAY_MS);
275 >        assertEquals(0, q.take());
276 >        Thread.sleep(SHORT_DELAY_MS);
277 >        t.interrupt();
278 >        t.join();
279 >    }
280 >
281 >    /**
282 >     * timed offer times out if elements not taken
283 >     */
284 >    public void testFairTimedOffer() throws InterruptedException {
285 >        final SynchronousQueue q = new SynchronousQueue(true);
286 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
287 >            public void realRun() throws InterruptedException {
288 >                assertFalse(q.offer(new Object(), SHORT_DELAY_MS, MILLISECONDS));
289 >                q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
290 >            }});
291 >
292 >        t.start();
293 >        Thread.sleep(SMALL_DELAY_MS);
294 >        t.interrupt();
295 >        t.join();
296      }
297  
298 +
299      /**
300 <     *
300 >     * take blocks interruptibly when empty
301 >     */
302 >    public void testFairTakeFromEmpty() throws InterruptedException {
303 >        final SynchronousQueue q = new SynchronousQueue(true);
304 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
305 >            public void realRun() throws InterruptedException {
306 >                q.take();
307 >            }});
308 >
309 >        t.start();
310 >        Thread.sleep(SHORT_DELAY_MS);
311 >        t.interrupt();
312 >        t.join();
313 >    }
314 >
315 >    /**
316 >     * poll fails unless active taker
317       */
318      public void testPoll() {
319          SynchronousQueue q = new SynchronousQueue();
320 <        assertNull(q.poll());
320 >        assertNull(q.poll());
321      }
322  
323      /**
324 <     *
324 >     * timed pool with zero timeout times out if no active taker
325       */
326 <    public void testTimedPoll0() {
327 <        try {
328 <            SynchronousQueue q = new SynchronousQueue();
242 <            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
243 <        } catch (InterruptedException e){
244 <            unexpectedException();
245 <        }  
326 >    public void testTimedPoll0() throws InterruptedException {
327 >        SynchronousQueue q = new SynchronousQueue();
328 >        assertNull(q.poll(0, MILLISECONDS));
329      }
330  
331      /**
332 <     *
332 >     * timed pool with nonzero timeout times out if no active taker
333       */
334 <    public void testTimedPoll() {
335 <        try {
336 <            SynchronousQueue q = new SynchronousQueue();
254 <            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
255 <        } catch (InterruptedException e){
256 <            unexpectedException();
257 <        }  
334 >    public void testTimedPoll() throws InterruptedException {
335 >        SynchronousQueue q = new SynchronousQueue();
336 >        assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
337      }
338  
339      /**
340 <     *
341 <     */
342 <    public void testInterruptedTimedPoll() {
343 <        Thread t = new Thread(new Runnable() {
344 <                public void run() {
345 <                    try {
346 <                        SynchronousQueue q = new SynchronousQueue();
347 <                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
348 <                    } catch (InterruptedException success){
349 <                    }  
350 <                }});
351 <        t.start();
352 <        try {
353 <           Thread.sleep(SHORT_DELAY_MS);
275 <           t.interrupt();
276 <           t.join();
277 <        }
278 <        catch (InterruptedException ie) {
279 <            unexpectedException();
280 <        }
340 >     * Interrupted timed poll throws InterruptedException instead of
341 >     * returning timeout status
342 >     */
343 >    public void testInterruptedTimedPoll() throws InterruptedException {
344 >        final SynchronousQueue q = new SynchronousQueue();
345 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
346 >            public void realRun() throws InterruptedException {
347 >                q.poll(SMALL_DELAY_MS, MILLISECONDS);
348 >            }});
349 >
350 >        t.start();
351 >        Thread.sleep(SHORT_DELAY_MS);
352 >        t.interrupt();
353 >        t.join();
354      }
355  
356      /**
357 <     *
357 >     * Interrupted timed poll throws InterruptedException instead of
358 >     * returning timeout status
359       */
360 <    public void testTimedPollWithOffer() {
361 <        final SynchronousQueue q = new SynchronousQueue();
362 <        Thread t = new Thread(new Runnable() {
363 <                public void run() {
364 <                    try {
365 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
366 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
367 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
368 <                        threadShouldThrow();
369 <                    } catch (InterruptedException success) { }                
370 <                }
371 <            });
372 <        try {
373 <            t.start();
374 <            Thread.sleep(SMALL_DELAY_MS);
375 <            assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
376 <            t.interrupt();
377 <            t.join();
378 <        } catch (Exception e){
379 <            unexpectedException();
380 <        }
381 <    }  
360 >    public void testFairInterruptedTimedPoll() throws InterruptedException {
361 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
362 >            public void realRun() throws InterruptedException {
363 >                SynchronousQueue q = new SynchronousQueue(true);
364 >                q.poll(SMALL_DELAY_MS, MILLISECONDS);
365 >            }});
366 >
367 >        t.start();
368 >        Thread.sleep(SHORT_DELAY_MS);
369 >        t.interrupt();
370 >        t.join();
371 >    }
372 >
373 >    /**
374 >     * timed poll before a delayed offer fails; after offer succeeds;
375 >     * on interruption throws
376 >     */
377 >    public void testFairTimedPollWithOffer() throws InterruptedException {
378 >        final SynchronousQueue q = new SynchronousQueue(true);
379 >        Thread t = new Thread(new CheckedRunnable() {
380 >            public void realRun() throws InterruptedException {
381 >                try {
382 >                    assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
383 >                    assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
384 >                    q.poll(LONG_DELAY_MS, MILLISECONDS);
385 >                    threadShouldThrow();
386 >                } catch (InterruptedException success) {}
387 >            }});
388 >
389 >        t.start();
390 >        Thread.sleep(SMALL_DELAY_MS);
391 >        assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
392 >        t.interrupt();
393 >        t.join();
394 >    }
395  
396  
397      /**
398 <     *
398 >     * peek returns null
399       */
400      public void testPeek() {
401          SynchronousQueue q = new SynchronousQueue();
402 <        assertNull(q.peek());
402 >        assertNull(q.peek());
403      }
404  
405      /**
406 <     *
406 >     * element throws NSEE
407       */
408      public void testElement() {
409          SynchronousQueue q = new SynchronousQueue();
410          try {
411              q.element();
412              shouldThrow();
413 <        }
327 <        catch (NoSuchElementException success) {}
413 >        } catch (NoSuchElementException success) {}
414      }
415  
416      /**
417 <     *
417 >     * remove throws NSEE if no active taker
418       */
419      public void testRemove() {
420          SynchronousQueue q = new SynchronousQueue();
421          try {
422              q.remove();
423              shouldThrow();
424 <        } catch (NoSuchElementException success){
339 <        }  
424 >        } catch (NoSuchElementException success) {}
425      }
426  
427      /**
428 <     *
428 >     * remove(x) returns false
429       */
430      public void testRemoveElement() {
431          SynchronousQueue q = new SynchronousQueue();
432 <        assertFalse(q.remove(new Integer(0)));
432 >        assertFalse(q.remove(zero));
433          assertTrue(q.isEmpty());
434      }
435 <        
435 >
436      /**
437 <     *
437 >     * contains returns false
438       */
439      public void testContains() {
440          SynchronousQueue q = new SynchronousQueue();
441 <        assertFalse(q.contains(new Integer(0)));
441 >        assertFalse(q.contains(zero));
442      }
443  
444      /**
445 <     *
445 >     * clear ensures isEmpty
446       */
447      public void testClear() {
448          SynchronousQueue q = new SynchronousQueue();
# Line 366 | Line 451 | public class SynchronousQueueTest extend
451      }
452  
453      /**
454 <     *
454 >     * containsAll returns false unless empty
455       */
456      public void testContainsAll() {
457          SynchronousQueue q = new SynchronousQueue();
458          Integer[] empty = new Integer[0];
459 <        Integer[] ints = new Integer[1]; ints[0] = new Integer(0);
459 >        assertTrue(q.containsAll(Arrays.asList(empty)));
460 >        Integer[] ints = new Integer[1]; ints[0] = zero;
461          assertFalse(q.containsAll(Arrays.asList(ints)));
462      }
463  
464      /**
465 <     *
465 >     * retainAll returns false
466       */
467      public void testRetainAll() {
468          SynchronousQueue q = new SynchronousQueue();
469          Integer[] empty = new Integer[0];
470 <        Integer[] ints = new Integer[1]; ints[0] = new Integer(0);
471 <        q.retainAll(Arrays.asList(ints));
472 <        assertFalse(q.containsAll(Arrays.asList(ints)));
470 >        assertFalse(q.retainAll(Arrays.asList(empty)));
471 >        Integer[] ints = new Integer[1]; ints[0] = zero;
472 >        assertFalse(q.retainAll(Arrays.asList(ints)));
473      }
474  
475      /**
476 <     *
476 >     * removeAll returns false
477       */
478      public void testRemoveAll() {
479          SynchronousQueue q = new SynchronousQueue();
480          Integer[] empty = new Integer[0];
481 <        Integer[] ints = new Integer[1]; ints[0] = new Integer(0);
482 <        q.removeAll(Arrays.asList(ints));
481 >        assertFalse(q.removeAll(Arrays.asList(empty)));
482 >        Integer[] ints = new Integer[1]; ints[0] = zero;
483          assertFalse(q.containsAll(Arrays.asList(ints)));
484      }
485  
486  
487      /**
488 <     *
488 >     * toArray is empty
489       */
490      public void testToArray() {
491          SynchronousQueue q = new SynchronousQueue();
492 <        Object[] o = q.toArray();
492 >        Object[] o = q.toArray();
493          assertEquals(o.length, 0);
494      }
495  
496      /**
497 <     *
497 >     * toArray(a) is nulled at position 0
498       */
499      public void testToArray2() {
500          SynchronousQueue q = new SynchronousQueue();
501 <        Integer[] ints = new Integer[1];
501 >        Integer[] ints = new Integer[1];
502          assertNull(ints[0]);
503      }
504 <    
504 >
505      /**
506 <     *
506 >     * toArray(null) throws NPE
507 >     */
508 >    public void testToArray_BadArg() {
509 >        SynchronousQueue q = new SynchronousQueue();
510 >        try {
511 >            Object o[] = q.toArray(null);
512 >            shouldThrow();
513 >        } catch (NullPointerException success) {}
514 >    }
515 >
516 >
517 >    /**
518 >     * iterator does not traverse any elements
519       */
520      public void testIterator() {
521          SynchronousQueue q = new SynchronousQueue();
522 <        Iterator it = q.iterator();
522 >        Iterator it = q.iterator();
523          assertFalse(it.hasNext());
524          try {
525              Object x = it.next();
526              shouldThrow();
527 <        }
430 <        catch (NoSuchElementException success) {}
527 >        } catch (NoSuchElementException success) {}
528      }
529  
530      /**
531 <     *
531 >     * iterator remove throws ISE
532       */
533      public void testIteratorRemove() {
534          SynchronousQueue q = new SynchronousQueue();
535 <        Iterator it = q.iterator();
535 >        Iterator it = q.iterator();
536          try {
537              it.remove();
538              shouldThrow();
539 <        }
443 <        catch (IllegalStateException success) {}
539 >        } catch (IllegalStateException success) {}
540      }
541  
542      /**
543 <     *
543 >     * toString returns a non-null string
544       */
545      public void testToString() {
546          SynchronousQueue q = new SynchronousQueue();
547          String s = q.toString();
548 <        assertTrue(s != null);
549 <    }        
548 >        assertNotNull(s);
549 >    }
550  
551  
552      /**
553 <     *
553 >     * offer transfers elements across Executor tasks
554       */
555      public void testOfferInExecutor() {
556          final SynchronousQueue q = new SynchronousQueue();
557          ExecutorService executor = Executors.newFixedThreadPool(2);
462        final Integer one = new Integer(1);
558  
559 <        executor.execute(new Runnable() {
560 <            public void run() {
561 <                threadAssertFalse(q.offer(one));
562 <                try {
563 <                    threadAssertTrue(q.offer(one, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
564 <                    threadAssertEquals(0, q.remainingCapacity());
565 <                }
566 <                catch (InterruptedException e) {
567 <                    threadUnexpectedException();
568 <                }
569 <            }
570 <        });
559 >        executor.execute(new CheckedRunnable() {
560 >            public void realRun() throws InterruptedException {
561 >                assertFalse(q.offer(one));
562 >                assertTrue(q.offer(one, MEDIUM_DELAY_MS, MILLISECONDS));
563 >                assertEquals(0, q.remainingCapacity());
564 >            }});
565 >
566 >        executor.execute(new CheckedRunnable() {
567 >            public void realRun() throws InterruptedException {
568 >                Thread.sleep(SMALL_DELAY_MS);
569 >                assertSame(one, q.take());
570 >            }});
571  
477        executor.execute(new Runnable() {
478            public void run() {
479                try {
480                    Thread.sleep(SMALL_DELAY_MS);
481                    threadAssertEquals(one, q.take());
482                }
483                catch (InterruptedException e) {
484                    threadUnexpectedException();
485                }
486            }
487        });
488        
572          joinPool(executor);
490
573      }
574  
575      /**
576 <     *
576 >     * poll retrieves elements across Executor threads
577       */
578      public void testPollInExecutor() {
497
579          final SynchronousQueue q = new SynchronousQueue();
499
580          ExecutorService executor = Executors.newFixedThreadPool(2);
581 +        executor.execute(new CheckedRunnable() {
582 +            public void realRun() throws InterruptedException {
583 +                assertNull(q.poll());
584 +                assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
585 +                assertTrue(q.isEmpty());
586 +            }});
587 +
588 +        executor.execute(new CheckedRunnable() {
589 +            public void realRun() throws InterruptedException {
590 +                Thread.sleep(SHORT_DELAY_MS);
591 +                q.put(one);
592 +            }});
593  
502        executor.execute(new Runnable() {
503            public void run() {
504                threadAssertNull(q.poll());
505                try {
506                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
507                    threadAssertTrue(q.isEmpty());
508                }
509                catch (InterruptedException e) {
510                    threadUnexpectedException();
511                }
512            }
513        });
514
515        executor.execute(new Runnable() {
516            public void run() {
517                try {
518                    Thread.sleep(SMALL_DELAY_MS);
519                    q.put(new Integer(1));
520                }
521                catch (InterruptedException e) {
522                    threadUnexpectedException();
523                }
524            }
525        });
526        
594          joinPool(executor);
595 +    }
596 +
597 +    /**
598 +     * a deserialized serialized queue is usable
599 +     */
600 +    public void testSerialization() throws Exception {
601 +        SynchronousQueue q = new SynchronousQueue();
602 +        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
603 +        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
604 +        out.writeObject(q);
605 +        out.close();
606  
607 +        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
608 +        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
609 +        SynchronousQueue r = (SynchronousQueue)in.readObject();
610 +        assertEquals(q.size(), r.size());
611 +        while (!q.isEmpty())
612 +            assertEquals(q.remove(), r.remove());
613      }
614  
615      /**
616 <     *
616 >     * drainTo(null) throws NPE
617       */
618 <    public void testSerialization() {
618 >    public void testDrainToNull() {
619          SynchronousQueue q = new SynchronousQueue();
620          try {
621 <            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
622 <            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
623 <            out.writeObject(q);
624 <            out.close();
625 <
626 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
627 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
628 <            SynchronousQueue r = (SynchronousQueue)in.readObject();
629 <            assertEquals(q.size(), r.size());
630 <            while (!q.isEmpty())
631 <                assertEquals(q.remove(), r.remove());
632 <        } catch(Exception e){
633 <            unexpectedException();
634 <        }
621 >            q.drainTo(null);
622 >            shouldThrow();
623 >        } catch (NullPointerException success) {}
624 >    }
625 >
626 >    /**
627 >     * drainTo(this) throws IAE
628 >     */
629 >    public void testDrainToSelf() {
630 >        SynchronousQueue q = new SynchronousQueue();
631 >        try {
632 >            q.drainTo(q);
633 >            shouldThrow();
634 >        } catch (IllegalArgumentException success) {}
635 >    }
636 >
637 >    /**
638 >     * drainTo(c) of empty queue doesn't transfer elements
639 >     */
640 >    public void testDrainTo() {
641 >        SynchronousQueue q = new SynchronousQueue();
642 >        ArrayList l = new ArrayList();
643 >        q.drainTo(l);
644 >        assertEquals(q.size(), 0);
645 >        assertEquals(l.size(), 0);
646 >    }
647 >
648 >    /**
649 >     * drainTo empties queue, unblocking a waiting put.
650 >     */
651 >    public void testDrainToWithActivePut() throws InterruptedException {
652 >        final SynchronousQueue q = new SynchronousQueue();
653 >        Thread t = new Thread(new CheckedRunnable() {
654 >            public void realRun() throws InterruptedException {
655 >                q.put(new Integer(1));
656 >            }});
657 >
658 >        t.start();
659 >        ArrayList l = new ArrayList();
660 >        Thread.sleep(SHORT_DELAY_MS);
661 >        q.drainTo(l);
662 >        assertTrue(l.size() <= 1);
663 >        if (l.size() > 0)
664 >            assertEquals(l.get(0), new Integer(1));
665 >        t.join();
666 >        assertTrue(l.size() <= 1);
667 >    }
668 >
669 >    /**
670 >     * drainTo(null, n) throws NPE
671 >     */
672 >    public void testDrainToNullN() {
673 >        SynchronousQueue q = new SynchronousQueue();
674 >        try {
675 >            q.drainTo(null, 0);
676 >            shouldThrow();
677 >        } catch (NullPointerException success) {}
678 >    }
679 >
680 >    /**
681 >     * drainTo(this, n) throws IAE
682 >     */
683 >    public void testDrainToSelfN() {
684 >        SynchronousQueue q = new SynchronousQueue();
685 >        try {
686 >            q.drainTo(q, 0);
687 >            shouldThrow();
688 >        } catch (IllegalArgumentException success) {}
689 >    }
690 >
691 >    /**
692 >     * drainTo(c, n) empties up to n elements of queue into c
693 >     */
694 >    public void testDrainToN() throws InterruptedException {
695 >        final SynchronousQueue q = new SynchronousQueue();
696 >        Thread t1 = new Thread(new CheckedRunnable() {
697 >            public void realRun() throws InterruptedException {
698 >                q.put(one);
699 >            }});
700 >
701 >        Thread t2 = new Thread(new CheckedRunnable() {
702 >            public void realRun() throws InterruptedException {
703 >                q.put(two);
704 >            }});
705 >
706 >        t1.start();
707 >        t2.start();
708 >        ArrayList l = new ArrayList();
709 >        Thread.sleep(SHORT_DELAY_MS);
710 >        q.drainTo(l, 1);
711 >        assertEquals(1, l.size());
712 >        q.drainTo(l, 1);
713 >        assertEquals(2, l.size());
714 >        assertTrue(l.contains(one));
715 >        assertTrue(l.contains(two));
716 >        t1.join();
717 >        t2.join();
718      }
719  
720   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines