ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/SynchronousQueueTest.java
Revision: 1.19
Committed: Tue Dec 1 06:03:49 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.18: +22 -33 lines
Log Message:
Use MILLISECONDS.toNanos instead of multiplying by 1000*1000; use explicit assertEquals instead of assertTrue(...!= null); improve testPutWithTake

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 * addAll throws ISE if no active taker
124 */
125 public void testAddAll4() {
126 try {
127 SynchronousQueue q = new SynchronousQueue();
128 Integer[] ints = new Integer[1];
129 for (int i = 0; i < 1; ++i)
130 ints[i] = new Integer(i);
131 q.addAll(Arrays.asList(ints));
132 shouldThrow();
133 } catch (IllegalStateException success) {}
134 }
135
136 /**
137 * put(null) throws NPE
138 */
139 public void testPutNull() throws InterruptedException {
140 try {
141 SynchronousQueue q = new SynchronousQueue();
142 q.put(null);
143 shouldThrow();
144 } catch (NullPointerException success) {}
145 }
146
147 /**
148 * put blocks interruptibly if no active taker
149 */
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 * put blocks waiting for take
165 */
166 public void testPutWithTake() throws InterruptedException {
167 final SynchronousQueue q = new SynchronousQueue();
168 Thread t = new Thread(new CheckedRunnable() {
169 public void realRun() throws InterruptedException {
170 int added = 0;
171 try {
172 while (true) {
173 q.put(added);
174 ++added;
175 }
176 } catch (InterruptedException success) {
177 assertTrue(added == 1);
178 }
179 }});
180
181 t.start();
182 Thread.sleep(SHORT_DELAY_MS);
183 assertEquals(0, q.take());
184 Thread.sleep(SHORT_DELAY_MS);
185 t.interrupt();
186 t.join();
187 }
188
189 /**
190 * timed offer times out if elements not taken
191 */
192 public void testTimedOffer() throws InterruptedException {
193 final SynchronousQueue q = new SynchronousQueue();
194 Thread t = new Thread(new CheckedInterruptedRunnable() {
195 public void realRun() throws InterruptedException {
196 assertFalse(q.offer(new Object(), SHORT_DELAY_MS, MILLISECONDS));
197 q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
198 }});
199
200 t.start();
201 Thread.sleep(SMALL_DELAY_MS);
202 t.interrupt();
203 t.join();
204 }
205
206
207 /**
208 * take blocks interruptibly when empty
209 */
210 public void testTakeFromEmpty() throws InterruptedException {
211 final SynchronousQueue q = new SynchronousQueue();
212 Thread t = new Thread(new CheckedInterruptedRunnable() {
213 public void realRun() throws InterruptedException {
214 q.take();
215 }});
216
217 t.start();
218 Thread.sleep(SHORT_DELAY_MS);
219 t.interrupt();
220 t.join();
221 }
222
223
224 /**
225 * put blocks interruptibly if no active taker
226 */
227 public void testFairBlockingPut() throws InterruptedException {
228 Thread t = new Thread(new CheckedInterruptedRunnable() {
229 public void realRun() throws InterruptedException {
230 SynchronousQueue q = new SynchronousQueue(true);
231 q.put(zero);
232 }});
233
234 t.start();
235 Thread.sleep(SHORT_DELAY_MS);
236 t.interrupt();
237 t.join();
238 }
239
240 /**
241 * put blocks waiting for take
242 */
243 public void testFairPutWithTake() throws InterruptedException {
244 final SynchronousQueue q = new SynchronousQueue(true);
245 Thread t = new Thread(new CheckedRunnable() {
246 public void realRun() throws InterruptedException {
247 int added = 0;
248 try {
249 while (true) {
250 q.put(added);
251 ++added;
252 }
253 } catch (InterruptedException success) {
254 assertTrue(added == 1);
255 }
256 }});
257
258 t.start();
259 Thread.sleep(SHORT_DELAY_MS);
260 assertEquals(0, q.take());
261 Thread.sleep(SHORT_DELAY_MS);
262 t.interrupt();
263 t.join();
264 }
265
266 /**
267 * timed offer times out if elements not taken
268 */
269 public void testFairTimedOffer() throws InterruptedException {
270 final SynchronousQueue q = new SynchronousQueue(true);
271 Thread t = new Thread(new CheckedInterruptedRunnable() {
272 public void realRun() throws InterruptedException {
273 assertFalse(q.offer(new Object(), SHORT_DELAY_MS, MILLISECONDS));
274 q.offer(new Object(), LONG_DELAY_MS, MILLISECONDS);
275 }});
276
277 t.start();
278 Thread.sleep(SMALL_DELAY_MS);
279 t.interrupt();
280 t.join();
281 }
282
283
284 /**
285 * take blocks interruptibly when empty
286 */
287 public void testFairTakeFromEmpty() throws InterruptedException {
288 final SynchronousQueue q = new SynchronousQueue(true);
289 Thread t = new Thread(new CheckedInterruptedRunnable() {
290 public void realRun() throws InterruptedException {
291 q.take();
292 }});
293
294 t.start();
295 Thread.sleep(SHORT_DELAY_MS);
296 t.interrupt();
297 t.join();
298 }
299
300 /**
301 * poll fails unless active taker
302 */
303 public void testPoll() {
304 SynchronousQueue q = new SynchronousQueue();
305 assertNull(q.poll());
306 }
307
308 /**
309 * timed pool with zero timeout times out if no active taker
310 */
311 public void testTimedPoll0() throws InterruptedException {
312 SynchronousQueue q = new SynchronousQueue();
313 assertNull(q.poll(0, MILLISECONDS));
314 }
315
316 /**
317 * timed pool with nonzero timeout times out if no active taker
318 */
319 public void testTimedPoll() throws InterruptedException {
320 SynchronousQueue q = new SynchronousQueue();
321 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
322 }
323
324 /**
325 * Interrupted timed poll throws InterruptedException instead of
326 * returning timeout status
327 */
328 public void testInterruptedTimedPoll() throws InterruptedException {
329 final SynchronousQueue q = new SynchronousQueue();
330 Thread t = new Thread(new CheckedInterruptedRunnable() {
331 public void realRun() throws InterruptedException {
332 q.poll(SMALL_DELAY_MS, MILLISECONDS);
333 }});
334
335 t.start();
336 Thread.sleep(SHORT_DELAY_MS);
337 t.interrupt();
338 t.join();
339 }
340
341 /**
342 * timed poll before a delayed offer fails; after offer succeeds;
343 * on interruption throws
344 */
345 public void testTimedPollWithOffer() throws InterruptedException {
346 final SynchronousQueue q = new SynchronousQueue();
347 Thread t = new Thread(new CheckedRunnable() {
348 public void realRun() throws InterruptedException {
349 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
350 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
351 try {
352 q.poll(LONG_DELAY_MS, MILLISECONDS);
353 shouldThrow();
354 } catch (InterruptedException success) {}
355 }});
356
357 t.start();
358 Thread.sleep(SMALL_DELAY_MS);
359 assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
360 t.interrupt();
361 t.join();
362 }
363
364 /**
365 * Interrupted timed poll throws InterruptedException instead of
366 * returning timeout status
367 */
368 public void testFairInterruptedTimedPoll() throws InterruptedException {
369 Thread t = new Thread(new CheckedInterruptedRunnable() {
370 public void realRun() throws InterruptedException {
371 SynchronousQueue q = new SynchronousQueue(true);
372 q.poll(SMALL_DELAY_MS, MILLISECONDS);
373 }});
374
375 t.start();
376 Thread.sleep(SHORT_DELAY_MS);
377 t.interrupt();
378 t.join();
379 }
380
381 /**
382 * timed poll before a delayed offer fails; after offer succeeds;
383 * on interruption throws
384 */
385 public void testFairTimedPollWithOffer() throws InterruptedException {
386 final SynchronousQueue q = new SynchronousQueue(true);
387 Thread t = new Thread(new CheckedRunnable() {
388 public void realRun() throws InterruptedException {
389 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
390 assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
391 try {
392 q.poll(LONG_DELAY_MS, MILLISECONDS);
393 threadShouldThrow();
394 } catch (InterruptedException success) {}
395 }});
396
397 t.start();
398 Thread.sleep(SMALL_DELAY_MS);
399 assertTrue(q.offer(zero, SHORT_DELAY_MS, MILLISECONDS));
400 t.interrupt();
401 t.join();
402 }
403
404
405 /**
406 * peek returns null
407 */
408 public void testPeek() {
409 SynchronousQueue q = new SynchronousQueue();
410 assertNull(q.peek());
411 }
412
413 /**
414 * element throws NSEE
415 */
416 public void testElement() {
417 SynchronousQueue q = new SynchronousQueue();
418 try {
419 q.element();
420 shouldThrow();
421 } catch (NoSuchElementException success) {}
422 }
423
424 /**
425 * remove throws NSEE if no active taker
426 */
427 public void testRemove() {
428 SynchronousQueue q = new SynchronousQueue();
429 try {
430 q.remove();
431 shouldThrow();
432 } catch (NoSuchElementException success) {}
433 }
434
435 /**
436 * remove(x) returns false
437 */
438 public void testRemoveElement() {
439 SynchronousQueue q = new SynchronousQueue();
440 assertFalse(q.remove(zero));
441 assertTrue(q.isEmpty());
442 }
443
444 /**
445 * contains returns false
446 */
447 public void testContains() {
448 SynchronousQueue q = new SynchronousQueue();
449 assertFalse(q.contains(zero));
450 }
451
452 /**
453 * clear ensures isEmpty
454 */
455 public void testClear() {
456 SynchronousQueue q = new SynchronousQueue();
457 q.clear();
458 assertTrue(q.isEmpty());
459 }
460
461 /**
462 * containsAll returns false unless empty
463 */
464 public void testContainsAll() {
465 SynchronousQueue q = new SynchronousQueue();
466 Integer[] empty = new Integer[0];
467 assertTrue(q.containsAll(Arrays.asList(empty)));
468 Integer[] ints = new Integer[1]; ints[0] = zero;
469 assertFalse(q.containsAll(Arrays.asList(ints)));
470 }
471
472 /**
473 * retainAll returns false
474 */
475 public void testRetainAll() {
476 SynchronousQueue q = new SynchronousQueue();
477 Integer[] empty = new Integer[0];
478 assertFalse(q.retainAll(Arrays.asList(empty)));
479 Integer[] ints = new Integer[1]; ints[0] = zero;
480 assertFalse(q.retainAll(Arrays.asList(ints)));
481 }
482
483 /**
484 * removeAll returns false
485 */
486 public void testRemoveAll() {
487 SynchronousQueue q = new SynchronousQueue();
488 Integer[] empty = new Integer[0];
489 assertFalse(q.removeAll(Arrays.asList(empty)));
490 Integer[] ints = new Integer[1]; ints[0] = zero;
491 assertFalse(q.containsAll(Arrays.asList(ints)));
492 }
493
494
495 /**
496 * toArray is empty
497 */
498 public void testToArray() {
499 SynchronousQueue q = new SynchronousQueue();
500 Object[] o = q.toArray();
501 assertEquals(o.length, 0);
502 }
503
504 /**
505 * toArray(a) is nulled at position 0
506 */
507 public void testToArray2() {
508 SynchronousQueue q = new SynchronousQueue();
509 Integer[] ints = new Integer[1];
510 assertNull(ints[0]);
511 }
512
513 /**
514 * toArray(null) throws NPE
515 */
516 public void testToArray_BadArg() {
517 SynchronousQueue q = new SynchronousQueue();
518 try {
519 Object o[] = q.toArray(null);
520 shouldThrow();
521 } catch (NullPointerException success) {}
522 }
523
524
525 /**
526 * iterator does not traverse any elements
527 */
528 public void testIterator() {
529 SynchronousQueue q = new SynchronousQueue();
530 Iterator it = q.iterator();
531 assertFalse(it.hasNext());
532 try {
533 Object x = it.next();
534 shouldThrow();
535 } catch (NoSuchElementException success) {}
536 }
537
538 /**
539 * iterator remove throws ISE
540 */
541 public void testIteratorRemove() {
542 SynchronousQueue q = new SynchronousQueue();
543 Iterator it = q.iterator();
544 try {
545 it.remove();
546 shouldThrow();
547 } catch (IllegalStateException success) {}
548 }
549
550 /**
551 * toString returns a non-null string
552 */
553 public void testToString() {
554 SynchronousQueue q = new SynchronousQueue();
555 String s = q.toString();
556 assertNotNull(s);
557 }
558
559
560 /**
561 * offer transfers elements across Executor tasks
562 */
563 public void testOfferInExecutor() {
564 final SynchronousQueue q = new SynchronousQueue();
565 ExecutorService executor = Executors.newFixedThreadPool(2);
566
567 executor.execute(new CheckedRunnable() {
568 public void realRun() throws InterruptedException {
569 assertFalse(q.offer(one));
570 assertTrue(q.offer(one, MEDIUM_DELAY_MS, MILLISECONDS));
571 assertEquals(0, q.remainingCapacity());
572 }});
573
574 executor.execute(new CheckedRunnable() {
575 public void realRun() throws InterruptedException {
576 Thread.sleep(SMALL_DELAY_MS);
577 assertSame(one, q.take());
578 }});
579
580 joinPool(executor);
581
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 }