ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.74
Committed: Sat May 13 22:49:01 2017 UTC (7 years ago) by jsr166
Branch: MAIN
Changes since 1.73: +1 -1 lines
Log Message:
claw back some millis using assertThreadBlocks

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