ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.14
Committed: Sat Nov 21 10:29:50 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.13: +15 -21 lines
Log Message:
improve exception handling

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