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