ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.6
Committed: Sun Aug 2 12:31:24 2009 UTC (14 years, 9 months ago) by dl
Branch: MAIN
Changes since 1.5: +30 -10 lines
Log Message:
Improve test descriptions

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 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 waits until a poll occurs. The transfered element
873 * is returned by this associated 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 waits until a poll occurs, and then transfers in fifo order
896 */
897 public void testTransfer3() throws InterruptedException {
898 final LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>();
899
900 Thread first =
901 new Thread(new Runnable() {
902 public void run() {
903 try {
904 Integer i = SIZE + 1;
905 q.transfer(i);
906 threadAssertTrue(!q.contains(i));
907 threadAssertEquals(1, q.size());
908 } catch (Throwable ex) {
909 threadUnexpectedException(ex);
910 }
911 }});
912 first.start();
913
914 Thread interruptedThread =
915 new Thread(new Runnable() {
916 public void run() {
917 try {
918 while (q.size() == 0)
919 Thread.yield();
920 q.transfer(SIZE);
921 threadShouldThrow();
922 } catch (InterruptedException success) {
923 } catch (Throwable ex) {
924 threadUnexpectedException(ex);
925 }
926 }});
927 interruptedThread.start();
928
929 while (q.size() < 2)
930 Thread.yield();
931 assertEquals(2, q.size());
932 assertEquals(SIZE + 1, (int) q.poll());
933 first.join();
934 assertEquals(1, q.size());
935 interruptedThread.interrupt();
936 interruptedThread.join();
937 assertEquals(0, q.size());
938 assertTrue(q.isEmpty());
939 }
940
941 /**
942 * transfer waits until a poll occurs, at which point the polling
943 * thread returns the element
944 */
945 public void testTransfer4() throws InterruptedException {
946 final LinkedTransferQueue q = new LinkedTransferQueue();
947 new Thread(new Runnable() {
948 public void run() {
949 try {
950 q.transfer(four);
951 threadAssertFalse(q.contains(four));
952 threadAssertEquals(three, q.poll());
953 } catch (Throwable ex) {
954 threadUnexpectedException(ex);
955 }
956 }}).start();
957 Thread.sleep(MEDIUM_DELAY_MS);
958 assertTrue(q.offer(three));
959 assertEquals(four, q.poll());
960 }
961
962 /**
963 * transfer waits until a take occurs. The transfered element
964 * is returned by this associated take.
965 */
966 public void testTransfer5() throws InterruptedException {
967 final LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>();
968
969 new Thread(new Runnable() {
970 public void run() {
971 try {
972 q.transfer(SIZE);
973 threadAssertTrue(q.isEmpty());
974 } catch (Throwable ex) {
975 threadUnexpectedException(ex);
976 }
977 }}).start();
978
979 Thread.sleep(SHORT_DELAY_MS);
980 assertEquals(SIZE, (int) q.take());
981 assertTrue(q.isEmpty());
982 }
983
984 /**
985 * tryTransfer(null) throws NullPointerException
986 */
987 public void testTryTransfer1() {
988 try {
989 final LinkedTransferQueue q = new LinkedTransferQueue();
990 q.tryTransfer(null);
991 this.shouldThrow();
992 } catch (NullPointerException ex) {
993 }
994 }
995
996 /**
997 * tryTransfer returns false and does not enqueue if there are no
998 * consumers waiting to poll or take.
999 */
1000 public void testTryTransfer2() {
1001 final LinkedTransferQueue q = new LinkedTransferQueue();
1002 assertFalse(q.tryTransfer(new Object()));
1003 assertFalse(q.hasWaitingConsumer());
1004 assertTrue(q.isEmpty());
1005 assertEquals(0, q.size());
1006 }
1007
1008 /**
1009 * If there is a consumer waiting in timed poll, tryTransfer
1010 * returns true while successfully transfering object.
1011 */
1012 public void testTryTransfer3() throws InterruptedException {
1013 final Object hotPotato = new Object();
1014 final LinkedTransferQueue q = new LinkedTransferQueue();
1015 new Thread(new Runnable() {
1016 public void run() {
1017 try {
1018 while (! q.hasWaitingConsumer())
1019 Thread.yield();
1020 threadAssertTrue(q.hasWaitingConsumer());
1021 threadAssertTrue(q.isEmpty());
1022 threadAssertTrue(q.size() == 0);
1023 threadAssertTrue(q.tryTransfer(hotPotato));
1024 } catch (Throwable ex) {
1025 threadUnexpectedException(ex);
1026 }
1027 }}).start();
1028 assertTrue(q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS) == hotPotato);
1029 assertTrue(q.isEmpty());
1030 }
1031
1032 /**
1033 * If there is a consumer waiting in take, tryTransfer returns
1034 * true while successfully transfering object.
1035 */
1036 public void testTryTransfer4() throws InterruptedException {
1037 final Object hotPotato = new Object();
1038 final LinkedTransferQueue q = new LinkedTransferQueue();
1039 new Thread(new Runnable() {
1040 public void run() {
1041 try {
1042 while (! q.hasWaitingConsumer())
1043 Thread.yield();
1044 threadAssertTrue(q.hasWaitingConsumer());
1045 threadAssertTrue(q.isEmpty());
1046 threadAssertTrue(q.size() == 0);
1047 threadAssertTrue(q.tryTransfer(hotPotato));
1048 } catch (Throwable ex) {
1049 threadUnexpectedException(ex);
1050 }
1051 }}).start();
1052 assertTrue(q.take() == hotPotato);
1053 assertTrue(q.isEmpty());
1054 }
1055
1056 /**
1057 * tryTransfer waits the amount given if interrupted, and
1058 * throws interrupted exception
1059 */
1060 public void testTryTransfer5() throws InterruptedException {
1061 final LinkedTransferQueue q = new LinkedTransferQueue();
1062 Thread toInterrupt = new Thread(new Runnable() {
1063 public void run() {
1064 try {
1065 q.tryTransfer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
1066 threadShouldThrow();
1067 } catch (InterruptedException success) {
1068 } catch (Throwable ex) {
1069 threadUnexpectedException(ex);
1070 }
1071 }});
1072 toInterrupt.start();
1073 Thread.sleep(SMALL_DELAY_MS);
1074 toInterrupt.interrupt();
1075 }
1076
1077 /**
1078 * tryTransfer gives up after the timeout and return false
1079 */
1080 public void testTryTransfer6() throws InterruptedException {
1081 final LinkedTransferQueue q = new LinkedTransferQueue();
1082 new Thread(new Runnable() {
1083 public void run() {
1084 try {
1085 threadAssertFalse(q.tryTransfer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
1086 } catch (Throwable ex) {
1087 threadUnexpectedException(ex);
1088 }
1089 }}).start();
1090 Thread.sleep(LONG_DELAY_MS);
1091 assertTrue(q.isEmpty());
1092 }
1093
1094 /**
1095 * tryTransfer waits for any elements previously in to be removed
1096 * before transfering to a poll or take
1097 */
1098 public void testTryTransfer7() throws InterruptedException {
1099 final LinkedTransferQueue q = new LinkedTransferQueue();
1100 assertTrue(q.offer(four));
1101 new Thread(new Runnable() {
1102 public void run() {
1103 try {
1104 threadAssertTrue(q.tryTransfer(five, LONG_DELAY_MS, TimeUnit.MILLISECONDS));
1105 threadAssertTrue(q.isEmpty());
1106 } catch (Throwable ex) {
1107 threadUnexpectedException(ex);
1108 }
1109 }}).start();
1110 Thread.sleep(SHORT_DELAY_MS);
1111 assertEquals(2, q.size());
1112 assertEquals(four, q.poll());
1113 assertEquals(five, q.poll());
1114 assertTrue(q.isEmpty());
1115 }
1116
1117 /**
1118 * tryTransfer attempts to enqueue into the q and fails returning
1119 * false not enqueueing and the successive poll is null
1120 */
1121 public void testTryTransfer8() throws InterruptedException {
1122 final LinkedTransferQueue q = new LinkedTransferQueue();
1123 assertTrue(q.offer(four));
1124 assertEquals(1, q.size());
1125 assertFalse(q.tryTransfer(five, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
1126 assertEquals(1, q.size());
1127 assertEquals(four, q.poll());
1128 threadAssertTrue(q.isEmpty());
1129 assertNull(q.poll());
1130 }
1131
1132 private LinkedTransferQueue<Integer> populatedQueue(int n) {
1133 LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>();
1134 assertTrue(q.isEmpty());
1135 for (int i = 0; i < n; i++) {
1136 assertEquals(i, q.size());
1137 assertTrue(q.offer(i));
1138 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1139 }
1140 assertFalse(q.isEmpty());
1141 return q;
1142 }
1143
1144 private static class ConsumerObserver {
1145
1146 private int waitingConsumers;
1147
1148 private ConsumerObserver() {
1149 }
1150
1151 private void setWaitingConsumer(int i) {
1152 this.waitingConsumers = i;
1153 }
1154
1155 private int getWaitingConsumers() {
1156 return waitingConsumers;
1157 }
1158 }
1159 }