ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.21
Committed: Thu Nov 26 15:42:15 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.20: +19 -19 lines
Log Message:
change access modifiers to allow access from multiple packages

File Contents

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