ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.11
Committed: Wed Aug 12 02:15:04 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.10: +1 -1 lines
Log Message:
small test case tightening

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