ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.54
Committed: Wed Dec 31 16:44:02 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.53: +0 -1 lines
Log Message:
remove unused imports

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