ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.9
Committed: Wed Aug 5 00:43:23 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.8: +65 -46 lines
Log Message:
Ensure threads started by tests are join()ed; fix flaky tests testInterruptedTimedPoll and testTryTransfer3

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