ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.22
Committed: Tue Dec 1 06:03:49 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +9 -10 lines
Log Message:
Use MILLISECONDS.toNanos instead of multiplying by 1000*1000; use explicit assertEquals instead of assertTrue(...!= null); improve testPutWithTake

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 assertNull(q.poll());
701 assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
702 assertTrue(q.isEmpty());
703 }});
704
705 executor.execute(new CheckedRunnable() {
706 public void realRun() throws InterruptedException {
707 Thread.sleep(SMALL_DELAY_MS);
708 q.put(one);
709 }});
710
711 joinPool(executor);
712 }
713
714 /**
715 * A deserialized serialized queue has same elements in same order
716 */
717 public void testSerialization() throws Exception {
718 LinkedTransferQueue q = populatedQueue(SIZE);
719
720 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
721 ObjectOutputStream out
722 = new ObjectOutputStream(new BufferedOutputStream(bout));
723 out.writeObject(q);
724 out.close();
725
726 ByteArrayInputStream bin
727 = new ByteArrayInputStream(bout.toByteArray());
728 ObjectInputStream in
729 = new ObjectInputStream(new BufferedInputStream(bin));
730 LinkedTransferQueue r = (LinkedTransferQueue) in.readObject();
731
732 assertEquals(q.size(), r.size());
733 while (!q.isEmpty()) {
734 assertEquals(q.remove(), r.remove());
735 }
736 }
737
738 /**
739 * drainTo(null) throws NullPointerException
740 */
741 public void testDrainToNull() {
742 LinkedTransferQueue q = populatedQueue(SIZE);
743 try {
744 q.drainTo(null);
745 shouldThrow();
746 } catch (NullPointerException success) {}
747 }
748
749 /**
750 * drainTo(this) throws IllegalArgumentException
751 */
752 public void testDrainToSelf() {
753 LinkedTransferQueue q = populatedQueue(SIZE);
754 try {
755 q.drainTo(q);
756 shouldThrow();
757 } catch (IllegalArgumentException success) {}
758 }
759
760 /**
761 * drainTo(c) empties queue into another collection c
762 */
763 public void testDrainTo() {
764 LinkedTransferQueue q = populatedQueue(SIZE);
765 ArrayList l = new ArrayList();
766 q.drainTo(l);
767 assertEquals(q.size(), 0);
768 assertEquals(l.size(), SIZE);
769 for (int i = 0; i < SIZE; ++i) {
770 assertEquals(l.get(i), i);
771 }
772 q.add(zero);
773 q.add(one);
774 assertFalse(q.isEmpty());
775 assertTrue(q.contains(zero));
776 assertTrue(q.contains(one));
777 l.clear();
778 q.drainTo(l);
779 assertEquals(q.size(), 0);
780 assertEquals(l.size(), 2);
781 for (int i = 0; i < 2; ++i) {
782 assertEquals(l.get(i), i);
783 }
784 }
785
786 /**
787 * drainTo(c) empties full queue, unblocking a waiting put.
788 */
789 public void testDrainToWithActivePut() throws InterruptedException {
790 final LinkedTransferQueue q = populatedQueue(SIZE);
791 Thread t = newStartedThread(new CheckedRunnable() {
792 public void realRun() {
793 q.put(SIZE + 1);
794 }});
795 ArrayList l = new ArrayList();
796 q.drainTo(l);
797 assertTrue(l.size() >= SIZE);
798 for (int i = 0; i < SIZE; ++i) {
799 assertEquals(l.get(i), i);
800 }
801 t.join();
802 assertTrue(q.size() + l.size() >= SIZE);
803 }
804
805 /**
806 * drainTo(null, n) throws NullPointerException
807 */
808 public void testDrainToNullN() {
809 LinkedTransferQueue q = populatedQueue(SIZE);
810 try {
811 q.drainTo(null, SIZE);
812 shouldThrow();
813 } catch (NullPointerException success) {}
814 }
815
816 /**
817 * drainTo(this, n) throws IllegalArgumentException
818 */
819 public void testDrainToSelfN() {
820 LinkedTransferQueue q = populatedQueue(SIZE);
821 try {
822 q.drainTo(q, SIZE);
823 shouldThrow();
824 } catch (IllegalArgumentException success) {}
825 }
826
827 /**
828 * drainTo(c, n) empties first max {n, size} elements of queue into c
829 */
830 public void testDrainToN() {
831 LinkedTransferQueue q = new LinkedTransferQueue();
832 for (int i = 0; i < SIZE + 2; ++i) {
833 for (int j = 0; j < SIZE; j++) {
834 assertTrue(q.offer(j));
835 }
836 ArrayList l = new ArrayList();
837 q.drainTo(l, i);
838 int k = (i < SIZE) ? i : SIZE;
839 assertEquals(l.size(), k);
840 assertEquals(q.size(), SIZE - k);
841 for (int j = 0; j < k; ++j) {
842 assertEquals(l.get(j), j);
843 }
844 while (q.poll() != null)
845 ;
846 }
847 }
848
849 /**
850 * timed poll() or take() increments the waiting consumer count;
851 * offer(e) decrements the waiting consumer count
852 */
853 public void testWaitingConsumer() throws InterruptedException {
854 final LinkedTransferQueue q = new LinkedTransferQueue();
855 assertEquals(q.getWaitingConsumerCount(), 0);
856 assertFalse(q.hasWaitingConsumer());
857
858 Thread t = newStartedThread(new CheckedRunnable() {
859 public void realRun() throws InterruptedException {
860 Thread.sleep(SMALL_DELAY_MS);
861 assertTrue(q.hasWaitingConsumer());
862 assertEquals(q.getWaitingConsumerCount(), 1);
863 assertTrue(q.offer(one));
864 assertFalse(q.hasWaitingConsumer());
865 assertEquals(q.getWaitingConsumerCount(), 0);
866 }});
867
868 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
869 assertEquals(q.getWaitingConsumerCount(), 0);
870 assertFalse(q.hasWaitingConsumer());
871 t.join();
872 }
873
874 /**
875 * transfer(null) throws NullPointerException
876 */
877 public void testTransfer1() throws InterruptedException {
878 try {
879 LinkedTransferQueue q = new LinkedTransferQueue();
880 q.transfer(null);
881 shouldThrow();
882 } catch (NullPointerException success) {}
883 }
884
885 /**
886 * transfer waits until a poll occurs. The transfered element
887 * is returned by this associated poll.
888 */
889 public void testTransfer2() throws InterruptedException {
890 final LinkedTransferQueue<Integer> q
891 = new LinkedTransferQueue<Integer>();
892
893 Thread t = newStartedThread(new CheckedRunnable() {
894 public void realRun() throws InterruptedException {
895 q.transfer(SIZE);
896 threadAssertTrue(q.isEmpty());
897 }});
898
899 Thread.sleep(SHORT_DELAY_MS);
900 assertEquals(1, q.size());
901 assertEquals(SIZE, (int) q.poll());
902 assertTrue(q.isEmpty());
903 t.join();
904 }
905
906 /**
907 * transfer waits until a poll occurs, and then transfers in fifo order
908 */
909 public void testTransfer3() throws InterruptedException {
910 final LinkedTransferQueue<Integer> q
911 = new LinkedTransferQueue<Integer>();
912
913 Thread first = newStartedThread(new CheckedRunnable() {
914 public void realRun() throws InterruptedException {
915 Integer i = SIZE + 1;
916 q.transfer(i);
917 threadAssertTrue(!q.contains(i));
918 threadAssertEquals(1, q.size());
919 }});
920
921 Thread interruptedThread = newStartedThread(
922 new CheckedInterruptedRunnable() {
923 public void realRun() throws InterruptedException {
924 while (q.size() == 0)
925 Thread.yield();
926 q.transfer(SIZE);
927 }});
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
948 Thread t = newStartedThread(new CheckedRunnable() {
949 public void realRun() throws InterruptedException {
950 q.transfer(four);
951 threadAssertFalse(q.contains(four));
952 threadAssertEquals(three, q.poll());
953 }});
954
955 Thread.sleep(SHORT_DELAY_MS);
956 assertTrue(q.offer(three));
957 assertEquals(four, q.poll());
958 t.join();
959 }
960
961 /**
962 * transfer waits until a take occurs. The transfered element
963 * is returned by this associated take.
964 */
965 public void testTransfer5() throws InterruptedException {
966 final LinkedTransferQueue<Integer> q
967 = new LinkedTransferQueue<Integer>();
968
969 Thread t = newStartedThread(new CheckedRunnable() {
970 public void realRun() throws InterruptedException {
971 q.transfer(SIZE);
972 checkEmpty(q);
973 }});
974
975 Thread.sleep(SHORT_DELAY_MS);
976 assertEquals(SIZE, (int) q.take());
977 checkEmpty(q);
978 t.join();
979 }
980
981 /**
982 * tryTransfer(null) throws NullPointerException
983 */
984 public void testTryTransfer1() {
985 try {
986 final LinkedTransferQueue q = new LinkedTransferQueue();
987 q.tryTransfer(null);
988 shouldThrow();
989 } catch (NullPointerException success) {}
990 }
991
992 /**
993 * tryTransfer returns false and does not enqueue if there are no
994 * consumers waiting to poll or take.
995 */
996 public void testTryTransfer2() throws InterruptedException {
997 final LinkedTransferQueue q = new LinkedTransferQueue();
998 assertFalse(q.tryTransfer(new Object()));
999 assertFalse(q.hasWaitingConsumer());
1000 checkEmpty(q);
1001 }
1002
1003 /**
1004 * If there is a consumer waiting in timed poll, tryTransfer
1005 * returns true while successfully transfering object.
1006 */
1007 public void testTryTransfer3() throws InterruptedException {
1008 final Object hotPotato = new Object();
1009 final LinkedTransferQueue q = new LinkedTransferQueue();
1010
1011 Thread t = newStartedThread(new CheckedRunnable() {
1012 public void realRun() {
1013 while (! q.hasWaitingConsumer())
1014 Thread.yield();
1015 threadAssertTrue(q.hasWaitingConsumer());
1016 threadAssertTrue(q.isEmpty());
1017 threadAssertTrue(q.size() == 0);
1018 threadAssertTrue(q.tryTransfer(hotPotato));
1019 }});
1020
1021 assertTrue(q.poll(MEDIUM_DELAY_MS, MILLISECONDS) == hotPotato);
1022 checkEmpty(q);
1023 t.join();
1024 }
1025
1026 /**
1027 * If there is a consumer waiting in take, tryTransfer returns
1028 * true while successfully transfering object.
1029 */
1030 public void testTryTransfer4() throws InterruptedException {
1031 final Object hotPotato = new Object();
1032 final LinkedTransferQueue q = new LinkedTransferQueue();
1033
1034 Thread t = newStartedThread(new CheckedRunnable() {
1035 public void realRun() {
1036 while (! q.hasWaitingConsumer())
1037 Thread.yield();
1038 threadAssertTrue(q.hasWaitingConsumer());
1039 threadAssertTrue(q.isEmpty());
1040 threadAssertTrue(q.size() == 0);
1041 threadAssertTrue(q.tryTransfer(hotPotato));
1042 }});
1043
1044 assertTrue(q.take() == hotPotato);
1045 checkEmpty(q);
1046 t.join();
1047 }
1048
1049 /**
1050 * tryTransfer waits the amount given if interrupted, and
1051 * throws interrupted exception
1052 */
1053 public void testTryTransfer5() throws InterruptedException {
1054 final LinkedTransferQueue q = new LinkedTransferQueue();
1055
1056 Thread toInterrupt = newStartedThread(new CheckedInterruptedRunnable() {
1057 public void realRun() throws InterruptedException {
1058 q.tryTransfer(new Object(), LONG_DELAY_MS, MILLISECONDS);
1059 }});
1060
1061 Thread.sleep(SMALL_DELAY_MS);
1062 toInterrupt.interrupt();
1063 toInterrupt.join();
1064 }
1065
1066 /**
1067 * tryTransfer gives up after the timeout and return false
1068 */
1069 public void testTryTransfer6() throws InterruptedException {
1070 final LinkedTransferQueue q = new LinkedTransferQueue();
1071
1072 Thread t = newStartedThread(new CheckedRunnable() {
1073 public void realRun() throws InterruptedException {
1074 threadAssertFalse
1075 (q.tryTransfer(new Object(),
1076 SHORT_DELAY_MS, MILLISECONDS));
1077 }});
1078
1079 Thread.sleep(SMALL_DELAY_MS);
1080 checkEmpty(q);
1081 t.join();
1082 }
1083
1084 /**
1085 * tryTransfer waits for any elements previously in to be removed
1086 * before transfering to a poll or take
1087 */
1088 public void testTryTransfer7() throws InterruptedException {
1089 final LinkedTransferQueue q = new LinkedTransferQueue();
1090 assertTrue(q.offer(four));
1091
1092 Thread t = newStartedThread(new CheckedRunnable() {
1093 public void realRun() throws InterruptedException {
1094 threadAssertTrue(q.tryTransfer(five,
1095 MEDIUM_DELAY_MS, MILLISECONDS));
1096 threadAssertTrue(q.isEmpty());
1097 }});
1098
1099 Thread.sleep(SHORT_DELAY_MS);
1100 assertEquals(2, q.size());
1101 assertEquals(four, q.poll());
1102 assertEquals(five, q.poll());
1103 checkEmpty(q);
1104 t.join();
1105 }
1106
1107 /**
1108 * tryTransfer attempts to enqueue into the q and fails returning
1109 * false not enqueueing and the successive poll is null
1110 */
1111 public void testTryTransfer8() throws InterruptedException {
1112 final LinkedTransferQueue q = new LinkedTransferQueue();
1113 assertTrue(q.offer(four));
1114 assertEquals(1, q.size());
1115 assertFalse(q.tryTransfer(five, SHORT_DELAY_MS, MILLISECONDS));
1116 assertEquals(1, q.size());
1117 assertEquals(four, q.poll());
1118 assertNull(q.poll());
1119 checkEmpty(q);
1120 }
1121
1122 private LinkedTransferQueue<Integer> populatedQueue(int n) {
1123 LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>();
1124 assertTrue(q.isEmpty());
1125 for (int i = 0; i < n; i++) {
1126 assertEquals(i, q.size());
1127 assertTrue(q.offer(i));
1128 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1129 }
1130 assertFalse(q.isEmpty());
1131 return q;
1132 }
1133 }