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.1 by dl, Sun Aug 31 19:24:55 2003 UTC vs.
Revision 1.24 by dl, Wed Sep 29 12:33:48 2010 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines