ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.15
Committed: Sat Nov 21 17:38:05 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.14: +2 -4 lines
Log Message:
improve exception handling

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