ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentLinkedQueueTest.java
Revision: 1.41
Committed: Sun Oct 16 20:16:36 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.40: +9 -1 lines
Log Message:
extend CollectionImplementation mechanism to other collections

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