ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.29
Committed: Thu Oct 28 19:05:04 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.28: +10 -10 lines
Log Message:
use awaitTermination(Thread, long)

File Contents

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