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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines