ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.42
Committed: Sun Oct 16 20:44:18 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.41: +2 -1 lines
Log Message:
improve populatedFoo methods

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