ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.24
Committed: Tue Dec 1 09:56:28 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.23: +20 -20 lines
Log Message:
use stricter assertions, e.g. assertSame

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