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

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