ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.61
Committed: Sat May 23 00:53:08 2015 UTC (8 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.60: +1 -1 lines
Log Message:
whitespace

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