ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.77
Committed: Sun May 14 00:56:43 2017 UTC (7 years ago) by jsr166
Branch: MAIN
Changes since 1.76: +1 -0 lines
Log Message:
add interrupt status assertions

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