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

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