ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.45
Committed: Sat Mar 11 18:20:46 2017 UTC (7 years, 2 months ago) by jsr166
Branch: MAIN
Changes since 1.44: +1 -1 lines
Log Message:
make some methods static as suggested by errorprone [MethodCanBeStatic]

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 dl 1.5 * addAll(null) throws NPE
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     * addAll(this) throws IAE
187     */
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 dl 1.5 * addAll of a collection with null elements throws NPE
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.12 Object[] o = q.toArray();
393     for (int i = 0; i < o.length; i++)
394 jsr166 1.22 assertSame(o[i], q.poll());
395 dl 1.1 }
396    
397 dl 1.4 /**
398 jsr166 1.22 * toArray(a) contains all elements in FIFO order
399 dl 1.4 */
400     public void testToArray2() {
401 jsr166 1.23 ConcurrentLinkedQueue<Integer> q = populatedQueue(SIZE);
402 jsr166 1.12 Integer[] ints = new Integer[SIZE];
403 jsr166 1.23 Integer[] array = q.toArray(ints);
404     assertSame(ints, array);
405 jsr166 1.9 for (int i = 0; i < ints.length; i++)
406 jsr166 1.22 assertSame(ints[i], q.poll());
407 dl 1.1 }
408 dl 1.5
409     /**
410 jsr166 1.21 * toArray(null) throws NullPointerException
411 dl 1.5 */
412 jsr166 1.21 public void testToArray_NullArg() {
413 jsr166 1.16 ConcurrentLinkedQueue q = populatedQueue(SIZE);
414 jsr166 1.12 try {
415 jsr166 1.21 q.toArray(null);
416 jsr166 1.12 shouldThrow();
417     } catch (NullPointerException success) {}
418 dl 1.5 }
419    
420     /**
421 jsr166 1.20 * toArray(incompatible array type) throws ArrayStoreException
422 dl 1.5 */
423     public void testToArray1_BadArg() {
424 jsr166 1.16 ConcurrentLinkedQueue q = populatedQueue(SIZE);
425 jsr166 1.12 try {
426 jsr166 1.20 q.toArray(new String[10]);
427 jsr166 1.12 shouldThrow();
428     } catch (ArrayStoreException success) {}
429 dl 1.5 }
430 jsr166 1.8
431 dl 1.4 /**
432 jsr166 1.19 * iterator iterates through all elements
433 dl 1.4 */
434     public void testIterator() {
435 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
436 jsr166 1.12 Iterator it = q.iterator();
437 jsr166 1.35 int i;
438     for (i = 0; it.hasNext(); i++)
439 dl 1.1 assertTrue(q.contains(it.next()));
440 dl 1.3 assertEquals(i, SIZE);
441 jsr166 1.35 assertIteratorExhausted(it);
442     }
443    
444     /**
445     * iterator of empty collection has no elements
446     */
447     public void testEmptyIterator() {
448     assertIteratorExhausted(new ConcurrentLinkedQueue().iterator());
449 dl 1.1 }
450    
451 dl 1.4 /**
452 dl 1.5 * iterator ordering is FIFO
453 dl 1.4 */
454 dl 1.1 public void testIteratorOrdering() {
455     final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
456 dl 1.3 q.add(one);
457     q.add(two);
458     q.add(three);
459 dl 1.1
460     int k = 0;
461     for (Iterator it = q.iterator(); it.hasNext();) {
462 jsr166 1.16 assertEquals(++k, it.next());
463 dl 1.1 }
464    
465 dl 1.4 assertEquals(3, k);
466 dl 1.1 }
467    
468 dl 1.4 /**
469 dl 1.5 * Modifications do not cause iterators to fail
470 dl 1.4 */
471 jsr166 1.18 public void testWeaklyConsistentIteration() {
472 dl 1.1 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
473 dl 1.3 q.add(one);
474     q.add(two);
475     q.add(three);
476 dl 1.1
477 jsr166 1.13 for (Iterator it = q.iterator(); it.hasNext();) {
478     q.remove();
479     it.next();
480 dl 1.1 }
481    
482     assertEquals("queue should be empty again", 0, q.size());
483     }
484    
485 dl 1.4 /**
486 dl 1.5 * iterator.remove removes current element
487 dl 1.4 */
488 jsr166 1.18 public void testIteratorRemove() {
489 dl 1.1 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
490 dl 1.3 q.add(one);
491     q.add(two);
492     q.add(three);
493 dl 1.1 Iterator it = q.iterator();
494     it.next();
495     it.remove();
496     it = q.iterator();
497 jsr166 1.17 assertSame(it.next(), two);
498     assertSame(it.next(), three);
499 dl 1.1 assertFalse(it.hasNext());
500     }
501    
502 dl 1.4 /**
503 dl 1.5 * toString contains toStrings of elements
504 dl 1.4 */
505     public void testToString() {
506 dl 1.3 ConcurrentLinkedQueue q = populatedQueue(SIZE);
507 dl 1.1 String s = q.toString();
508 dl 1.3 for (int i = 0; i < SIZE; ++i) {
509 jsr166 1.26 assertTrue(s.contains(String.valueOf(i)));
510 dl 1.1 }
511 jsr166 1.8 }
512 dl 1.2
513 dl 1.4 /**
514 dl 1.5 * A deserialized serialized queue has same elements in same order
515 dl 1.4 */
516 jsr166 1.13 public void testSerialization() throws Exception {
517 jsr166 1.27 Queue x = populatedQueue(SIZE);
518     Queue y = serialClone(x);
519    
520 jsr166 1.30 assertNotSame(x, y);
521 jsr166 1.27 assertEquals(x.size(), y.size());
522     assertEquals(x.toString(), y.toString());
523     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
524     while (!x.isEmpty()) {
525     assertFalse(y.isEmpty());
526     assertEquals(x.remove(), y.remove());
527     }
528     assertTrue(y.isEmpty());
529 dl 1.2 }
530 dl 1.1
531 jsr166 1.31 /**
532     * remove(null), contains(null) always return false
533     */
534     public void testNeverContainsNull() {
535     Collection<?>[] qs = {
536     new ConcurrentLinkedQueue<Object>(),
537     populatedQueue(2),
538     };
539    
540     for (Collection<?> q : qs) {
541     assertFalse(q.contains(null));
542     assertFalse(q.remove(null));
543     }
544     }
545 dl 1.1 }