ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.49
Committed: Fri Jun 22 00:04:58 2018 UTC (5 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.48: +1 -1 lines
Log Message:
sync upstream changes

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