ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedTransferQueueTest.java
Revision: 1.17
Committed: Sat Nov 21 19:45:16 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +22 -40 lines
Log Message:
add missing shouldThrow

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