ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.66
Committed: Sun Oct 18 04:48:32 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.65: +38 -29 lines
Log Message:
more timeout robustness

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