ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.26
Committed: Fri May 27 19:49:56 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.25: +1 -3 lines
Log Message:
indexOf => contains

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