ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/SynchronousQueueTest.java
Revision: 1.22
Committed: Wed Aug 25 01:44:48 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +1 -0 lines
Log Message:
whitespace

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/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());
19 }
20
21 public static Test suite() {
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());
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(zero));
45 }
46
47 /**
48 * offer(null) throws NPE
49 */
50 public void testOfferNull() {
51 try {
52 SynchronousQueue q = new SynchronousQueue();
53 q.offer(null);
54 shouldThrow();
55 } catch (NullPointerException success) {}
56 }
57
58 /**
59 * add(null) throws NPE
60 */
61 public void testAddNull() {
62 try {
63 SynchronousQueue q = new SynchronousQueue();
64 q.add(null);
65 shouldThrow();
66 } catch (NullPointerException success) {}
67 }
68
69 /**
70 * offer fails if no active taker
71 */
72 public void testOffer() {
73 SynchronousQueue q = new SynchronousQueue();
74 assertFalse(q.offer(one));
75 }
76
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(one);
85 shouldThrow();
86 } catch (IllegalStateException success) {}
87 }
88
89 /**
90 * addAll(null) throws NPE
91 */
92 public void testAddAll1() {
93 try {
94 SynchronousQueue q = new SynchronousQueue();
95 q.addAll(null);
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
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[1];
118 q.addAll(Arrays.asList(ints));
119 shouldThrow();
120 } catch (NullPointerException success) {}
121 }
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[1];
130 for (int i = 0; i < 1; ++i)
131 ints[i] = new Integer(i);
132 q.addAll(Arrays.asList(ints));
133 shouldThrow();
134 } catch (IllegalStateException success) {}
135 }
136
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 shouldThrow();
145 } catch (NullPointerException success) {}
146 }
147
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 /**
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 CheckedRunnable() {
170 public void realRun() throws InterruptedException {
171 int added = 0;
172 try {
173 while (true) {
174 q.put(added);
175 ++added;
176 }
177 } catch (InterruptedException success) {
178 assertTrue(added == 1);
179 }
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 /**
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 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 /**
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 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 assertTrue(added == 1);
256 }
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 /**
302 * poll fails unless active taker
303 */
304 public void testPoll() {
305 SynchronousQueue q = new SynchronousQueue();
306 assertNull(q.poll());
307 }
308
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 /**
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 /**
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 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 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
351 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
352 try {
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 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 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
391 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
392 try {
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());
412 }
413
414 /**
415 * element throws NSEE
416 */
417 public void testElement() {
418 SynchronousQueue q = new SynchronousQueue();
419 try {
420 q.element();
421 shouldThrow();
422 } catch (NoSuchElementException success) {}
423 }
424
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 shouldThrow();
433 } catch (NoSuchElementException success) {}
434 }
435
436 /**
437 * remove(x) returns false
438 */
439 public void testRemoveElement() {
440 SynchronousQueue q = new SynchronousQueue();
441 assertFalse(q.remove(zero));
442 assertTrue(q.isEmpty());
443 }
444
445 /**
446 * contains returns false
447 */
448 public void testContains() {
449 SynchronousQueue q = new SynchronousQueue();
450 assertFalse(q.contains(zero));
451 }
452
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 /**
463 * containsAll returns false unless empty
464 */
465 public void testContainsAll() {
466 SynchronousQueue q = new SynchronousQueue();
467 Integer[] empty = new Integer[0];
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 /**
474 * retainAll returns false
475 */
476 public void testRetainAll() {
477 SynchronousQueue q = new SynchronousQueue();
478 Integer[] empty = new Integer[0];
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 /**
485 * removeAll returns false
486 */
487 public void testRemoveAll() {
488 SynchronousQueue q = new SynchronousQueue();
489 Integer[] empty = new Integer[0];
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 /**
497 * toArray is empty
498 */
499 public void testToArray() {
500 SynchronousQueue q = new SynchronousQueue();
501 Object[] o = q.toArray();
502 assertEquals(o.length, 0);
503 }
504
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];
511 assertNull(ints[0]);
512 }
513
514 /**
515 * toArray(null) throws NPE
516 */
517 public void testToArray_BadArg() {
518 SynchronousQueue q = new SynchronousQueue();
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 shouldThrow();
536 } catch (NoSuchElementException success) {}
537 }
538
539 /**
540 * iterator remove throws ISE
541 */
542 public void testIteratorRemove() {
543 SynchronousQueue q = new SynchronousQueue();
544 Iterator it = q.iterator();
545 try {
546 it.remove();
547 shouldThrow();
548 } catch (IllegalStateException success) {}
549 }
550
551 /**
552 * toString returns a non-null string
553 */
554 public void testToString() {
555 SynchronousQueue q = new SynchronousQueue();
556 String s = q.toString();
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);
567
568 executor.execute(new CheckedRunnable() {
569 public void realRun() throws InterruptedException {
570 assertFalse(q.offer(one));
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 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 /**
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 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 /**
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 /**
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 assertTrue(l.size() == 1);
721 q.drainTo(l, 1);
722 assertTrue(l.size() == 2);
723 assertTrue(l.contains(one));
724 assertTrue(l.contains(two));
725 t1.join();
726 t2.join();
727 }
728
729 }