ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.60
Committed: Fri May 15 18:21:19 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.59: +6 -7 lines
Log Message:
try/catch block scope hygiene

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 John Vint
6 */
7
8 import static java.util.concurrent.TimeUnit.MILLISECONDS;
9
10 import java.util.ArrayList;
11 import java.util.Arrays;
12 import java.util.Collection;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.NoSuchElementException;
16 import java.util.Queue;
17 import java.util.concurrent.BlockingQueue;
18 import java.util.concurrent.CountDownLatch;
19 import java.util.concurrent.Executors;
20 import java.util.concurrent.ExecutorService;
21 import java.util.concurrent.LinkedTransferQueue;
22
23 import junit.framework.Test;
24
25 @SuppressWarnings({"unchecked", "rawtypes"})
26 public class LinkedTransferQueueTest extends JSR166TestCase {
27
28 public static class Generic extends BlockingQueueTest {
29 protected BlockingQueue emptyCollection() {
30 return new LinkedTransferQueue();
31 }
32 }
33
34 public static void main(String[] args) {
35 main(suite(), args);
36 }
37
38 public static Test suite() {
39 return newTestSuite(LinkedTransferQueueTest.class,
40 new Generic().testSuite());
41 }
42
43 /**
44 * Constructor builds new queue with size being zero and empty
45 * being true
46 */
47 public void testConstructor1() {
48 assertEquals(0, new LinkedTransferQueue().size());
49 assertTrue(new LinkedTransferQueue().isEmpty());
50 }
51
52 /**
53 * Initializing constructor with null collection throws
54 * NullPointerException
55 */
56 public void testConstructor2() {
57 try {
58 new LinkedTransferQueue(null);
59 shouldThrow();
60 } catch (NullPointerException success) {}
61 }
62
63 /**
64 * Initializing from Collection of null elements throws
65 * NullPointerException
66 */
67 public void testConstructor3() {
68 Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
69 try {
70 new LinkedTransferQueue(elements);
71 shouldThrow();
72 } catch (NullPointerException success) {}
73 }
74
75 /**
76 * Initializing constructor with a collection containing some null elements
77 * throws NullPointerException
78 */
79 public void testConstructor4() {
80 Integer[] ints = new Integer[SIZE];
81 for (int i = 0; i < SIZE-1; ++i)
82 ints[i] = i;
83 Collection<Integer> elements = Arrays.asList(ints);
84 try {
85 new LinkedTransferQueue(elements);
86 shouldThrow();
87 } catch (NullPointerException success) {}
88 }
89
90 /**
91 * Queue contains all elements of the collection it is initialized by
92 */
93 public void testConstructor5() {
94 Integer[] ints = new Integer[SIZE];
95 for (int i = 0; i < SIZE; ++i) {
96 ints[i] = i;
97 }
98 List intList = Arrays.asList(ints);
99 LinkedTransferQueue q
100 = new LinkedTransferQueue(intList);
101 assertEquals(q.size(), intList.size());
102 assertEquals(q.toString(), intList.toString());
103 assertTrue(Arrays.equals(q.toArray(),
104 intList.toArray()));
105 assertTrue(Arrays.equals(q.toArray(new Object[0]),
106 intList.toArray(new Object[0])));
107 assertTrue(Arrays.equals(q.toArray(new Object[SIZE]),
108 intList.toArray(new Object[SIZE])));
109 for (int i = 0; i < SIZE; ++i) {
110 assertEquals(ints[i], q.poll());
111 }
112 }
113
114 /**
115 * remainingCapacity() always returns Integer.MAX_VALUE
116 */
117 public void testRemainingCapacity() {
118 BlockingQueue q = populatedQueue(SIZE);
119 for (int i = 0; i < SIZE; ++i) {
120 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
121 assertEquals(SIZE - i, q.size());
122 assertEquals(i, q.remove());
123 }
124 for (int i = 0; i < SIZE; ++i) {
125 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
126 assertEquals(i, q.size());
127 assertTrue(q.add(i));
128 }
129 }
130
131 /**
132 * addAll(this) throws IllegalArgumentException
133 */
134 public void testAddAllSelf() {
135 LinkedTransferQueue q = populatedQueue(SIZE);
136 try {
137 q.addAll(q);
138 shouldThrow();
139 } catch (IllegalArgumentException success) {}
140 }
141
142 /**
143 * addAll of a collection with any null elements throws
144 * NullPointerException after possibly adding some elements
145 */
146 public void testAddAll3() {
147 LinkedTransferQueue q = new LinkedTransferQueue();
148 Integer[] ints = new Integer[SIZE];
149 for (int i = 0; i < SIZE - 1; ++i)
150 ints[i] = i;
151 try {
152 q.addAll(Arrays.asList(ints));
153 shouldThrow();
154 } catch (NullPointerException success) {}
155 }
156
157 /**
158 * Queue contains all elements, in traversal order, of successful addAll
159 */
160 public void testAddAll5() {
161 Integer[] empty = new Integer[0];
162 Integer[] ints = new Integer[SIZE];
163 for (int i = 0; i < SIZE; ++i) {
164 ints[i] = i;
165 }
166 LinkedTransferQueue q = new LinkedTransferQueue();
167 assertFalse(q.addAll(Arrays.asList(empty)));
168 assertTrue(q.addAll(Arrays.asList(ints)));
169 for (int i = 0; i < SIZE; ++i) {
170 assertEquals(ints[i], q.poll());
171 }
172 }
173
174 /**
175 * all elements successfully put are contained
176 */
177 public void testPut() {
178 LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>();
179 for (int i = 0; i < SIZE; ++i) {
180 assertEquals(i, q.size());
181 q.put(i);
182 assertTrue(q.contains(i));
183 }
184 }
185
186 /**
187 * take retrieves elements in FIFO order
188 */
189 public void testTake() throws InterruptedException {
190 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
191 for (int i = 0; i < SIZE; ++i) {
192 assertEquals(i, (int) q.take());
193 }
194 }
195
196 /**
197 * take removes existing elements until empty, then blocks interruptibly
198 */
199 public void testBlockingTake() throws InterruptedException {
200 final BlockingQueue q = populatedQueue(SIZE);
201 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
202 Thread t = newStartedThread(new CheckedRunnable() {
203 public void realRun() throws InterruptedException {
204 for (int i = 0; i < SIZE; ++i) {
205 assertEquals(i, q.take());
206 }
207
208 Thread.currentThread().interrupt();
209 try {
210 q.take();
211 shouldThrow();
212 } catch (InterruptedException success) {}
213 assertFalse(Thread.interrupted());
214
215 pleaseInterrupt.countDown();
216 try {
217 q.take();
218 shouldThrow();
219 } catch (InterruptedException success) {}
220 assertFalse(Thread.interrupted());
221 }});
222
223 await(pleaseInterrupt);
224 assertThreadStaysAlive(t);
225 t.interrupt();
226 awaitTermination(t);
227 }
228
229 /**
230 * poll succeeds unless empty
231 */
232 public void testPoll() throws InterruptedException {
233 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
234 for (int i = 0; i < SIZE; ++i) {
235 assertEquals(i, (int) q.poll());
236 }
237 assertNull(q.poll());
238 checkEmpty(q);
239 }
240
241 /**
242 * timed poll with zero timeout succeeds when non-empty, else times out
243 */
244 public void testTimedPoll0() throws InterruptedException {
245 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
246 for (int i = 0; i < SIZE; ++i) {
247 assertEquals(i, (int) q.poll(0, MILLISECONDS));
248 }
249 assertNull(q.poll(0, MILLISECONDS));
250 checkEmpty(q);
251 }
252
253 /**
254 * timed poll with nonzero timeout succeeds when non-empty, else times out
255 */
256 public void testTimedPoll() throws InterruptedException {
257 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
258 for (int i = 0; i < SIZE; ++i) {
259 long startTime = System.nanoTime();
260 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
261 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
262 }
263 long startTime = System.nanoTime();
264 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
265 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
266 checkEmpty(q);
267 }
268
269 /**
270 * Interrupted timed poll throws InterruptedException instead of
271 * returning timeout status
272 */
273 public void testInterruptedTimedPoll() throws InterruptedException {
274 final BlockingQueue<Integer> q = populatedQueue(SIZE);
275 final CountDownLatch aboutToWait = new CountDownLatch(1);
276 Thread t = newStartedThread(new CheckedRunnable() {
277 public void realRun() throws InterruptedException {
278 for (int i = 0; i < SIZE; ++i) {
279 long t0 = System.nanoTime();
280 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
281 assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
282 }
283 long t0 = System.nanoTime();
284 aboutToWait.countDown();
285 try {
286 q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
287 shouldThrow();
288 } catch (InterruptedException success) {
289 assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
290 }
291 }});
292
293 aboutToWait.await();
294 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
295 t.interrupt();
296 awaitTermination(t, MEDIUM_DELAY_MS);
297 checkEmpty(q);
298 }
299
300 /**
301 * timed poll after thread interrupted throws InterruptedException
302 * instead of returning timeout status
303 */
304 public void testTimedPollAfterInterrupt() throws InterruptedException {
305 final BlockingQueue<Integer> q = populatedQueue(SIZE);
306 Thread t = newStartedThread(new CheckedRunnable() {
307 public void realRun() throws InterruptedException {
308 Thread.currentThread().interrupt();
309 for (int i = 0; i < SIZE; ++i) {
310 long t0 = System.nanoTime();
311 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
312 assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
313 }
314 try {
315 q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
316 shouldThrow();
317 } catch (InterruptedException success) {}
318 }});
319
320 awaitTermination(t, MEDIUM_DELAY_MS);
321 checkEmpty(q);
322 }
323
324 /**
325 * peek returns next element, or null if empty
326 */
327 public void testPeek() throws InterruptedException {
328 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
329 for (int i = 0; i < SIZE; ++i) {
330 assertEquals(i, (int) q.peek());
331 assertEquals(i, (int) q.poll());
332 assertTrue(q.peek() == null ||
333 i != (int) q.peek());
334 }
335 assertNull(q.peek());
336 checkEmpty(q);
337 }
338
339 /**
340 * element returns next element, or throws NoSuchElementException if empty
341 */
342 public void testElement() throws InterruptedException {
343 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
344 for (int i = 0; i < SIZE; ++i) {
345 assertEquals(i, (int) q.element());
346 assertEquals(i, (int) q.poll());
347 }
348 try {
349 q.element();
350 shouldThrow();
351 } catch (NoSuchElementException success) {}
352 checkEmpty(q);
353 }
354
355 /**
356 * remove removes next element, or throws NoSuchElementException if empty
357 */
358 public void testRemove() throws InterruptedException {
359 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
360 for (int i = 0; i < SIZE; ++i) {
361 assertEquals(i, (int) q.remove());
362 }
363 try {
364 q.remove();
365 shouldThrow();
366 } catch (NoSuchElementException success) {}
367 checkEmpty(q);
368 }
369
370 /**
371 * An add following remove(x) succeeds
372 */
373 public void testRemoveElementAndAdd() throws InterruptedException {
374 LinkedTransferQueue q = new LinkedTransferQueue();
375 assertTrue(q.add(one));
376 assertTrue(q.add(two));
377 assertTrue(q.remove(one));
378 assertTrue(q.remove(two));
379 assertTrue(q.add(three));
380 assertSame(q.take(), three);
381 }
382
383 /**
384 * contains(x) reports true when elements added but not yet removed
385 */
386 public void testContains() {
387 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
388 for (int i = 0; i < SIZE; ++i) {
389 assertTrue(q.contains(i));
390 assertEquals(i, (int) q.poll());
391 assertFalse(q.contains(i));
392 }
393 }
394
395 /**
396 * clear removes all elements
397 */
398 public void testClear() throws InterruptedException {
399 LinkedTransferQueue q = populatedQueue(SIZE);
400 q.clear();
401 checkEmpty(q);
402 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
403 q.add(one);
404 assertFalse(q.isEmpty());
405 assertEquals(1, q.size());
406 assertTrue(q.contains(one));
407 q.clear();
408 checkEmpty(q);
409 }
410
411 /**
412 * containsAll(c) is true when c contains a subset of elements
413 */
414 public void testContainsAll() {
415 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
416 LinkedTransferQueue<Integer> p = new LinkedTransferQueue<Integer>();
417 for (int i = 0; i < SIZE; ++i) {
418 assertTrue(q.containsAll(p));
419 assertFalse(p.containsAll(q));
420 p.add(i);
421 }
422 assertTrue(p.containsAll(q));
423 }
424
425 /**
426 * retainAll(c) retains only those elements of c and reports true
427 * if changed
428 */
429 public void testRetainAll() {
430 LinkedTransferQueue q = populatedQueue(SIZE);
431 LinkedTransferQueue p = populatedQueue(SIZE);
432 for (int i = 0; i < SIZE; ++i) {
433 boolean changed = q.retainAll(p);
434 if (i == 0) {
435 assertFalse(changed);
436 } else {
437 assertTrue(changed);
438 }
439 assertTrue(q.containsAll(p));
440 assertEquals(SIZE - i, q.size());
441 p.remove();
442 }
443 }
444
445 /**
446 * removeAll(c) removes only those elements of c and reports true
447 * if changed
448 */
449 public void testRemoveAll() {
450 for (int i = 1; i < SIZE; ++i) {
451 LinkedTransferQueue q = populatedQueue(SIZE);
452 LinkedTransferQueue p = populatedQueue(i);
453 assertTrue(q.removeAll(p));
454 assertEquals(SIZE - i, q.size());
455 for (int j = 0; j < i; ++j) {
456 assertFalse(q.contains(p.remove()));
457 }
458 }
459 }
460
461 /**
462 * toArray() contains all elements in FIFO order
463 */
464 public void testToArray() {
465 LinkedTransferQueue q = populatedQueue(SIZE);
466 Object[] o = q.toArray();
467 for (int i = 0; i < o.length; i++) {
468 assertSame(o[i], q.poll());
469 }
470 }
471
472 /**
473 * toArray(a) contains all elements in FIFO order
474 */
475 public void testToArray2() {
476 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
477 Integer[] ints = new Integer[SIZE];
478 Integer[] array = q.toArray(ints);
479 assertSame(ints, array);
480 for (int i = 0; i < ints.length; i++) {
481 assertSame(ints[i], q.poll());
482 }
483 }
484
485 /**
486 * toArray(incompatible array type) throws ArrayStoreException
487 */
488 public void testToArray1_BadArg() {
489 LinkedTransferQueue q = populatedQueue(SIZE);
490 try {
491 q.toArray(new String[10]);
492 shouldThrow();
493 } catch (ArrayStoreException success) {}
494 }
495
496 /**
497 * iterator iterates through all elements
498 */
499 public void testIterator() throws InterruptedException {
500 LinkedTransferQueue q = populatedQueue(SIZE);
501 Iterator it = q.iterator();
502 int i;
503 for (i = 0; it.hasNext(); i++)
504 assertTrue(q.contains(it.next()));
505 assertEquals(i, SIZE);
506 assertIteratorExhausted(it);
507
508 it = q.iterator();
509 for (i = 0; it.hasNext(); i++)
510 assertEquals(it.next(), q.take());
511 assertEquals(i, SIZE);
512 assertIteratorExhausted(it);
513 }
514
515 /**
516 * iterator of empty collection has no elements
517 */
518 public void testEmptyIterator() {
519 assertIteratorExhausted(new LinkedTransferQueue().iterator());
520 }
521
522 /**
523 * iterator.remove() removes current element
524 */
525 public void testIteratorRemove() {
526 final LinkedTransferQueue q = new LinkedTransferQueue();
527 q.add(two);
528 q.add(one);
529 q.add(three);
530
531 Iterator it = q.iterator();
532 it.next();
533 it.remove();
534
535 it = q.iterator();
536 assertSame(it.next(), one);
537 assertSame(it.next(), three);
538 assertFalse(it.hasNext());
539 }
540
541 /**
542 * iterator ordering is FIFO
543 */
544 public void testIteratorOrdering() {
545 final LinkedTransferQueue<Integer> q
546 = new LinkedTransferQueue<Integer>();
547 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
548 q.add(one);
549 q.add(two);
550 q.add(three);
551 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
552 int k = 0;
553 for (Integer n : q) {
554 assertEquals(++k, (int) n);
555 }
556 assertEquals(3, k);
557 }
558
559 /**
560 * Modifications do not cause iterators to fail
561 */
562 public void testWeaklyConsistentIteration() {
563 final LinkedTransferQueue q = new LinkedTransferQueue();
564 q.add(one);
565 q.add(two);
566 q.add(three);
567 for (Iterator it = q.iterator(); it.hasNext();) {
568 q.remove();
569 it.next();
570 }
571 assertEquals(0, q.size());
572 }
573
574 /**
575 * toString contains toStrings of elements
576 */
577 public void testToString() {
578 LinkedTransferQueue q = populatedQueue(SIZE);
579 String s = q.toString();
580 for (int i = 0; i < SIZE; ++i) {
581 assertTrue(s.contains(String.valueOf(i)));
582 }
583 }
584
585 /**
586 * offer transfers elements across Executor tasks
587 */
588 public void testOfferInExecutor() {
589 final LinkedTransferQueue q = new LinkedTransferQueue();
590 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
591 ExecutorService executor = Executors.newFixedThreadPool(2);
592
593 executor.execute(new CheckedRunnable() {
594 public void realRun() throws InterruptedException {
595 threadsStarted.await();
596 assertTrue(q.offer(one, LONG_DELAY_MS, MILLISECONDS));
597 }});
598
599 executor.execute(new CheckedRunnable() {
600 public void realRun() throws InterruptedException {
601 threadsStarted.await();
602 assertSame(one, q.take());
603 checkEmpty(q);
604 }});
605
606 joinPool(executor);
607 }
608
609 /**
610 * timed poll retrieves elements across Executor threads
611 */
612 public void testPollInExecutor() {
613 final LinkedTransferQueue q = new LinkedTransferQueue();
614 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
615 ExecutorService executor = Executors.newFixedThreadPool(2);
616
617 executor.execute(new CheckedRunnable() {
618 public void realRun() throws InterruptedException {
619 assertNull(q.poll());
620 threadsStarted.await();
621 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
622 checkEmpty(q);
623 }});
624
625 executor.execute(new CheckedRunnable() {
626 public void realRun() throws InterruptedException {
627 threadsStarted.await();
628 q.put(one);
629 }});
630
631 joinPool(executor);
632 }
633
634 /**
635 * A deserialized serialized queue has same elements in same order
636 */
637 public void testSerialization() throws Exception {
638 Queue x = populatedQueue(SIZE);
639 Queue y = serialClone(x);
640
641 assertNotSame(y, x);
642 assertEquals(x.size(), y.size());
643 assertEquals(x.toString(), y.toString());
644 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
645 while (!x.isEmpty()) {
646 assertFalse(y.isEmpty());
647 assertEquals(x.remove(), y.remove());
648 }
649 assertTrue(y.isEmpty());
650 }
651
652 /**
653 * drainTo(c) empties queue into another collection c
654 */
655 public void testDrainTo() {
656 LinkedTransferQueue q = populatedQueue(SIZE);
657 ArrayList l = new ArrayList();
658 q.drainTo(l);
659 assertEquals(0, q.size());
660 assertEquals(SIZE, l.size());
661 for (int i = 0; i < SIZE; ++i) {
662 assertEquals(i, l.get(i));
663 }
664 q.add(zero);
665 q.add(one);
666 assertFalse(q.isEmpty());
667 assertTrue(q.contains(zero));
668 assertTrue(q.contains(one));
669 l.clear();
670 q.drainTo(l);
671 assertEquals(0, q.size());
672 assertEquals(2, l.size());
673 for (int i = 0; i < 2; ++i) {
674 assertEquals(i, l.get(i));
675 }
676 }
677
678 /**
679 * drainTo(c) empties full queue, unblocking a waiting put.
680 */
681 public void testDrainToWithActivePut() throws InterruptedException {
682 final LinkedTransferQueue q = populatedQueue(SIZE);
683 Thread t = newStartedThread(new CheckedRunnable() {
684 public void realRun() {
685 q.put(SIZE + 1);
686 }});
687 ArrayList l = new ArrayList();
688 q.drainTo(l);
689 assertTrue(l.size() >= SIZE);
690 for (int i = 0; i < SIZE; ++i)
691 assertEquals(i, l.get(i));
692 awaitTermination(t, MEDIUM_DELAY_MS);
693 assertTrue(q.size() + l.size() >= SIZE);
694 }
695
696 /**
697 * drainTo(c, n) empties first min(n, size) elements of queue into c
698 */
699 public void testDrainToN() {
700 LinkedTransferQueue q = new LinkedTransferQueue();
701 for (int i = 0; i < SIZE + 2; ++i) {
702 for (int j = 0; j < SIZE; j++) {
703 assertTrue(q.offer(j));
704 }
705 ArrayList l = new ArrayList();
706 q.drainTo(l, i);
707 int k = (i < SIZE) ? i : SIZE;
708 assertEquals(k, l.size());
709 assertEquals(SIZE - k, q.size());
710 for (int j = 0; j < k; ++j)
711 assertEquals(j, l.get(j));
712 do {} while (q.poll() != null);
713 }
714 }
715
716 /**
717 * timed poll() or take() increments the waiting consumer count;
718 * offer(e) decrements the waiting consumer count
719 */
720 public void testWaitingConsumer() throws InterruptedException {
721 final LinkedTransferQueue q = new LinkedTransferQueue();
722 assertEquals(0, q.getWaitingConsumerCount());
723 assertFalse(q.hasWaitingConsumer());
724 final CountDownLatch threadStarted = new CountDownLatch(1);
725
726 Thread t = newStartedThread(new CheckedRunnable() {
727 public void realRun() throws InterruptedException {
728 threadStarted.countDown();
729 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
730 assertEquals(0, q.getWaitingConsumerCount());
731 assertFalse(q.hasWaitingConsumer());
732 }});
733
734 threadStarted.await();
735 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
736 assertEquals(1, q.getWaitingConsumerCount());
737 assertTrue(q.hasWaitingConsumer());
738
739 assertTrue(q.offer(one));
740 assertEquals(0, q.getWaitingConsumerCount());
741 assertFalse(q.hasWaitingConsumer());
742
743 awaitTermination(t, MEDIUM_DELAY_MS);
744 }
745
746 /**
747 * transfer(null) throws NullPointerException
748 */
749 public void testTransfer1() throws InterruptedException {
750 try {
751 LinkedTransferQueue q = new LinkedTransferQueue();
752 q.transfer(null);
753 shouldThrow();
754 } catch (NullPointerException success) {}
755 }
756
757 /**
758 * transfer waits until a poll occurs. The transfered element
759 * is returned by this associated poll.
760 */
761 public void testTransfer2() throws InterruptedException {
762 final LinkedTransferQueue<Integer> q
763 = new LinkedTransferQueue<Integer>();
764 final CountDownLatch threadStarted = new CountDownLatch(1);
765
766 Thread t = newStartedThread(new CheckedRunnable() {
767 public void realRun() throws InterruptedException {
768 threadStarted.countDown();
769 q.transfer(five);
770 checkEmpty(q);
771 }});
772
773 threadStarted.await();
774 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
775 assertEquals(1, q.size());
776 assertSame(five, q.poll());
777 checkEmpty(q);
778 awaitTermination(t, MEDIUM_DELAY_MS);
779 }
780
781 /**
782 * transfer waits until a poll occurs, and then transfers in fifo order
783 */
784 public void testTransfer3() throws InterruptedException {
785 final LinkedTransferQueue<Integer> q
786 = new LinkedTransferQueue<Integer>();
787
788 Thread first = newStartedThread(new CheckedRunnable() {
789 public void realRun() throws InterruptedException {
790 q.transfer(four);
791 assertTrue(!q.contains(four));
792 assertEquals(1, q.size());
793 }});
794
795 Thread interruptedThread = newStartedThread(
796 new CheckedInterruptedRunnable() {
797 public void realRun() throws InterruptedException {
798 while (q.isEmpty())
799 Thread.yield();
800 q.transfer(five);
801 }});
802
803 while (q.size() < 2)
804 Thread.yield();
805 assertEquals(2, q.size());
806 assertSame(four, q.poll());
807 first.join();
808 assertEquals(1, q.size());
809 interruptedThread.interrupt();
810 interruptedThread.join();
811 checkEmpty(q);
812 }
813
814 /**
815 * transfer waits until a poll occurs, at which point the polling
816 * thread returns the element
817 */
818 public void testTransfer4() throws InterruptedException {
819 final LinkedTransferQueue q = new LinkedTransferQueue();
820
821 Thread t = newStartedThread(new CheckedRunnable() {
822 public void realRun() throws InterruptedException {
823 q.transfer(four);
824 assertFalse(q.contains(four));
825 assertSame(three, q.poll());
826 }});
827
828 while (q.isEmpty())
829 Thread.yield();
830 assertFalse(q.isEmpty());
831 assertEquals(1, q.size());
832 assertTrue(q.offer(three));
833 assertSame(four, q.poll());
834 awaitTermination(t, MEDIUM_DELAY_MS);
835 }
836
837 /**
838 * transfer waits until a take occurs. The transfered element
839 * is returned by this associated take.
840 */
841 public void testTransfer5() throws InterruptedException {
842 final LinkedTransferQueue<Integer> q
843 = new LinkedTransferQueue<Integer>();
844
845 Thread t = newStartedThread(new CheckedRunnable() {
846 public void realRun() throws InterruptedException {
847 q.transfer(four);
848 checkEmpty(q);
849 }});
850
851 while (q.isEmpty())
852 Thread.yield();
853 assertFalse(q.isEmpty());
854 assertEquals(1, q.size());
855 assertSame(four, q.take());
856 checkEmpty(q);
857 awaitTermination(t, MEDIUM_DELAY_MS);
858 }
859
860 /**
861 * tryTransfer(null) throws NullPointerException
862 */
863 public void testTryTransfer1() {
864 final LinkedTransferQueue q = new LinkedTransferQueue();
865 try {
866 q.tryTransfer(null);
867 shouldThrow();
868 } catch (NullPointerException success) {}
869 }
870
871 /**
872 * tryTransfer returns false and does not enqueue if there are no
873 * consumers waiting to poll or take.
874 */
875 public void testTryTransfer2() throws InterruptedException {
876 final LinkedTransferQueue q = new LinkedTransferQueue();
877 assertFalse(q.tryTransfer(new Object()));
878 assertFalse(q.hasWaitingConsumer());
879 checkEmpty(q);
880 }
881
882 /**
883 * If there is a consumer waiting in timed poll, tryTransfer
884 * returns true while successfully transfering object.
885 */
886 public void testTryTransfer3() throws InterruptedException {
887 final Object hotPotato = new Object();
888 final LinkedTransferQueue q = new LinkedTransferQueue();
889
890 Thread t = newStartedThread(new CheckedRunnable() {
891 public void realRun() {
892 while (! q.hasWaitingConsumer())
893 Thread.yield();
894 assertTrue(q.hasWaitingConsumer());
895 checkEmpty(q);
896 assertTrue(q.tryTransfer(hotPotato));
897 }});
898
899 assertSame(hotPotato, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
900 checkEmpty(q);
901 awaitTermination(t, MEDIUM_DELAY_MS);
902 }
903
904 /**
905 * If there is a consumer waiting in take, tryTransfer returns
906 * true while successfully transfering object.
907 */
908 public void testTryTransfer4() throws InterruptedException {
909 final Object hotPotato = new Object();
910 final LinkedTransferQueue q = new LinkedTransferQueue();
911
912 Thread t = newStartedThread(new CheckedRunnable() {
913 public void realRun() {
914 while (! q.hasWaitingConsumer())
915 Thread.yield();
916 assertTrue(q.hasWaitingConsumer());
917 checkEmpty(q);
918 assertTrue(q.tryTransfer(hotPotato));
919 }});
920
921 assertSame(q.take(), hotPotato);
922 checkEmpty(q);
923 awaitTermination(t, MEDIUM_DELAY_MS);
924 }
925
926 /**
927 * tryTransfer blocks interruptibly if no takers
928 */
929 public void testTryTransfer5() throws InterruptedException {
930 final LinkedTransferQueue q = new LinkedTransferQueue();
931 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
932 assertTrue(q.isEmpty());
933
934 Thread t = newStartedThread(new CheckedRunnable() {
935 public void realRun() throws InterruptedException {
936 Thread.currentThread().interrupt();
937 try {
938 q.tryTransfer(new Object(), LONG_DELAY_MS, MILLISECONDS);
939 shouldThrow();
940 } catch (InterruptedException success) {}
941 assertFalse(Thread.interrupted());
942
943 pleaseInterrupt.countDown();
944 try {
945 q.tryTransfer(new Object(), LONG_DELAY_MS, MILLISECONDS);
946 shouldThrow();
947 } catch (InterruptedException success) {}
948 assertFalse(Thread.interrupted());
949 }});
950
951 await(pleaseInterrupt);
952 assertThreadStaysAlive(t);
953 t.interrupt();
954 awaitTermination(t);
955 checkEmpty(q);
956 }
957
958 /**
959 * tryTransfer gives up after the timeout and returns false
960 */
961 public void testTryTransfer6() throws InterruptedException {
962 final LinkedTransferQueue q = new LinkedTransferQueue();
963
964 Thread t = newStartedThread(new CheckedRunnable() {
965 public void realRun() throws InterruptedException {
966 long t0 = System.nanoTime();
967 assertFalse(q.tryTransfer(new Object(),
968 timeoutMillis(), MILLISECONDS));
969 assertTrue(millisElapsedSince(t0) >= timeoutMillis());
970 checkEmpty(q);
971 }});
972
973 awaitTermination(t);
974 checkEmpty(q);
975 }
976
977 /**
978 * tryTransfer waits for any elements previously in to be removed
979 * before transfering to a poll or take
980 */
981 public void testTryTransfer7() throws InterruptedException {
982 final LinkedTransferQueue q = new LinkedTransferQueue();
983 assertTrue(q.offer(four));
984
985 Thread t = newStartedThread(new CheckedRunnable() {
986 public void realRun() throws InterruptedException {
987 assertTrue(q.tryTransfer(five, MEDIUM_DELAY_MS, MILLISECONDS));
988 checkEmpty(q);
989 }});
990
991 while (q.size() != 2)
992 Thread.yield();
993 assertEquals(2, q.size());
994 assertSame(four, q.poll());
995 assertSame(five, q.poll());
996 checkEmpty(q);
997 awaitTermination(t, MEDIUM_DELAY_MS);
998 }
999
1000 /**
1001 * tryTransfer attempts to enqueue into the queue and fails
1002 * returning false not enqueueing and the successive poll is null
1003 */
1004 public void testTryTransfer8() throws InterruptedException {
1005 final LinkedTransferQueue q = new LinkedTransferQueue();
1006 assertTrue(q.offer(four));
1007 assertEquals(1, q.size());
1008 long t0 = System.nanoTime();
1009 assertFalse(q.tryTransfer(five, timeoutMillis(), MILLISECONDS));
1010 assertTrue(millisElapsedSince(t0) >= timeoutMillis());
1011 assertEquals(1, q.size());
1012 assertSame(four, q.poll());
1013 assertNull(q.poll());
1014 checkEmpty(q);
1015 }
1016
1017 private LinkedTransferQueue<Integer> populatedQueue(int n) {
1018 LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>();
1019 checkEmpty(q);
1020 for (int i = 0; i < n; i++) {
1021 assertEquals(i, q.size());
1022 assertTrue(q.offer(i));
1023 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1024 }
1025 assertFalse(q.isEmpty());
1026 return q;
1027 }
1028
1029 /**
1030 * remove(null), contains(null) always return false
1031 */
1032 public void testNeverContainsNull() {
1033 Collection<?>[] qs = {
1034 new LinkedTransferQueue<Object>(),
1035 populatedQueue(2),
1036 };
1037
1038 for (Collection<?> q : qs) {
1039 assertFalse(q.contains(null));
1040 assertFalse(q.remove(null));
1041 }
1042 }
1043 }