ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.83
Committed: Thu Sep 5 21:11:13 2019 UTC (4 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.82: +1 -4 lines
Log Message:
testInterruptedTimedPoll: rely on awaitTermination together with LONGER_DELAY_MS

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 jsr166 1.70 import java.util.concurrent.Callable;
19 jsr166 1.47 import java.util.concurrent.CountDownLatch;
20     import java.util.concurrent.Executors;
21     import java.util.concurrent.ExecutorService;
22     import java.util.concurrent.LinkedTransferQueue;
23 jsr166 1.55
24     import junit.framework.Test;
25 dl 1.1
26 jsr166 1.10 @SuppressWarnings({"unchecked", "rawtypes"})
27 dl 1.1 public class LinkedTransferQueueTest extends JSR166TestCase {
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 jsr166 1.59 main(suite(), args);
36 dl 1.1 }
37    
38     public static Test suite() {
39 jsr166 1.67 class Implementation implements CollectionImplementation {
40     public Class<?> klazz() { return LinkedTransferQueue.class; }
41     public Collection emptyCollection() { return new LinkedTransferQueue(); }
42     public Object makeElement(int i) { return i; }
43     public boolean isConcurrent() { return true; }
44     public boolean permitsNulls() { return false; }
45     }
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.68 LinkedTransferQueue<Integer> q = new LinkedTransferQueue<>();
187 jsr166 1.5 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.73 for (int i = 0; i < SIZE; i++) assertEquals(i, q.take());
213 jsr166 1.46
214     Thread.currentThread().interrupt();
215     try {
216     q.take();
217     shouldThrow();
218     } catch (InterruptedException success) {}
219     assertFalse(Thread.interrupted());
220    
221     pleaseInterrupt.countDown();
222 jsr166 1.19 try {
223     q.take();
224     shouldThrow();
225     } catch (InterruptedException success) {}
226 jsr166 1.46 assertFalse(Thread.interrupted());
227 jsr166 1.5 }});
228 jsr166 1.19
229 jsr166 1.46 await(pleaseInterrupt);
230 jsr166 1.82 if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
231 jsr166 1.5 t.interrupt();
232 jsr166 1.46 awaitTermination(t);
233 dl 1.1 }
234    
235     /**
236     * poll succeeds unless empty
237     */
238 jsr166 1.12 public void testPoll() throws InterruptedException {
239 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
240 dl 1.1 for (int i = 0; i < SIZE; ++i) {
241 jsr166 1.5 assertEquals(i, (int) q.poll());
242 dl 1.1 }
243     assertNull(q.poll());
244 jsr166 1.12 checkEmpty(q);
245 dl 1.1 }
246    
247     /**
248 jsr166 1.30 * timed poll with zero timeout succeeds when non-empty, else times out
249 dl 1.1 */
250 jsr166 1.5 public void testTimedPoll0() throws InterruptedException {
251     LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
252     for (int i = 0; i < SIZE; ++i) {
253 jsr166 1.7 assertEquals(i, (int) q.poll(0, MILLISECONDS));
254 dl 1.1 }
255 jsr166 1.7 assertNull(q.poll(0, MILLISECONDS));
256 jsr166 1.12 checkEmpty(q);
257 dl 1.1 }
258    
259     /**
260 jsr166 1.30 * timed poll with nonzero timeout succeeds when non-empty, else times out
261 dl 1.1 */
262 jsr166 1.5 public void testTimedPoll() throws InterruptedException {
263     LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
264 jsr166 1.66 long startTime = System.nanoTime();
265     for (int i = 0; i < SIZE; ++i)
266 jsr166 1.46 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
267 jsr166 1.66 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
268    
269     startTime = System.nanoTime();
270 jsr166 1.46 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
271     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
272 jsr166 1.12 checkEmpty(q);
273 dl 1.1 }
274    
275     /**
276     * Interrupted timed poll throws InterruptedException instead of
277     * returning timeout status
278     */
279 jsr166 1.5 public void testInterruptedTimedPoll() throws InterruptedException {
280 jsr166 1.31 final BlockingQueue<Integer> q = populatedQueue(SIZE);
281 jsr166 1.76 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
282 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
283 jsr166 1.21 public void realRun() throws InterruptedException {
284 jsr166 1.78 for (int i = 0; i < SIZE; i++)
285 jsr166 1.23 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
286 jsr166 1.76
287 jsr166 1.78 Thread.currentThread().interrupt();
288     try {
289 jsr166 1.82 q.poll(randomTimeout(), randomTimeUnit());
290 jsr166 1.78 shouldThrow();
291     } catch (InterruptedException success) {}
292     assertFalse(Thread.interrupted());
293    
294 jsr166 1.76 pleaseInterrupt.countDown();
295 jsr166 1.16 try {
296 jsr166 1.83 q.poll(LONGER_DELAY_MS, MILLISECONDS);
297 jsr166 1.17 shouldThrow();
298 jsr166 1.66 } catch (InterruptedException success) {}
299 jsr166 1.76 assertFalse(Thread.interrupted());
300 jsr166 1.5 }});
301 jsr166 1.17
302 jsr166 1.76 await(pleaseInterrupt);
303 jsr166 1.82 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
304 jsr166 1.5 t.interrupt();
305 jsr166 1.64 awaitTermination(t);
306 jsr166 1.12 checkEmpty(q);
307 dl 1.1 }
308    
309     /**
310 jsr166 1.31 * timed poll after thread interrupted throws InterruptedException
311     * instead of returning timeout status
312     */
313     public void testTimedPollAfterInterrupt() throws InterruptedException {
314     final BlockingQueue<Integer> q = populatedQueue(SIZE);
315     Thread t = newStartedThread(new CheckedRunnable() {
316     public void realRun() throws InterruptedException {
317 jsr166 1.66 long startTime = System.nanoTime();
318 jsr166 1.31 Thread.currentThread().interrupt();
319 jsr166 1.66 for (int i = 0; i < SIZE; ++i)
320 jsr166 1.82 assertEquals(i, (int) q.poll(randomTimeout(), randomTimeUnit()));
321 jsr166 1.31 try {
322 jsr166 1.82 q.poll(randomTimeout(), randomTimeUnit());
323 jsr166 1.31 shouldThrow();
324     } catch (InterruptedException success) {}
325 jsr166 1.77 assertFalse(Thread.interrupted());
326 jsr166 1.66 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
327 jsr166 1.31 }});
328    
329 jsr166 1.66 awaitTermination(t);
330 jsr166 1.31 checkEmpty(q);
331     }
332    
333     /**
334 dl 1.1 * peek returns next element, or null if empty
335     */
336 jsr166 1.12 public void testPeek() throws InterruptedException {
337 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
338 dl 1.1 for (int i = 0; i < SIZE; ++i) {
339 jsr166 1.5 assertEquals(i, (int) q.peek());
340     assertEquals(i, (int) q.poll());
341 dl 1.1 assertTrue(q.peek() == null ||
342 jsr166 1.5 i != (int) q.peek());
343 dl 1.1 }
344     assertNull(q.peek());
345 jsr166 1.12 checkEmpty(q);
346 dl 1.1 }
347    
348     /**
349 jsr166 1.5 * element returns next element, or throws NoSuchElementException if empty
350 dl 1.1 */
351 jsr166 1.12 public void testElement() throws InterruptedException {
352 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
353 dl 1.1 for (int i = 0; i < SIZE; ++i) {
354 jsr166 1.5 assertEquals(i, (int) q.element());
355     assertEquals(i, (int) q.poll());
356 dl 1.1 }
357     try {
358     q.element();
359     shouldThrow();
360 jsr166 1.17 } catch (NoSuchElementException success) {}
361 jsr166 1.12 checkEmpty(q);
362 dl 1.1 }
363    
364     /**
365 jsr166 1.5 * remove removes next element, or throws NoSuchElementException if empty
366 dl 1.1 */
367 jsr166 1.12 public void testRemove() throws InterruptedException {
368 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
369 dl 1.1 for (int i = 0; i < SIZE; ++i) {
370 jsr166 1.5 assertEquals(i, (int) q.remove());
371 dl 1.1 }
372     try {
373     q.remove();
374     shouldThrow();
375 jsr166 1.17 } catch (NoSuchElementException success) {}
376 jsr166 1.12 checkEmpty(q);
377 dl 1.1 }
378    
379     /**
380     * An add following remove(x) succeeds
381     */
382 jsr166 1.5 public void testRemoveElementAndAdd() throws InterruptedException {
383     LinkedTransferQueue q = new LinkedTransferQueue();
384     assertTrue(q.add(one));
385     assertTrue(q.add(two));
386     assertTrue(q.remove(one));
387     assertTrue(q.remove(two));
388     assertTrue(q.add(three));
389 jsr166 1.23 assertSame(q.take(), three);
390 dl 1.1 }
391    
392     /**
393     * contains(x) reports true when elements added but not yet removed
394     */
395     public void testContains() {
396 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
397 dl 1.1 for (int i = 0; i < SIZE; ++i) {
398 jsr166 1.5 assertTrue(q.contains(i));
399     assertEquals(i, (int) q.poll());
400     assertFalse(q.contains(i));
401 dl 1.1 }
402     }
403    
404     /**
405     * clear removes all elements
406     */
407 jsr166 1.12 public void testClear() throws InterruptedException {
408 dl 1.1 LinkedTransferQueue q = populatedQueue(SIZE);
409     q.clear();
410 jsr166 1.12 checkEmpty(q);
411 jsr166 1.5 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
412 dl 1.1 q.add(one);
413     assertFalse(q.isEmpty());
414 jsr166 1.12 assertEquals(1, q.size());
415 dl 1.1 assertTrue(q.contains(one));
416     q.clear();
417 jsr166 1.12 checkEmpty(q);
418 dl 1.1 }
419    
420     /**
421     * containsAll(c) is true when c contains a subset of elements
422     */
423     public void testContainsAll() {
424 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
425 jsr166 1.68 LinkedTransferQueue<Integer> p = new LinkedTransferQueue<>();
426 dl 1.1 for (int i = 0; i < SIZE; ++i) {
427     assertTrue(q.containsAll(p));
428     assertFalse(p.containsAll(q));
429 jsr166 1.5 p.add(i);
430 dl 1.1 }
431     assertTrue(p.containsAll(q));
432     }
433    
434     /**
435 jsr166 1.7 * retainAll(c) retains only those elements of c and reports true
436     * if changed
437 dl 1.1 */
438     public void testRetainAll() {
439     LinkedTransferQueue q = populatedQueue(SIZE);
440     LinkedTransferQueue p = populatedQueue(SIZE);
441     for (int i = 0; i < SIZE; ++i) {
442     boolean changed = q.retainAll(p);
443     if (i == 0) {
444     assertFalse(changed);
445     } else {
446     assertTrue(changed);
447     }
448     assertTrue(q.containsAll(p));
449     assertEquals(SIZE - i, q.size());
450     p.remove();
451     }
452     }
453    
454     /**
455 jsr166 1.7 * removeAll(c) removes only those elements of c and reports true
456     * if changed
457 dl 1.1 */
458     public void testRemoveAll() {
459     for (int i = 1; i < SIZE; ++i) {
460     LinkedTransferQueue q = populatedQueue(SIZE);
461     LinkedTransferQueue p = populatedQueue(i);
462     assertTrue(q.removeAll(p));
463     assertEquals(SIZE - i, q.size());
464     for (int j = 0; j < i; ++j) {
465 jsr166 1.5 assertFalse(q.contains(p.remove()));
466 dl 1.1 }
467     }
468     }
469    
470     /**
471 jsr166 1.38 * toArray() contains all elements in FIFO order
472 dl 1.1 */
473 jsr166 1.38 public void testToArray() {
474 dl 1.1 LinkedTransferQueue q = populatedQueue(SIZE);
475 jsr166 1.81 Object[] a = q.toArray();
476     assertSame(Object[].class, a.getClass());
477     for (Object o : a)
478     assertSame(o, q.poll());
479     assertTrue(q.isEmpty());
480 dl 1.1 }
481    
482     /**
483 jsr166 1.38 * toArray(a) contains all elements in FIFO order
484 dl 1.1 */
485 jsr166 1.38 public void testToArray2() {
486 jsr166 1.5 LinkedTransferQueue<Integer> q = populatedQueue(SIZE);
487 dl 1.1 Integer[] ints = new Integer[SIZE];
488 jsr166 1.39 Integer[] array = q.toArray(ints);
489     assertSame(ints, array);
490 jsr166 1.81 for (Integer o : ints)
491     assertSame(o, q.poll());
492     assertTrue(q.isEmpty());
493 dl 1.1 }
494    
495     /**
496 jsr166 1.36 * toArray(incompatible array type) throws ArrayStoreException
497 dl 1.1 */
498     public void testToArray1_BadArg() {
499 jsr166 1.20 LinkedTransferQueue q = populatedQueue(SIZE);
500 dl 1.1 try {
501 jsr166 1.36 q.toArray(new String[10]);
502 dl 1.1 shouldThrow();
503 jsr166 1.17 } catch (ArrayStoreException success) {}
504 dl 1.1 }
505    
506     /**
507     * iterator iterates through all elements
508     */
509 jsr166 1.5 public void testIterator() throws InterruptedException {
510 dl 1.1 LinkedTransferQueue q = populatedQueue(SIZE);
511     Iterator it = q.iterator();
512 jsr166 1.57 int i;
513     for (i = 0; it.hasNext(); i++)
514     assertTrue(q.contains(it.next()));
515     assertEquals(i, SIZE);
516     assertIteratorExhausted(it);
517    
518     it = q.iterator();
519     for (i = 0; it.hasNext(); i++)
520     assertEquals(it.next(), q.take());
521 jsr166 1.10 assertEquals(i, SIZE);
522 jsr166 1.57 assertIteratorExhausted(it);
523     }
524    
525     /**
526     * iterator of empty collection has no elements
527     */
528     public void testEmptyIterator() {
529     assertIteratorExhausted(new LinkedTransferQueue().iterator());
530 dl 1.1 }
531    
532     /**
533 jsr166 1.12 * iterator.remove() removes current element
534 dl 1.1 */
535     public void testIteratorRemove() {
536     final LinkedTransferQueue q = new LinkedTransferQueue();
537     q.add(two);
538     q.add(one);
539     q.add(three);
540    
541     Iterator it = q.iterator();
542     it.next();
543     it.remove();
544    
545     it = q.iterator();
546 jsr166 1.24 assertSame(it.next(), one);
547     assertSame(it.next(), three);
548 dl 1.1 assertFalse(it.hasNext());
549     }
550    
551     /**
552     * iterator ordering is FIFO
553     */
554     public void testIteratorOrdering() {
555 jsr166 1.68 final LinkedTransferQueue<Integer> q = new LinkedTransferQueue<>();
556 jsr166 1.5 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
557 dl 1.1 q.add(one);
558     q.add(two);
559     q.add(three);
560 jsr166 1.5 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
561 dl 1.1 int k = 0;
562 jsr166 1.5 for (Integer n : q) {
563     assertEquals(++k, (int) n);
564 dl 1.1 }
565     assertEquals(3, k);
566     }
567    
568     /**
569     * Modifications do not cause iterators to fail
570     */
571     public void testWeaklyConsistentIteration() {
572     final LinkedTransferQueue q = new LinkedTransferQueue();
573     q.add(one);
574     q.add(two);
575     q.add(three);
576 jsr166 1.5 for (Iterator it = q.iterator(); it.hasNext();) {
577     q.remove();
578     it.next();
579 dl 1.1 }
580     assertEquals(0, q.size());
581     }
582    
583     /**
584     * toString contains toStrings of elements
585     */
586     public void testToString() {
587     LinkedTransferQueue q = populatedQueue(SIZE);
588     String s = q.toString();
589     for (int i = 0; i < SIZE; ++i) {
590 jsr166 1.46 assertTrue(s.contains(String.valueOf(i)));
591 dl 1.1 }
592     }
593    
594     /**
595     * offer transfers elements across Executor tasks
596     */
597     public void testOfferInExecutor() {
598     final LinkedTransferQueue q = new LinkedTransferQueue();
599 jsr166 1.46 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
600 jsr166 1.63 final ExecutorService executor = Executors.newFixedThreadPool(2);
601     try (PoolCleaner cleaner = cleaner(executor)) {
602 jsr166 1.7
603 jsr166 1.63 executor.execute(new CheckedRunnable() {
604     public void realRun() throws InterruptedException {
605     threadsStarted.await();
606 jsr166 1.66 long startTime = System.nanoTime();
607 jsr166 1.63 assertTrue(q.offer(one, LONG_DELAY_MS, MILLISECONDS));
608 jsr166 1.66 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
609 jsr166 1.63 }});
610 dl 1.1
611 jsr166 1.63 executor.execute(new CheckedRunnable() {
612     public void realRun() throws InterruptedException {
613     threadsStarted.await();
614     assertSame(one, q.take());
615     checkEmpty(q);
616     }});
617     }
618 dl 1.1 }
619    
620     /**
621 jsr166 1.13 * timed poll retrieves elements across Executor threads
622 dl 1.1 */
623     public void testPollInExecutor() {
624     final LinkedTransferQueue q = new LinkedTransferQueue();
625 jsr166 1.46 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
626 jsr166 1.63 final ExecutorService executor = Executors.newFixedThreadPool(2);
627     try (PoolCleaner cleaner = cleaner(executor)) {
628 jsr166 1.7
629 jsr166 1.63 executor.execute(new CheckedRunnable() {
630     public void realRun() throws InterruptedException {
631     assertNull(q.poll());
632     threadsStarted.await();
633 jsr166 1.66 long startTime = System.nanoTime();
634 jsr166 1.63 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
635 jsr166 1.66 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
636 jsr166 1.63 checkEmpty(q);
637     }});
638 dl 1.1
639 jsr166 1.63 executor.execute(new CheckedRunnable() {
640     public void realRun() throws InterruptedException {
641     threadsStarted.await();
642     q.put(one);
643     }});
644     }
645 dl 1.1 }
646    
647     /**
648 jsr166 1.79 * A deserialized/reserialized queue has same elements in same order
649 dl 1.1 */
650 jsr166 1.5 public void testSerialization() throws Exception {
651 jsr166 1.48 Queue x = populatedQueue(SIZE);
652     Queue y = serialClone(x);
653 dl 1.1
654 jsr166 1.52 assertNotSame(y, x);
655 jsr166 1.48 assertEquals(x.size(), y.size());
656     assertEquals(x.toString(), y.toString());
657     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
658     while (!x.isEmpty()) {
659     assertFalse(y.isEmpty());
660     assertEquals(x.remove(), y.remove());
661 dl 1.1 }
662 jsr166 1.48 assertTrue(y.isEmpty());
663 dl 1.1 }
664    
665     /**
666     * drainTo(c) empties queue into another collection c
667     */
668     public void testDrainTo() {
669     LinkedTransferQueue q = populatedQueue(SIZE);
670     ArrayList l = new ArrayList();
671     q.drainTo(l);
672 jsr166 1.50 assertEquals(0, q.size());
673     assertEquals(SIZE, l.size());
674 dl 1.1 for (int i = 0; i < SIZE; ++i) {
675 jsr166 1.51 assertEquals(i, l.get(i));
676 dl 1.1 }
677     q.add(zero);
678     q.add(one);
679     assertFalse(q.isEmpty());
680     assertTrue(q.contains(zero));
681     assertTrue(q.contains(one));
682     l.clear();
683     q.drainTo(l);
684 jsr166 1.50 assertEquals(0, q.size());
685     assertEquals(2, l.size());
686 dl 1.1 for (int i = 0; i < 2; ++i) {
687 jsr166 1.51 assertEquals(i, l.get(i));
688 dl 1.1 }
689     }
690    
691     /**
692 jsr166 1.13 * drainTo(c) empties full queue, unblocking a waiting put.
693 dl 1.1 */
694 jsr166 1.5 public void testDrainToWithActivePut() throws InterruptedException {
695 dl 1.1 final LinkedTransferQueue q = populatedQueue(SIZE);
696 jsr166 1.9 Thread t = newStartedThread(new CheckedRunnable() {
697 jsr166 1.21 public void realRun() {
698 jsr166 1.7 q.put(SIZE + 1);
699 jsr166 1.5 }});
700     ArrayList l = new ArrayList();
701     q.drainTo(l);
702     assertTrue(l.size() >= SIZE);
703 jsr166 1.51 for (int i = 0; i < SIZE; ++i)
704     assertEquals(i, l.get(i));
705 jsr166 1.66 awaitTermination(t);
706 jsr166 1.5 assertTrue(q.size() + l.size() >= SIZE);
707 dl 1.1 }
708    
709     /**
710 jsr166 1.26 * drainTo(c, n) empties first min(n, size) elements of queue into c
711 dl 1.1 */
712     public void testDrainToN() {
713     LinkedTransferQueue q = new LinkedTransferQueue();
714     for (int i = 0; i < SIZE + 2; ++i) {
715     for (int j = 0; j < SIZE; j++) {
716 jsr166 1.5 assertTrue(q.offer(j));
717 dl 1.1 }
718     ArrayList l = new ArrayList();
719     q.drainTo(l, i);
720     int k = (i < SIZE) ? i : SIZE;
721 jsr166 1.51 assertEquals(k, l.size());
722     assertEquals(SIZE - k, q.size());
723     for (int j = 0; j < k; ++j)
724     assertEquals(j, l.get(j));
725 jsr166 1.56 do {} while (q.poll() != null);
726 dl 1.1 }
727     }
728    
729 jsr166 1.3 /**
730 jsr166 1.13 * timed poll() or take() increments the waiting consumer count;
731     * offer(e) decrements the waiting consumer count
732 dl 1.1 */
733 jsr166 1.5 public void testWaitingConsumer() throws InterruptedException {
734     final LinkedTransferQueue q = new LinkedTransferQueue();
735 jsr166 1.50 assertEquals(0, q.getWaitingConsumerCount());
736 jsr166 1.13 assertFalse(q.hasWaitingConsumer());
737 jsr166 1.31 final CountDownLatch threadStarted = new CountDownLatch(1);
738 jsr166 1.9
739     Thread t = newStartedThread(new CheckedRunnable() {
740 jsr166 1.21 public void realRun() throws InterruptedException {
741 jsr166 1.31 threadStarted.countDown();
742 jsr166 1.66 long startTime = System.nanoTime();
743 jsr166 1.31 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
744 jsr166 1.50 assertEquals(0, q.getWaitingConsumerCount());
745 jsr166 1.22 assertFalse(q.hasWaitingConsumer());
746 jsr166 1.66 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
747 jsr166 1.9 }});
748    
749 jsr166 1.31 threadStarted.await();
750 jsr166 1.70 Callable<Boolean> oneConsumer
751     = new Callable<Boolean>() { public Boolean call() {
752     return q.hasWaitingConsumer()
753     && q.getWaitingConsumerCount() == 1; }};
754     waitForThreadToEnterWaitState(t, oneConsumer);
755 jsr166 1.31
756     assertTrue(q.offer(one));
757 jsr166 1.50 assertEquals(0, q.getWaitingConsumerCount());
758 jsr166 1.13 assertFalse(q.hasWaitingConsumer());
759 jsr166 1.31
760 jsr166 1.66 awaitTermination(t);
761 dl 1.1 }
762 jsr166 1.3
763     /**
764 jsr166 1.5 * transfer(null) throws NullPointerException
765 dl 1.1 */
766 jsr166 1.5 public void testTransfer1() throws InterruptedException {
767 dl 1.1 try {
768     LinkedTransferQueue q = new LinkedTransferQueue();
769     q.transfer(null);
770     shouldThrow();
771 jsr166 1.15 } catch (NullPointerException success) {}
772 dl 1.1 }
773    
774 jsr166 1.3 /**
775 jsr166 1.80 * transfer waits until a poll occurs. The transferred element
776 jsr166 1.69 * is returned by the associated poll.
777 dl 1.1 */
778 jsr166 1.5 public void testTransfer2() throws InterruptedException {
779 jsr166 1.68 final LinkedTransferQueue<Integer> q = new LinkedTransferQueue<>();
780 jsr166 1.31 final CountDownLatch threadStarted = new CountDownLatch(1);
781 jsr166 1.5
782 jsr166 1.9 Thread t = newStartedThread(new CheckedRunnable() {
783 jsr166 1.21 public void realRun() throws InterruptedException {
784 jsr166 1.31 threadStarted.countDown();
785 jsr166 1.34 q.transfer(five);
786 jsr166 1.31 checkEmpty(q);
787 jsr166 1.9 }});
788 dl 1.1
789 jsr166 1.31 threadStarted.await();
790 jsr166 1.70 Callable<Boolean> oneElement
791     = new Callable<Boolean>() { public Boolean call() {
792     return !q.isEmpty() && q.size() == 1; }};
793     waitForThreadToEnterWaitState(t, oneElement);
794    
795 jsr166 1.34 assertSame(five, q.poll());
796 jsr166 1.31 checkEmpty(q);
797 jsr166 1.66 awaitTermination(t);
798 dl 1.1 }
799 jsr166 1.3
800     /**
801 dl 1.6 * transfer waits until a poll occurs, and then transfers in fifo order
802 dl 1.1 */
803 jsr166 1.5 public void testTransfer3() throws InterruptedException {
804 jsr166 1.68 final LinkedTransferQueue<Integer> q = new LinkedTransferQueue<>();
805 jsr166 1.5
806 jsr166 1.9 Thread first = newStartedThread(new CheckedRunnable() {
807 jsr166 1.21 public void realRun() throws InterruptedException {
808 jsr166 1.32 q.transfer(four);
809 jsr166 1.71 assertFalse(q.contains(four));
810 jsr166 1.24 assertEquals(1, q.size());
811 jsr166 1.7 }});
812 jsr166 1.5
813 jsr166 1.9 Thread interruptedThread = newStartedThread(
814     new CheckedInterruptedRunnable() {
815 jsr166 1.21 public void realRun() throws InterruptedException {
816 jsr166 1.32 while (q.isEmpty())
817 jsr166 1.9 Thread.yield();
818 jsr166 1.32 q.transfer(five);
819 jsr166 1.9 }});
820 jsr166 1.5
821     while (q.size() < 2)
822     Thread.yield();
823     assertEquals(2, q.size());
824 jsr166 1.32 assertSame(four, q.poll());
825 jsr166 1.5 first.join();
826     assertEquals(1, q.size());
827     interruptedThread.interrupt();
828     interruptedThread.join();
829 jsr166 1.31 checkEmpty(q);
830 dl 1.1 }
831    
832     /**
833 dl 1.6 * transfer waits until a poll occurs, at which point the polling
834     * thread returns the element
835 dl 1.1 */
836 jsr166 1.5 public void testTransfer4() throws InterruptedException {
837 dl 1.1 final LinkedTransferQueue q = new LinkedTransferQueue();
838 jsr166 1.9
839     Thread t = newStartedThread(new CheckedRunnable() {
840 jsr166 1.21 public void realRun() throws InterruptedException {
841 jsr166 1.7 q.transfer(four);
842 jsr166 1.24 assertFalse(q.contains(four));
843     assertSame(three, q.poll());
844 jsr166 1.9 }});
845    
846 jsr166 1.31 while (q.isEmpty())
847     Thread.yield();
848     assertFalse(q.isEmpty());
849     assertEquals(1, q.size());
850 jsr166 1.5 assertTrue(q.offer(three));
851 jsr166 1.24 assertSame(four, q.poll());
852 jsr166 1.66 awaitTermination(t);
853 dl 1.1 }
854 jsr166 1.3
855     /**
856 jsr166 1.80 * transfer waits until a take occurs. The transferred element
857 jsr166 1.69 * is returned by the associated take.
858 dl 1.6 */
859     public void testTransfer5() throws InterruptedException {
860 jsr166 1.68 final LinkedTransferQueue<Integer> q = new LinkedTransferQueue<>();
861 dl 1.6
862 jsr166 1.9 Thread t = newStartedThread(new CheckedRunnable() {
863 jsr166 1.21 public void realRun() throws InterruptedException {
864 jsr166 1.31 q.transfer(four);
865 jsr166 1.12 checkEmpty(q);
866 jsr166 1.9 }});
867 dl 1.6
868 jsr166 1.31 while (q.isEmpty())
869     Thread.yield();
870     assertFalse(q.isEmpty());
871     assertEquals(1, q.size());
872     assertSame(four, q.take());
873 jsr166 1.12 checkEmpty(q);
874 jsr166 1.66 awaitTermination(t);
875 dl 1.6 }
876    
877     /**
878 jsr166 1.5 * tryTransfer(null) throws NullPointerException
879 dl 1.1 */
880     public void testTryTransfer1() {
881 jsr166 1.60 final LinkedTransferQueue q = new LinkedTransferQueue();
882 dl 1.1 try {
883     q.tryTransfer(null);
884 jsr166 1.8 shouldThrow();
885 jsr166 1.15 } catch (NullPointerException success) {}
886 dl 1.1 }
887 jsr166 1.3
888     /**
889 jsr166 1.5 * tryTransfer returns false and does not enqueue if there are no
890     * consumers waiting to poll or take.
891 dl 1.1 */
892 jsr166 1.12 public void testTryTransfer2() throws InterruptedException {
893 jsr166 1.5 final LinkedTransferQueue q = new LinkedTransferQueue();
894     assertFalse(q.tryTransfer(new Object()));
895     assertFalse(q.hasWaitingConsumer());
896 jsr166 1.12 checkEmpty(q);
897 dl 1.1 }
898 jsr166 1.3
899     /**
900 jsr166 1.5 * If there is a consumer waiting in timed poll, tryTransfer
901     * returns true while successfully transfering object.
902 dl 1.1 */
903 jsr166 1.5 public void testTryTransfer3() throws InterruptedException {
904     final Object hotPotato = new Object();
905     final LinkedTransferQueue q = new LinkedTransferQueue();
906 jsr166 1.9
907     Thread t = newStartedThread(new CheckedRunnable() {
908 jsr166 1.21 public void realRun() {
909 jsr166 1.7 while (! q.hasWaitingConsumer())
910     Thread.yield();
911 jsr166 1.24 assertTrue(q.hasWaitingConsumer());
912 jsr166 1.31 checkEmpty(q);
913 jsr166 1.24 assertTrue(q.tryTransfer(hotPotato));
914 jsr166 1.9 }});
915    
916 jsr166 1.66 long startTime = System.nanoTime();
917     assertSame(hotPotato, q.poll(LONG_DELAY_MS, MILLISECONDS));
918     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
919 jsr166 1.12 checkEmpty(q);
920 jsr166 1.66 awaitTermination(t);
921 jsr166 1.5 }
922 dl 1.1
923 jsr166 1.5 /**
924     * If there is a consumer waiting in take, tryTransfer returns
925     * true while successfully transfering object.
926     */
927     public void testTryTransfer4() throws InterruptedException {
928     final Object hotPotato = new Object();
929     final LinkedTransferQueue q = new LinkedTransferQueue();
930 jsr166 1.9
931     Thread t = newStartedThread(new CheckedRunnable() {
932 jsr166 1.21 public void realRun() {
933 jsr166 1.7 while (! q.hasWaitingConsumer())
934     Thread.yield();
935 jsr166 1.24 assertTrue(q.hasWaitingConsumer());
936 jsr166 1.31 checkEmpty(q);
937 jsr166 1.24 assertTrue(q.tryTransfer(hotPotato));
938 jsr166 1.9 }});
939    
940 jsr166 1.23 assertSame(q.take(), hotPotato);
941 jsr166 1.12 checkEmpty(q);
942 jsr166 1.66 awaitTermination(t);
943 dl 1.1 }
944    
945 jsr166 1.3 /**
946 jsr166 1.46 * tryTransfer blocks interruptibly if no takers
947 dl 1.1 */
948 jsr166 1.5 public void testTryTransfer5() throws InterruptedException {
949 dl 1.1 final LinkedTransferQueue q = new LinkedTransferQueue();
950 jsr166 1.46 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
951 jsr166 1.40 assertTrue(q.isEmpty());
952 jsr166 1.9
953 jsr166 1.31 Thread t = newStartedThread(new CheckedRunnable() {
954 jsr166 1.21 public void realRun() throws InterruptedException {
955 jsr166 1.66 long startTime = System.nanoTime();
956 jsr166 1.46 Thread.currentThread().interrupt();
957     try {
958 jsr166 1.82 q.tryTransfer(new Object(), randomTimeout(), randomTimeUnit());
959 jsr166 1.46 shouldThrow();
960     } catch (InterruptedException success) {}
961     assertFalse(Thread.interrupted());
962    
963     pleaseInterrupt.countDown();
964 jsr166 1.31 try {
965     q.tryTransfer(new Object(), LONG_DELAY_MS, MILLISECONDS);
966     shouldThrow();
967     } catch (InterruptedException success) {}
968 jsr166 1.46 assertFalse(Thread.interrupted());
969 jsr166 1.82
970 jsr166 1.66 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
971 jsr166 1.5 }});
972 jsr166 1.9
973 jsr166 1.46 await(pleaseInterrupt);
974 jsr166 1.82 if (randomBoolean()) assertThreadBlocks(t, Thread.State.TIMED_WAITING);
975 jsr166 1.31 t.interrupt();
976 jsr166 1.46 awaitTermination(t);
977 jsr166 1.31 checkEmpty(q);
978 dl 1.1 }
979    
980 jsr166 1.3 /**
981 jsr166 1.33 * tryTransfer gives up after the timeout and returns false
982 dl 1.1 */
983 jsr166 1.5 public void testTryTransfer6() throws InterruptedException {
984 dl 1.1 final LinkedTransferQueue q = new LinkedTransferQueue();
985 jsr166 1.9
986     Thread t = newStartedThread(new CheckedRunnable() {
987 jsr166 1.21 public void realRun() throws InterruptedException {
988 jsr166 1.65 long startTime = System.nanoTime();
989 jsr166 1.23 assertFalse(q.tryTransfer(new Object(),
990 jsr166 1.46 timeoutMillis(), MILLISECONDS));
991 jsr166 1.65 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
992 jsr166 1.32 checkEmpty(q);
993 jsr166 1.9 }});
994    
995 jsr166 1.46 awaitTermination(t);
996 jsr166 1.27 checkEmpty(q);
997 dl 1.1 }
998    
999 jsr166 1.3 /**
1000 dl 1.1 * tryTransfer waits for any elements previously in to be removed
1001     * before transfering to a poll or take
1002     */
1003 jsr166 1.5 public void testTryTransfer7() throws InterruptedException {
1004 dl 1.1 final LinkedTransferQueue q = new LinkedTransferQueue();
1005 jsr166 1.5 assertTrue(q.offer(four));
1006 jsr166 1.9
1007     Thread t = newStartedThread(new CheckedRunnable() {
1008 jsr166 1.21 public void realRun() throws InterruptedException {
1009 jsr166 1.66 long startTime = System.nanoTime();
1010     assertTrue(q.tryTransfer(five, LONG_DELAY_MS, MILLISECONDS));
1011     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1012 jsr166 1.31 checkEmpty(q);
1013 jsr166 1.9 }});
1014    
1015 jsr166 1.32 while (q.size() != 2)
1016     Thread.yield();
1017 jsr166 1.5 assertEquals(2, q.size());
1018 jsr166 1.24 assertSame(four, q.poll());
1019     assertSame(five, q.poll());
1020 jsr166 1.12 checkEmpty(q);
1021 jsr166 1.66 awaitTermination(t);
1022 dl 1.1 }
1023    
1024 jsr166 1.3 /**
1025 jsr166 1.41 * tryTransfer attempts to enqueue into the queue and fails
1026     * returning false not enqueueing and the successive poll is null
1027 dl 1.1 */
1028 jsr166 1.5 public void testTryTransfer8() throws InterruptedException {
1029 dl 1.1 final LinkedTransferQueue q = new LinkedTransferQueue();
1030 jsr166 1.5 assertTrue(q.offer(four));
1031     assertEquals(1, q.size());
1032 jsr166 1.65 long startTime = System.nanoTime();
1033 jsr166 1.46 assertFalse(q.tryTransfer(five, timeoutMillis(), MILLISECONDS));
1034 jsr166 1.65 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1035 jsr166 1.5 assertEquals(1, q.size());
1036 jsr166 1.24 assertSame(four, q.poll());
1037 jsr166 1.13 assertNull(q.poll());
1038 jsr166 1.12 checkEmpty(q);
1039 dl 1.1 }
1040    
1041 jsr166 1.5 private LinkedTransferQueue<Integer> populatedQueue(int n) {
1042 jsr166 1.68 LinkedTransferQueue<Integer> q = new LinkedTransferQueue<>();
1043 jsr166 1.31 checkEmpty(q);
1044 jsr166 1.5 for (int i = 0; i < n; i++) {
1045     assertEquals(i, q.size());
1046 dl 1.1 assertTrue(q.offer(i));
1047 jsr166 1.5 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1048 dl 1.1 }
1049     assertFalse(q.isEmpty());
1050     return q;
1051     }
1052 jsr166 1.53
1053     /**
1054     * remove(null), contains(null) always return false
1055     */
1056     public void testNeverContainsNull() {
1057     Collection<?>[] qs = {
1058     new LinkedTransferQueue<Object>(),
1059     populatedQueue(2),
1060     };
1061    
1062     for (Collection<?> q : qs) {
1063     assertFalse(q.contains(null));
1064     assertFalse(q.remove(null));
1065     }
1066     }
1067 dl 1.1 }