ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/SynchronousQueueTest.java
Revision: 1.58
Committed: Sun May 14 04:02:06 2017 UTC (7 years ago) by jsr166
Branch: MAIN
Changes since 1.57: +7 -0 lines
Log Message:
improve testPutWithTake

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.7 * 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 jsr166 1.31 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.10 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.44 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.util.ArrayList;
12 jsr166 1.37 import java.util.Arrays;
13     import java.util.Collection;
14     import java.util.Iterator;
15     import java.util.NoSuchElementException;
16     import java.util.concurrent.BlockingQueue;
17     import java.util.concurrent.CountDownLatch;
18     import java.util.concurrent.Executors;
19     import java.util.concurrent.ExecutorService;
20     import java.util.concurrent.SynchronousQueue;
21 jsr166 1.57 import java.util.concurrent.ThreadLocalRandom;
22 jsr166 1.44
23     import junit.framework.Test;
24 dl 1.1
25 dl 1.3 public class SynchronousQueueTest extends JSR166TestCase {
26 dl 1.1
27 jsr166 1.25 public static class Fair extends BlockingQueueTest {
28     protected BlockingQueue emptyCollection() {
29     return new SynchronousQueue(true);
30     }
31     }
32    
33     public static class NonFair extends BlockingQueueTest {
34     protected BlockingQueue emptyCollection() {
35     return new SynchronousQueue(false);
36     }
37     }
38    
39 dl 1.1 public static void main(String[] args) {
40 jsr166 1.47 main(suite(), args);
41 dl 1.1 }
42    
43     public static Test suite() {
44 jsr166 1.25 return newTestSuite(SynchronousQueueTest.class,
45     new Fair().testSuite(),
46     new NonFair().testSuite());
47 dl 1.1 }
48    
49 dl 1.4 /**
50 jsr166 1.29 * Any SynchronousQueue is both empty and full
51 dl 1.4 */
52 jsr166 1.35 public void testEmptyFull() { testEmptyFull(false); }
53     public void testEmptyFull_fair() { testEmptyFull(true); }
54     public void testEmptyFull(boolean fair) {
55     final SynchronousQueue q = new SynchronousQueue(fair);
56 dl 1.1 assertTrue(q.isEmpty());
57 jsr166 1.14 assertEquals(0, q.size());
58 dl 1.1 assertEquals(0, q.remainingCapacity());
59 dl 1.5 assertFalse(q.offer(zero));
60 dl 1.1 }
61    
62 dl 1.4 /**
63 dl 1.5 * offer fails if no active taker
64 dl 1.4 */
65 jsr166 1.36 public void testOffer() { testOffer(false); }
66     public void testOffer_fair() { testOffer(true); }
67     public void testOffer(boolean fair) {
68     SynchronousQueue q = new SynchronousQueue(fair);
69 dl 1.5 assertFalse(q.offer(one));
70 dl 1.1 }
71    
72 dl 1.4 /**
73 jsr166 1.36 * add throws IllegalStateException if no active taker
74 dl 1.4 */
75 jsr166 1.36 public void testAdd() { testAdd(false); }
76     public void testAdd_fair() { testAdd(true); }
77     public void testAdd(boolean fair) {
78     SynchronousQueue q = new SynchronousQueue(fair);
79     assertEquals(0, q.remainingCapacity());
80 jsr166 1.14 try {
81 dl 1.5 q.add(one);
82     shouldThrow();
83 jsr166 1.13 } catch (IllegalStateException success) {}
84 dl 1.1 }
85    
86 dl 1.4 /**
87 jsr166 1.36 * addAll(this) throws IllegalArgumentException
88 dl 1.6 */
89 jsr166 1.36 public void testAddAll_self() { testAddAll_self(false); }
90     public void testAddAll_self_fair() { testAddAll_self(true); }
91     public void testAddAll_self(boolean fair) {
92     SynchronousQueue q = new SynchronousQueue(fair);
93 dl 1.6 try {
94     q.addAll(q);
95     shouldThrow();
96 jsr166 1.13 } catch (IllegalArgumentException success) {}
97 dl 1.6 }
98    
99 dl 1.4 /**
100 dl 1.5 * addAll throws ISE if no active taker
101 dl 1.4 */
102 jsr166 1.36 public void testAddAll_ISE() { testAddAll_ISE(false); }
103     public void testAddAll_ISE_fair() { testAddAll_ISE(true); }
104     public void testAddAll_ISE(boolean fair) {
105     SynchronousQueue q = new SynchronousQueue(fair);
106     Integer[] ints = new Integer[1];
107     for (int i = 0; i < ints.length; i++)
108     ints[i] = i;
109     Collection<Integer> coll = Arrays.asList(ints);
110 dl 1.1 try {
111 jsr166 1.36 q.addAll(coll);
112 dl 1.4 shouldThrow();
113 jsr166 1.13 } catch (IllegalStateException success) {}
114 dl 1.1 }
115    
116 dl 1.4 /**
117 dl 1.5 * put blocks interruptibly if no active taker
118 dl 1.4 */
119 jsr166 1.35 public void testBlockingPut() { testBlockingPut(false); }
120     public void testBlockingPut_fair() { testBlockingPut(true); }
121     public void testBlockingPut(boolean fair) {
122     final SynchronousQueue q = new SynchronousQueue(fair);
123     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
124     Thread t = newStartedThread(new CheckedRunnable() {
125 jsr166 1.14 public void realRun() throws InterruptedException {
126 jsr166 1.35 Thread.currentThread().interrupt();
127     try {
128     q.put(99);
129     shouldThrow();
130     } catch (InterruptedException success) {}
131     assertFalse(Thread.interrupted());
132    
133     pleaseInterrupt.countDown();
134     try {
135     q.put(99);
136     shouldThrow();
137     } catch (InterruptedException success) {}
138     assertFalse(Thread.interrupted());
139 jsr166 1.13 }});
140    
141 jsr166 1.35 await(pleaseInterrupt);
142 jsr166 1.54 assertThreadBlocks(t, Thread.State.WAITING);
143 jsr166 1.13 t.interrupt();
144 jsr166 1.35 awaitTermination(t);
145     assertEquals(0, q.remainingCapacity());
146 dl 1.1 }
147    
148 dl 1.4 /**
149 jsr166 1.35 * put blocks interruptibly waiting for take
150 dl 1.4 */
151 jsr166 1.35 public void testPutWithTake() { testPutWithTake(false); }
152     public void testPutWithTake_fair() { testPutWithTake(true); }
153     public void testPutWithTake(boolean fair) {
154     final SynchronousQueue q = new SynchronousQueue(fair);
155     final CountDownLatch pleaseTake = new CountDownLatch(1);
156     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
157     Thread t = newStartedThread(new CheckedRunnable() {
158 jsr166 1.14 public void realRun() throws InterruptedException {
159 jsr166 1.35 pleaseTake.countDown();
160     q.put(one);
161    
162 jsr166 1.58 Thread.currentThread().interrupt();
163     try {
164     q.put(99);
165     shouldThrow();
166     } catch (InterruptedException success) {}
167     assertFalse(Thread.interrupted());
168    
169 jsr166 1.35 pleaseInterrupt.countDown();
170 jsr166 1.13 try {
171 jsr166 1.35 q.put(99);
172     shouldThrow();
173     } catch (InterruptedException success) {}
174     assertFalse(Thread.interrupted());
175 jsr166 1.13 }});
176    
177 jsr166 1.35 await(pleaseTake);
178 jsr166 1.40 assertEquals(0, q.remainingCapacity());
179 jsr166 1.35 try { assertSame(one, q.take()); }
180     catch (InterruptedException e) { threadUnexpectedException(e); }
181    
182     await(pleaseInterrupt);
183 jsr166 1.53 assertThreadBlocks(t, Thread.State.WAITING);
184 jsr166 1.13 t.interrupt();
185 jsr166 1.35 awaitTermination(t);
186 jsr166 1.40 assertEquals(0, q.remainingCapacity());
187 dl 1.1 }
188    
189 dl 1.4 /**
190 dl 1.5 * timed offer times out if elements not taken
191 dl 1.4 */
192 jsr166 1.57 public void testTimedOffer() {
193     final boolean fair = ThreadLocalRandom.current().nextBoolean();
194 jsr166 1.35 final SynchronousQueue q = new SynchronousQueue(fair);
195 jsr166 1.29 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
196     Thread t = newStartedThread(new CheckedRunnable() {
197 jsr166 1.14 public void realRun() throws InterruptedException {
198 jsr166 1.34 long startTime = System.nanoTime();
199     assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
200     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
201 jsr166 1.29 pleaseInterrupt.countDown();
202     try {
203 jsr166 1.34 q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
204 jsr166 1.29 shouldThrow();
205     } catch (InterruptedException success) {}
206 jsr166 1.56 assertFalse(Thread.interrupted());
207 jsr166 1.13 }});
208 jsr166 1.10
209 jsr166 1.34 await(pleaseInterrupt);
210 jsr166 1.54 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
211 jsr166 1.13 t.interrupt();
212 jsr166 1.34 awaitTermination(t);
213 jsr166 1.29 }
214    
215     /**
216     * poll return null if no active putter
217 dl 1.4 */
218 jsr166 1.36 public void testPoll() { testPoll(false); }
219     public void testPoll_fair() { testPoll(true); }
220     public void testPoll(boolean fair) {
221     final SynchronousQueue q = new SynchronousQueue(fair);
222 jsr166 1.14 assertNull(q.poll());
223 dl 1.1 }
224    
225 dl 1.4 /**
226 jsr166 1.29 * timed poll with zero timeout times out if no active putter
227 dl 1.4 */
228 jsr166 1.36 public void testTimedPoll0() { testTimedPoll0(false); }
229     public void testTimedPoll0_fair() { testTimedPoll0(true); }
230     public void testTimedPoll0(boolean fair) {
231     final SynchronousQueue q = new SynchronousQueue(fair);
232     try { assertNull(q.poll(0, MILLISECONDS)); }
233     catch (InterruptedException e) { threadUnexpectedException(e); }
234 dl 1.1 }
235    
236 dl 1.4 /**
237 jsr166 1.29 * timed poll with nonzero timeout times out if no active putter
238 dl 1.4 */
239 jsr166 1.57 public void testTimedPoll() {
240     final boolean fair = ThreadLocalRandom.current().nextBoolean();
241 jsr166 1.36 final SynchronousQueue q = new SynchronousQueue(fair);
242 jsr166 1.57 final long startTime = System.nanoTime();
243 jsr166 1.36 try { assertNull(q.poll(timeoutMillis(), MILLISECONDS)); }
244     catch (InterruptedException e) { threadUnexpectedException(e); }
245 jsr166 1.35 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
246 dl 1.8 }
247    
248     /**
249 jsr166 1.29 * timed poll before a delayed offer times out, returning null;
250     * after offer succeeds; on interruption throws
251 dl 1.8 */
252 jsr166 1.57 public void testTimedPollWithOffer() {
253     final boolean fair = ThreadLocalRandom.current().nextBoolean();
254 jsr166 1.36 final SynchronousQueue q = new SynchronousQueue(fair);
255 jsr166 1.29 final CountDownLatch pleaseOffer = new CountDownLatch(1);
256 jsr166 1.36 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
257 jsr166 1.29 Thread t = newStartedThread(new CheckedRunnable() {
258 jsr166 1.14 public void realRun() throws InterruptedException {
259 jsr166 1.36 long startTime = System.nanoTime();
260     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
261     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
262 jsr166 1.29
263     pleaseOffer.countDown();
264 jsr166 1.36 startTime = System.nanoTime();
265 jsr166 1.29 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
266    
267 jsr166 1.36 Thread.currentThread().interrupt();
268 jsr166 1.13 try {
269     q.poll(LONG_DELAY_MS, MILLISECONDS);
270 jsr166 1.29 shouldThrow();
271 jsr166 1.13 } catch (InterruptedException success) {}
272 jsr166 1.36 assertFalse(Thread.interrupted());
273    
274     pleaseInterrupt.countDown();
275     try {
276     q.poll(LONG_DELAY_MS, MILLISECONDS);
277     shouldThrow();
278     } catch (InterruptedException success) {}
279     assertFalse(Thread.interrupted());
280 jsr166 1.50
281     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
282 jsr166 1.13 }});
283    
284 jsr166 1.36 await(pleaseOffer);
285     long startTime = System.nanoTime();
286     try { assertTrue(q.offer(zero, LONG_DELAY_MS, MILLISECONDS)); }
287     catch (InterruptedException e) { threadUnexpectedException(e); }
288 jsr166 1.50 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
289 jsr166 1.30
290 jsr166 1.36 await(pleaseInterrupt);
291 jsr166 1.55 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
292 jsr166 1.13 t.interrupt();
293 jsr166 1.36 awaitTermination(t);
294 jsr166 1.10 }
295 dl 1.1
296 dl 1.4 /**
297 jsr166 1.29 * peek() returns null if no active putter
298 dl 1.4 */
299 jsr166 1.36 public void testPeek() { testPeek(false); }
300     public void testPeek_fair() { testPeek(true); }
301     public void testPeek(boolean fair) {
302     final SynchronousQueue q = new SynchronousQueue(fair);
303 jsr166 1.14 assertNull(q.peek());
304 dl 1.1 }
305    
306 dl 1.4 /**
307 jsr166 1.36 * element() throws NoSuchElementException if no active putter
308 dl 1.4 */
309 jsr166 1.36 public void testElement() { testElement(false); }
310     public void testElement_fair() { testElement(true); }
311     public void testElement(boolean fair) {
312     final SynchronousQueue q = new SynchronousQueue(fair);
313 dl 1.1 try {
314     q.element();
315 dl 1.4 shouldThrow();
316 jsr166 1.13 } catch (NoSuchElementException success) {}
317 dl 1.1 }
318    
319 dl 1.4 /**
320 jsr166 1.36 * remove() throws NoSuchElementException if no active putter
321 dl 1.4 */
322 jsr166 1.36 public void testRemove() { testRemove(false); }
323     public void testRemove_fair() { testRemove(true); }
324     public void testRemove(boolean fair) {
325     final SynchronousQueue q = new SynchronousQueue(fair);
326 dl 1.1 try {
327     q.remove();
328 dl 1.4 shouldThrow();
329 jsr166 1.16 } catch (NoSuchElementException success) {}
330 dl 1.1 }
331    
332 dl 1.4 /**
333 dl 1.5 * contains returns false
334 dl 1.4 */
335 jsr166 1.36 public void testContains() { testContains(false); }
336     public void testContains_fair() { testContains(true); }
337     public void testContains(boolean fair) {
338     final SynchronousQueue q = new SynchronousQueue(fair);
339 dl 1.5 assertFalse(q.contains(zero));
340 dl 1.1 }
341    
342 dl 1.4 /**
343 dl 1.5 * clear ensures isEmpty
344 dl 1.4 */
345 jsr166 1.36 public void testClear() { testClear(false); }
346     public void testClear_fair() { testClear(true); }
347     public void testClear(boolean fair) {
348     final SynchronousQueue q = new SynchronousQueue(fair);
349 dl 1.1 q.clear();
350     assertTrue(q.isEmpty());
351     }
352    
353 dl 1.4 /**
354 dl 1.5 * containsAll returns false unless empty
355 dl 1.4 */
356 jsr166 1.36 public void testContainsAll() { testContainsAll(false); }
357     public void testContainsAll_fair() { testContainsAll(true); }
358     public void testContainsAll(boolean fair) {
359     final SynchronousQueue q = new SynchronousQueue(fair);
360 dl 1.1 Integer[] empty = new Integer[0];
361 dl 1.5 assertTrue(q.containsAll(Arrays.asList(empty)));
362     Integer[] ints = new Integer[1]; ints[0] = zero;
363 dl 1.1 assertFalse(q.containsAll(Arrays.asList(ints)));
364     }
365    
366 dl 1.4 /**
367 dl 1.5 * retainAll returns false
368 dl 1.4 */
369 jsr166 1.36 public void testRetainAll() { testRetainAll(false); }
370     public void testRetainAll_fair() { testRetainAll(true); }
371     public void testRetainAll(boolean fair) {
372     final SynchronousQueue q = new SynchronousQueue(fair);
373 dl 1.1 Integer[] empty = new Integer[0];
374 dl 1.5 assertFalse(q.retainAll(Arrays.asList(empty)));
375     Integer[] ints = new Integer[1]; ints[0] = zero;
376     assertFalse(q.retainAll(Arrays.asList(ints)));
377 dl 1.1 }
378    
379 dl 1.4 /**
380 dl 1.5 * removeAll returns false
381 dl 1.4 */
382 jsr166 1.36 public void testRemoveAll() { testRemoveAll(false); }
383     public void testRemoveAll_fair() { testRemoveAll(true); }
384     public void testRemoveAll(boolean fair) {
385     final SynchronousQueue q = new SynchronousQueue(fair);
386 dl 1.1 Integer[] empty = new Integer[0];
387 dl 1.5 assertFalse(q.removeAll(Arrays.asList(empty)));
388     Integer[] ints = new Integer[1]; ints[0] = zero;
389 dl 1.1 assertFalse(q.containsAll(Arrays.asList(ints)));
390     }
391    
392 dl 1.4 /**
393 dl 1.5 * toArray is empty
394 dl 1.4 */
395 jsr166 1.36 public void testToArray() { testToArray(false); }
396     public void testToArray_fair() { testToArray(true); }
397     public void testToArray(boolean fair) {
398     final SynchronousQueue q = new SynchronousQueue(fair);
399 jsr166 1.14 Object[] o = q.toArray();
400 jsr166 1.40 assertEquals(0, o.length);
401 dl 1.1 }
402    
403 dl 1.4 /**
404 jsr166 1.40 * toArray(Integer array) returns its argument with the first
405     * element (if present) nulled out
406 dl 1.4 */
407 jsr166 1.36 public void testToArray2() { testToArray2(false); }
408     public void testToArray2_fair() { testToArray2(true); }
409     public void testToArray2(boolean fair) {
410 jsr166 1.51 final SynchronousQueue<Integer> q = new SynchronousQueue<>(fair);
411 jsr166 1.40 Integer[] a;
412    
413     a = new Integer[0];
414     assertSame(a, q.toArray(a));
415 jsr166 1.41
416 jsr166 1.40 a = new Integer[3];
417     Arrays.fill(a, 42);
418     assertSame(a, q.toArray(a));
419     assertNull(a[0]);
420     for (int i = 1; i < a.length; i++)
421     assertEquals(42, (int) a[i]);
422 dl 1.1 }
423 jsr166 1.10
424 dl 1.4 /**
425 dl 1.6 * toArray(null) throws NPE
426     */
427 jsr166 1.36 public void testToArray_null() { testToArray_null(false); }
428     public void testToArray_null_fair() { testToArray_null(true); }
429     public void testToArray_null(boolean fair) {
430     final SynchronousQueue q = new SynchronousQueue(fair);
431 jsr166 1.14 try {
432 jsr166 1.45 Object[] o = q.toArray(null);
433 jsr166 1.14 shouldThrow();
434     } catch (NullPointerException success) {}
435 dl 1.6 }
436    
437     /**
438 dl 1.5 * iterator does not traverse any elements
439 dl 1.4 */
440 jsr166 1.36 public void testIterator() { testIterator(false); }
441     public void testIterator_fair() { testIterator(true); }
442     public void testIterator(boolean fair) {
443 jsr166 1.46 assertIteratorExhausted(new SynchronousQueue(fair).iterator());
444 dl 1.1 }
445    
446 dl 1.4 /**
447 dl 1.5 * iterator remove throws ISE
448 dl 1.4 */
449 jsr166 1.36 public void testIteratorRemove() { testIteratorRemove(false); }
450     public void testIteratorRemove_fair() { testIteratorRemove(true); }
451     public void testIteratorRemove(boolean fair) {
452     final SynchronousQueue q = new SynchronousQueue(fair);
453 jsr166 1.14 Iterator it = q.iterator();
454 dl 1.1 try {
455     it.remove();
456 dl 1.4 shouldThrow();
457 jsr166 1.13 } catch (IllegalStateException success) {}
458 dl 1.1 }
459    
460 dl 1.4 /**
461 dl 1.5 * toString returns a non-null string
462 dl 1.4 */
463 jsr166 1.36 public void testToString() { testToString(false); }
464     public void testToString_fair() { testToString(true); }
465     public void testToString(boolean fair) {
466     final SynchronousQueue q = new SynchronousQueue(fair);
467 dl 1.1 String s = q.toString();
468 dl 1.5 assertNotNull(s);
469 jsr166 1.10 }
470 dl 1.1
471 dl 1.4 /**
472 dl 1.5 * offer transfers elements across Executor tasks
473 dl 1.4 */
474 jsr166 1.36 public void testOfferInExecutor() { testOfferInExecutor(false); }
475     public void testOfferInExecutor_fair() { testOfferInExecutor(true); }
476     public void testOfferInExecutor(boolean fair) {
477     final SynchronousQueue q = new SynchronousQueue(fair);
478 jsr166 1.35 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
479 jsr166 1.49 final ExecutorService executor = Executors.newFixedThreadPool(2);
480     try (PoolCleaner cleaner = cleaner(executor)) {
481 dl 1.1
482 jsr166 1.49 executor.execute(new CheckedRunnable() {
483     public void realRun() throws InterruptedException {
484     assertFalse(q.offer(one));
485     threadsStarted.await();
486     assertTrue(q.offer(one, LONG_DELAY_MS, MILLISECONDS));
487     assertEquals(0, q.remainingCapacity());
488     }});
489    
490     executor.execute(new CheckedRunnable() {
491     public void realRun() throws InterruptedException {
492     threadsStarted.await();
493     assertSame(one, q.take());
494     }});
495     }
496 dl 1.1 }
497    
498 dl 1.4 /**
499 jsr166 1.35 * timed poll retrieves elements across Executor threads
500 dl 1.4 */
501 jsr166 1.36 public void testPollInExecutor() { testPollInExecutor(false); }
502     public void testPollInExecutor_fair() { testPollInExecutor(true); }
503     public void testPollInExecutor(boolean fair) {
504     final SynchronousQueue q = new SynchronousQueue(fair);
505 jsr166 1.35 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
506 jsr166 1.49 final ExecutorService executor = Executors.newFixedThreadPool(2);
507     try (PoolCleaner cleaner = cleaner(executor)) {
508     executor.execute(new CheckedRunnable() {
509     public void realRun() throws InterruptedException {
510     assertNull(q.poll());
511     threadsStarted.await();
512     assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
513     assertTrue(q.isEmpty());
514     }});
515    
516     executor.execute(new CheckedRunnable() {
517     public void realRun() throws InterruptedException {
518     threadsStarted.await();
519     q.put(one);
520     }});
521     }
522 dl 1.2 }
523    
524 dl 1.4 /**
525 dl 1.5 * a deserialized serialized queue is usable
526 dl 1.4 */
527 jsr166 1.40 public void testSerialization() {
528     final SynchronousQueue x = new SynchronousQueue();
529     final SynchronousQueue y = new SynchronousQueue(false);
530     final SynchronousQueue z = new SynchronousQueue(true);
531     assertSerialEquals(x, y);
532     assertNotSerialEquals(x, z);
533     SynchronousQueue[] qs = { x, y, z };
534     for (SynchronousQueue q : qs) {
535     SynchronousQueue clone = serialClone(q);
536 jsr166 1.41 assertNotSame(q, clone);
537 jsr166 1.40 assertSerialEquals(q, clone);
538     assertTrue(clone.isEmpty());
539     assertEquals(0, clone.size());
540     assertEquals(0, clone.remainingCapacity());
541     assertFalse(clone.offer(zero));
542     }
543 dl 1.1 }
544 dl 1.6
545     /**
546     * drainTo(c) of empty queue doesn't transfer elements
547 jsr166 1.10 */
548 jsr166 1.36 public void testDrainTo() { testDrainTo(false); }
549     public void testDrainTo_fair() { testDrainTo(true); }
550     public void testDrainTo(boolean fair) {
551     final SynchronousQueue q = new SynchronousQueue(fair);
552 dl 1.6 ArrayList l = new ArrayList();
553     q.drainTo(l);
554 jsr166 1.40 assertEquals(0, q.size());
555     assertEquals(0, l.size());
556 dl 1.6 }
557    
558     /**
559     * drainTo empties queue, unblocking a waiting put.
560 jsr166 1.10 */
561 jsr166 1.36 public void testDrainToWithActivePut() { testDrainToWithActivePut(false); }
562     public void testDrainToWithActivePut_fair() { testDrainToWithActivePut(true); }
563     public void testDrainToWithActivePut(boolean fair) {
564     final SynchronousQueue q = new SynchronousQueue(fair);
565 jsr166 1.35 Thread t = newStartedThread(new CheckedRunnable() {
566 jsr166 1.14 public void realRun() throws InterruptedException {
567 jsr166 1.35 q.put(one);
568 jsr166 1.13 }});
569    
570     ArrayList l = new ArrayList();
571 jsr166 1.35 long startTime = System.nanoTime();
572     while (l.isEmpty()) {
573     q.drainTo(l);
574     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
575     fail("timed out");
576     Thread.yield();
577     }
578 jsr166 1.52 assertEquals(1, l.size());
579 jsr166 1.35 assertSame(one, l.get(0));
580     awaitTermination(t);
581 dl 1.6 }
582    
583     /**
584     * drainTo(c, n) empties up to n elements of queue into c
585 jsr166 1.10 */
586 jsr166 1.13 public void testDrainToN() throws InterruptedException {
587 dl 1.6 final SynchronousQueue q = new SynchronousQueue();
588 jsr166 1.35 Thread t1 = newStartedThread(new CheckedRunnable() {
589 jsr166 1.14 public void realRun() throws InterruptedException {
590 jsr166 1.13 q.put(one);
591     }});
592    
593 jsr166 1.35 Thread t2 = newStartedThread(new CheckedRunnable() {
594 jsr166 1.14 public void realRun() throws InterruptedException {
595 jsr166 1.13 q.put(two);
596     }});
597 dl 1.6
598 jsr166 1.13 ArrayList l = new ArrayList();
599 jsr166 1.48 int drained;
600     while ((drained = q.drainTo(l, 1)) == 0) Thread.yield();
601     assertEquals(1, drained);
602 jsr166 1.23 assertEquals(1, l.size());
603 jsr166 1.48 while ((drained = q.drainTo(l, 1)) == 0) Thread.yield();
604     assertEquals(1, drained);
605 jsr166 1.23 assertEquals(2, l.size());
606 jsr166 1.13 assertTrue(l.contains(one));
607     assertTrue(l.contains(two));
608 jsr166 1.35 awaitTermination(t1);
609     awaitTermination(t2);
610 dl 1.6 }
611    
612 jsr166 1.42 /**
613     * remove(null), contains(null) always return false
614     */
615     public void testNeverContainsNull() {
616     Collection<?> q = new SynchronousQueue();
617     assertFalse(q.contains(null));
618     assertFalse(q.remove(null));
619     }
620    
621 dl 1.1 }