ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.36
Committed: Wed Nov 3 07:54:52 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.35: +2 -2 lines
Log Message:
fix javadoc of testToArray1_BadArg

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