ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.57
Committed: Sat Jan 17 22:55:06 2015 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.56: +17 -4 lines
Log Message:
add more tests of exhausted iterators

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