ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.48
Committed: Tue May 31 16:16:24 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.47: +13 -27 lines
Log Message:
use serialClone in serialization tests; update imports

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