ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.71
Committed: Sat Mar 18 20:42:20 2017 UTC (7 years, 2 months ago) by jsr166
Branch: MAIN
Changes since 1.70: +1 -1 lines
Log Message:
better assertion style

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