ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.37
Committed: Sat Apr 25 04:55:30 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.36: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.6 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.25 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.8 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.27 import java.util.Arrays;
10     import java.util.Collection;
11     import java.util.Iterator;
12     import java.util.NoSuchElementException;
13     import java.util.Queue;
14     import java.util.concurrent.ConcurrentLinkedQueue;
15 dl 1.1
16 jsr166 1.32 import junit.framework.Test;
17     import junit.framework.TestSuite;
18    
19 dl 1.3 public class ConcurrentLinkedQueueTest extends JSR166TestCase {
20 dl 1.1
21     public static void main(String[] args) {
22 jsr166 1.37 main(suite(), args);
23 dl 1.1 }
24    
25     public static Test suite() {
26 jsr166 1.12 return new TestSuite(ConcurrentLinkedQueueTest.class);
27 dl 1.1 }
28    
29     /**
30 jsr166 1.29 * Returns a new queue of given size containing consecutive
31 dl 1.1 * Integers 0 ... n.
32     */
33 jsr166 1.23 private ConcurrentLinkedQueue<Integer> populatedQueue(int n) {
34     ConcurrentLinkedQueue<Integer> q = new ConcurrentLinkedQueue<Integer>();
35 dl 1.1 assertTrue(q.isEmpty());
36 jsr166 1.12 for (int i = 0; i < n; ++i)
37     assertTrue(q.offer(new Integer(i)));
38 dl 1.1 assertFalse(q.isEmpty());
39 jsr166 1.12 assertEquals(n, q.size());
40 dl 1.1 return q;
41     }
42 jsr166 1.8
43 dl 1.4 /**
44 dl 1.5 * new queue is empty
45 dl 1.4 */
46     public void testConstructor1() {
47 dl 1.1 assertEquals(0, new ConcurrentLinkedQueue().size());
48     }
49    
50 dl 1.4 /**
51 jsr166 1.19 * Initializing from null Collection throws NPE
52 dl 1.4 */
53 dl 1.1 public void testConstructor3() {
54     try {
55 jsr166 1.36 new ConcurrentLinkedQueue((Collection)null);
56 dl 1.4 shouldThrow();
57 jsr166 1.13 } catch (NullPointerException success) {}
58 dl 1.1 }
59    
60 dl 1.4 /**
61 dl 1.5 * Initializing from Collection of null elements throws NPE
62 dl 1.4 */
63     public void testConstructor4() {
64 dl 1.1 try {
65 dl 1.3 Integer[] ints = new Integer[SIZE];
66 jsr166 1.36 new ConcurrentLinkedQueue(Arrays.asList(ints));
67 dl 1.4 shouldThrow();
68 jsr166 1.13 } catch (NullPointerException success) {}
69 dl 1.1 }
70    
71 dl 1.4 /**
72 dl 1.5 * Initializing from Collection with some null elements throws NPE
73 dl 1.4 */
74     public void testConstructor5() {
75 dl 1.1 try {
76 dl 1.3 Integer[] ints = new Integer[SIZE];
77     for (int i = 0; i < SIZE-1; ++i)
78 dl 1.1 ints[i] = new Integer(i);
79 jsr166 1.36 new ConcurrentLinkedQueue(Arrays.asList(ints));
80 dl 1.4 shouldThrow();
81 jsr166 1.15 } catch (NullPointerException success) {}
82 dl 1.1 }
83    
84 dl 1.4 /**
85 dl 1.5 * Queue contains all elements of collection used to initialize
86 dl 1.4 */
87     public void testConstructor6() {
88 jsr166 1.14 Integer[] ints = new Integer[SIZE];
89     for (int i = 0; i < SIZE; ++i)
90     ints[i] = new Integer(i);
91     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
92     for (int i = 0; i < SIZE; ++i)
93     assertEquals(ints[i], q.poll());
94 dl 1.1 }
95    
96 dl 1.4 /**
97 dl 1.5 * isEmpty is true before add, false after
98 dl 1.4 */
99 dl 1.1 public void testEmpty() {
100     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
101     assertTrue(q.isEmpty());
102 dl 1.3 q.add(one);
103 dl 1.1 assertFalse(q.isEmpty());
104 dl 1.3 q.add(two);
105 dl 1.1 q.remove();
106     q.remove();
107     assertTrue(q.isEmpty());
108     }
109    
110 dl 1.4 /**
111 dl 1.5 * size changes when elements added and removed
112 dl 1.4 */
113 dl 1.1 public void testSize() {
114 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
115     for (int i = 0; i < SIZE; ++i) {
116     assertEquals(SIZE-i, q.size());
117 dl 1.1 q.remove();
118     }
119 dl 1.3 for (int i = 0; i < SIZE; ++i) {
120 dl 1.1 assertEquals(i, q.size());
121     q.add(new Integer(i));
122     }
123     }
124    
125 dl 1.4 /**
126 dl 1.5 * offer(null) throws NPE
127 dl 1.4 */
128     public void testOfferNull() {
129 jsr166 1.12 try {
130 dl 1.1 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
131     q.offer(null);
132 dl 1.4 shouldThrow();
133 jsr166 1.13 } catch (NullPointerException success) {}
134 dl 1.1 }
135    
136 dl 1.4 /**
137 dl 1.5 * add(null) throws NPE
138     */
139     public void testAddNull() {
140 jsr166 1.12 try {
141 dl 1.5 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
142     q.add(null);
143     shouldThrow();
144 jsr166 1.13 } catch (NullPointerException success) {}
145 dl 1.5 }
146    
147     /**
148     * Offer returns true
149 dl 1.4 */
150 dl 1.1 public void testOffer() {
151     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
152 dl 1.3 assertTrue(q.offer(zero));
153     assertTrue(q.offer(one));
154 dl 1.1 }
155    
156 dl 1.4 /**
157 dl 1.5 * add returns true
158 dl 1.4 */
159     public void testAdd() {
160 dl 1.1 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
161 dl 1.3 for (int i = 0; i < SIZE; ++i) {
162 dl 1.1 assertEquals(i, q.size());
163     assertTrue(q.add(new Integer(i)));
164     }
165     }
166    
167 dl 1.4 /**
168 dl 1.5 * addAll(null) throws NPE
169 dl 1.4 */
170     public void testAddAll1() {
171 dl 1.1 try {
172     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
173     q.addAll(null);
174 dl 1.4 shouldThrow();
175 jsr166 1.13 } catch (NullPointerException success) {}
176 dl 1.1 }
177 dl 1.5
178     /**
179     * addAll(this) throws IAE
180     */
181     public void testAddAllSelf() {
182     try {
183     ConcurrentLinkedQueue q = populatedQueue(SIZE);
184     q.addAll(q);
185     shouldThrow();
186 jsr166 1.13 } catch (IllegalArgumentException success) {}
187 dl 1.5 }
188    
189 dl 1.4 /**
190 dl 1.5 * addAll of a collection with null elements throws NPE
191 dl 1.4 */
192     public void testAddAll2() {
193 dl 1.1 try {
194     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
195 dl 1.3 Integer[] ints = new Integer[SIZE];
196 dl 1.1 q.addAll(Arrays.asList(ints));
197 dl 1.4 shouldThrow();
198 jsr166 1.13 } catch (NullPointerException success) {}
199 dl 1.1 }
200 jsr166 1.18
201 dl 1.4 /**
202 jsr166 1.18 * addAll of a collection with any null elements throws NPE after
203 dl 1.5 * possibly adding some elements
204 dl 1.4 */
205     public void testAddAll3() {
206 dl 1.1 try {
207     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
208 dl 1.3 Integer[] ints = new Integer[SIZE];
209     for (int i = 0; i < SIZE-1; ++i)
210 dl 1.1 ints[i] = new Integer(i);
211     q.addAll(Arrays.asList(ints));
212 dl 1.4 shouldThrow();
213 jsr166 1.13 } catch (NullPointerException success) {}
214 dl 1.1 }
215    
216 dl 1.4 /**
217 dl 1.5 * Queue contains all elements, in traversal order, of successful addAll
218 dl 1.4 */
219     public void testAddAll5() {
220 jsr166 1.14 Integer[] empty = new Integer[0];
221     Integer[] ints = new Integer[SIZE];
222     for (int i = 0; i < SIZE; ++i)
223     ints[i] = new Integer(i);
224     ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
225     assertFalse(q.addAll(Arrays.asList(empty)));
226     assertTrue(q.addAll(Arrays.asList(ints)));
227     for (int i = 0; i < SIZE; ++i)
228     assertEquals(ints[i], q.poll());
229 dl 1.1 }
230    
231 dl 1.4 /**
232 dl 1.5 * poll succeeds unless empty
233 dl 1.4 */
234     public void testPoll() {
235 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
236     for (int i = 0; i < SIZE; ++i) {
237 jsr166 1.16 assertEquals(i, q.poll());
238 dl 1.1 }
239 jsr166 1.12 assertNull(q.poll());
240 dl 1.1 }
241    
242 dl 1.4 /**
243 dl 1.5 * peek returns next element, or null if empty
244 dl 1.4 */
245     public void testPeek() {
246 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
247     for (int i = 0; i < SIZE; ++i) {
248 jsr166 1.16 assertEquals(i, q.peek());
249     assertEquals(i, q.poll());
250 dl 1.1 assertTrue(q.peek() == null ||
251 jsr166 1.16 !q.peek().equals(i));
252 dl 1.1 }
253 jsr166 1.12 assertNull(q.peek());
254 dl 1.1 }
255    
256 dl 1.4 /**
257 dl 1.5 * element returns next element, or throws NSEE if empty
258 dl 1.4 */
259     public void testElement() {
260 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
261     for (int i = 0; i < SIZE; ++i) {
262 jsr166 1.16 assertEquals(i, q.element());
263     assertEquals(i, q.poll());
264 dl 1.1 }
265     try {
266     q.element();
267 dl 1.4 shouldThrow();
268 jsr166 1.13 } catch (NoSuchElementException success) {}
269 dl 1.1 }
270    
271 dl 1.4 /**
272 jsr166 1.19 * remove removes next element, or throws NSEE if empty
273 dl 1.4 */
274     public void testRemove() {
275 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
276     for (int i = 0; i < SIZE; ++i) {
277 jsr166 1.16 assertEquals(i, q.remove());
278 dl 1.1 }
279     try {
280     q.remove();
281 dl 1.4 shouldThrow();
282 jsr166 1.13 } catch (NoSuchElementException success) {}
283 dl 1.1 }
284    
285 dl 1.4 /**
286 dl 1.5 * remove(x) removes x and returns true if present
287 dl 1.4 */
288     public void testRemoveElement() {
289 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
290 jsr166 1.33 for (int i = 1; i < SIZE; i += 2) {
291 jsr166 1.24 assertTrue(q.contains(i));
292     assertTrue(q.remove(i));
293     assertFalse(q.contains(i));
294     assertTrue(q.contains(i-1));
295 dl 1.1 }
296 jsr166 1.33 for (int i = 0; i < SIZE; i += 2) {
297 jsr166 1.24 assertTrue(q.contains(i));
298     assertTrue(q.remove(i));
299     assertFalse(q.contains(i));
300     assertFalse(q.remove(i+1));
301     assertFalse(q.contains(i+1));
302 dl 1.1 }
303 dl 1.2 assertTrue(q.isEmpty());
304 dl 1.1 }
305 jsr166 1.8
306 dl 1.4 /**
307 dl 1.5 * contains(x) reports true when elements added but not yet removed
308 dl 1.4 */
309     public void testContains() {
310 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
311     for (int i = 0; i < SIZE; ++i) {
312 dl 1.1 assertTrue(q.contains(new Integer(i)));
313     q.poll();
314     assertFalse(q.contains(new Integer(i)));
315     }
316     }
317    
318 dl 1.4 /**
319 dl 1.5 * clear removes all elements
320 dl 1.4 */
321     public void testClear() {
322 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
323 dl 1.1 q.clear();
324     assertTrue(q.isEmpty());
325     assertEquals(0, q.size());
326 dl 1.3 q.add(one);
327 dl 1.1 assertFalse(q.isEmpty());
328     q.clear();
329     assertTrue(q.isEmpty());
330     }
331    
332 dl 1.4 /**
333 dl 1.5 * containsAll(c) is true when c contains a subset of elements
334 dl 1.4 */
335     public void testContainsAll() {
336 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
337 dl 1.1 ConcurrentLinkedQueue p = new ConcurrentLinkedQueue();
338 dl 1.3 for (int i = 0; i < SIZE; ++i) {
339 dl 1.1 assertTrue(q.containsAll(p));
340     assertFalse(p.containsAll(q));
341     p.add(new Integer(i));
342     }
343     assertTrue(p.containsAll(q));
344     }
345    
346 dl 1.4 /**
347 dl 1.5 * retainAll(c) retains only those elements of c and reports true if change
348 dl 1.4 */
349     public void testRetainAll() {
350 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
351     ConcurrentLinkedQueue p = populatedQueue(SIZE);
352     for (int i = 0; i < SIZE; ++i) {
353 dl 1.1 boolean changed = q.retainAll(p);
354     if (i == 0)
355     assertFalse(changed);
356     else
357     assertTrue(changed);
358    
359     assertTrue(q.containsAll(p));
360 dl 1.3 assertEquals(SIZE-i, q.size());
361 dl 1.1 p.remove();
362     }
363     }
364    
365 dl 1.4 /**
366 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
367 dl 1.4 */
368     public void testRemoveAll() {
369 dl 1.3 for (int i = 1; i < SIZE; ++i) {
370     ConcurrentLinkedQueue q = populatedQueue(SIZE);
371     ConcurrentLinkedQueue p = populatedQueue(i);
372 dl 1.1 assertTrue(q.removeAll(p));
373 dl 1.3 assertEquals(SIZE-i, q.size());
374 dl 1.1 for (int j = 0; j < i; ++j) {
375 jsr166 1.34 Integer x = (Integer)(p.remove());
376     assertFalse(q.contains(x));
377 dl 1.1 }
378     }
379     }
380    
381 dl 1.4 /**
382 jsr166 1.22 * toArray contains all elements in FIFO order
383 dl 1.4 */
384     public void testToArray() {
385 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
386 jsr166 1.12 Object[] o = q.toArray();
387     for (int i = 0; i < o.length; i++)
388 jsr166 1.22 assertSame(o[i], q.poll());
389 dl 1.1 }
390    
391 dl 1.4 /**
392 jsr166 1.22 * toArray(a) contains all elements in FIFO order
393 dl 1.4 */
394     public void testToArray2() {
395 jsr166 1.23 ConcurrentLinkedQueue<Integer> q = populatedQueue(SIZE);
396 jsr166 1.12 Integer[] ints = new Integer[SIZE];
397 jsr166 1.23 Integer[] array = q.toArray(ints);
398     assertSame(ints, array);
399 jsr166 1.9 for (int i = 0; i < ints.length; i++)
400 jsr166 1.22 assertSame(ints[i], q.poll());
401 dl 1.1 }
402 dl 1.5
403     /**
404 jsr166 1.21 * toArray(null) throws NullPointerException
405 dl 1.5 */
406 jsr166 1.21 public void testToArray_NullArg() {
407 jsr166 1.16 ConcurrentLinkedQueue q = populatedQueue(SIZE);
408 jsr166 1.12 try {
409 jsr166 1.21 q.toArray(null);
410 jsr166 1.12 shouldThrow();
411     } catch (NullPointerException success) {}
412 dl 1.5 }
413    
414     /**
415 jsr166 1.20 * toArray(incompatible array type) throws ArrayStoreException
416 dl 1.5 */
417     public void testToArray1_BadArg() {
418 jsr166 1.16 ConcurrentLinkedQueue q = populatedQueue(SIZE);
419 jsr166 1.12 try {
420 jsr166 1.20 q.toArray(new String[10]);
421 jsr166 1.12 shouldThrow();
422     } catch (ArrayStoreException success) {}
423 dl 1.5 }
424 jsr166 1.8
425 dl 1.4 /**
426 jsr166 1.19 * iterator iterates through all elements
427 dl 1.4 */
428     public void testIterator() {
429 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
430 jsr166 1.12 Iterator it = q.iterator();
431 jsr166 1.35 int i;
432     for (i = 0; it.hasNext(); i++)
433 dl 1.1 assertTrue(q.contains(it.next()));
434 dl 1.3 assertEquals(i, SIZE);
435 jsr166 1.35 assertIteratorExhausted(it);
436     }
437    
438     /**
439     * iterator of empty collection has no elements
440     */
441     public void testEmptyIterator() {
442     assertIteratorExhausted(new ConcurrentLinkedQueue().iterator());
443 dl 1.1 }
444    
445 dl 1.4 /**
446 dl 1.5 * iterator ordering is FIFO
447 dl 1.4 */
448 dl 1.1 public void testIteratorOrdering() {
449     final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
450 dl 1.3 q.add(one);
451     q.add(two);
452     q.add(three);
453 dl 1.1
454     int k = 0;
455     for (Iterator it = q.iterator(); it.hasNext();) {
456 jsr166 1.16 assertEquals(++k, it.next());
457 dl 1.1 }
458    
459 dl 1.4 assertEquals(3, k);
460 dl 1.1 }
461    
462 dl 1.4 /**
463 dl 1.5 * Modifications do not cause iterators to fail
464 dl 1.4 */
465 jsr166 1.18 public void testWeaklyConsistentIteration() {
466 dl 1.1 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
467 dl 1.3 q.add(one);
468     q.add(two);
469     q.add(three);
470 dl 1.1
471 jsr166 1.13 for (Iterator it = q.iterator(); it.hasNext();) {
472     q.remove();
473     it.next();
474 dl 1.1 }
475    
476     assertEquals("queue should be empty again", 0, q.size());
477     }
478    
479 dl 1.4 /**
480 dl 1.5 * iterator.remove removes current element
481 dl 1.4 */
482 jsr166 1.18 public void testIteratorRemove() {
483 dl 1.1 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
484 dl 1.3 q.add(one);
485     q.add(two);
486     q.add(three);
487 dl 1.1 Iterator it = q.iterator();
488     it.next();
489     it.remove();
490     it = q.iterator();
491 jsr166 1.17 assertSame(it.next(), two);
492     assertSame(it.next(), three);
493 dl 1.1 assertFalse(it.hasNext());
494     }
495    
496 dl 1.4 /**
497 dl 1.5 * toString contains toStrings of elements
498 dl 1.4 */
499     public void testToString() {
500 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
501 dl 1.1 String s = q.toString();
502 dl 1.3 for (int i = 0; i < SIZE; ++i) {
503 jsr166 1.26 assertTrue(s.contains(String.valueOf(i)));
504 dl 1.1 }
505 jsr166 1.8 }
506 dl 1.2
507 dl 1.4 /**
508 dl 1.5 * A deserialized serialized queue has same elements in same order
509 dl 1.4 */
510 jsr166 1.13 public void testSerialization() throws Exception {
511 jsr166 1.27 Queue x = populatedQueue(SIZE);
512     Queue y = serialClone(x);
513    
514 jsr166 1.30 assertNotSame(x, y);
515 jsr166 1.27 assertEquals(x.size(), y.size());
516     assertEquals(x.toString(), y.toString());
517     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
518     while (!x.isEmpty()) {
519     assertFalse(y.isEmpty());
520     assertEquals(x.remove(), y.remove());
521     }
522     assertTrue(y.isEmpty());
523 dl 1.2 }
524 dl 1.1
525 jsr166 1.31 /**
526     * remove(null), contains(null) always return false
527     */
528     public void testNeverContainsNull() {
529     Collection<?>[] qs = {
530     new ConcurrentLinkedQueue<Object>(),
531     populatedQueue(2),
532     };
533    
534     for (Collection<?> q : qs) {
535     assertFalse(q.contains(null));
536     assertFalse(q.remove(null));
537     }
538     }
539 dl 1.1 }