ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.25
Committed: Tue Mar 15 19:47:06 2011 UTC (13 years, 2 months ago) by jsr166
Branch: MAIN
CVS Tags: release-1_7_0
Changes since 1.24: +1 -1 lines
Log Message:
Update Creative Commons license URL in legal notices

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