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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines