ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.5
Committed: Sun Aug 2 08:17:31 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.4: +347 -454 lines
Log Message:
fix 3 intermittently failing tests

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