ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/SynchronousQueueTest.java
Revision: 1.43
Committed: Wed Dec 31 16:44:02 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.42: +0 -1 lines
Log Message:
remove unused imports

File Contents

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