ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.65
Committed: Tue Oct 6 00:36:55 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.64: +6 -6 lines
Log Message:
t0 -> startTime

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