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/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
9 package tests.api.java.util.concurrent; // android-added
11 import junit.framework.*;
13 import java.util.concurrent.*;
16 public class ConcurrentLinkedQueueTest extends JSR166TestCase {
17 public static Test suite() {
18 return new TestSuite(ConcurrentLinkedQueueTest.class);
22 * Create a queue of given size containing consecutive
25 private ConcurrentLinkedQueue populatedQueue(int n) {
26 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
27 assertTrue(q.isEmpty());
28 for (int i = 0; i < n; ++i)
29 assertTrue(q.offer(new Integer(i)));
30 assertFalse(q.isEmpty());
31 assertEquals(n, q.size());
38 public void testConstructor1() {
39 assertEquals(0, new ConcurrentLinkedQueue().size());
43 * Initializing from null Collection throws NPE
45 public void testConstructor3() {
47 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue((Collection)null);
49 } catch (NullPointerException success) {}
53 * Initializing from Collection of null elements throws NPE
55 public void testConstructor4() {
57 Integer[] ints = new Integer[SIZE];
58 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
60 } catch (NullPointerException success) {}
64 * Initializing from Collection with some null elements throws NPE
66 public void testConstructor5() {
68 Integer[] ints = new Integer[SIZE];
69 for (int i = 0; i < SIZE-1; ++i)
70 ints[i] = new Integer(i);
71 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
73 } catch (NullPointerException success) {}
77 * Queue contains all elements of collection used to initialize
79 public void testConstructor6() {
80 Integer[] ints = new Integer[SIZE];
81 for (int i = 0; i < SIZE; ++i)
82 ints[i] = new Integer(i);
83 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue(Arrays.asList(ints));
84 for (int i = 0; i < SIZE; ++i)
85 assertEquals(ints[i], q.poll());
89 * isEmpty is true before add, false after
91 public void testEmpty() {
92 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
93 assertTrue(q.isEmpty());
95 assertFalse(q.isEmpty());
99 assertTrue(q.isEmpty());
103 * size changes when elements added and removed
105 public void testSize() {
106 ConcurrentLinkedQueue q = populatedQueue(SIZE);
107 for (int i = 0; i < SIZE; ++i) {
108 assertEquals(SIZE-i, q.size());
111 for (int i = 0; i < SIZE; ++i) {
112 assertEquals(i, q.size());
113 q.add(new Integer(i));
118 * offer(null) throws NPE
120 public void testOfferNull() {
122 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
125 } catch (NullPointerException success) {}
129 * add(null) throws NPE
131 public void testAddNull() {
133 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
136 } catch (NullPointerException success) {}
143 public void testOffer() {
144 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
145 assertTrue(q.offer(zero));
146 assertTrue(q.offer(one));
152 public void testAdd() {
153 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
154 for (int i = 0; i < SIZE; ++i) {
155 assertEquals(i, q.size());
156 assertTrue(q.add(new Integer(i)));
161 * addAll(null) throws NPE
163 public void testAddAll1() {
165 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
168 } catch (NullPointerException success) {}
172 * addAll(this) throws IAE
174 public void testAddAllSelf() {
176 ConcurrentLinkedQueue q = populatedQueue(SIZE);
179 } catch (IllegalArgumentException success) {}
183 * addAll of a collection with null elements throws NPE
185 public void testAddAll2() {
187 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
188 Integer[] ints = new Integer[SIZE];
189 q.addAll(Arrays.asList(ints));
191 } catch (NullPointerException success) {}
194 * addAll of a collection with any null elements throws NPE after
195 * possibly adding some elements
197 public void testAddAll3() {
199 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
200 Integer[] ints = new Integer[SIZE];
201 for (int i = 0; i < SIZE-1; ++i)
202 ints[i] = new Integer(i);
203 q.addAll(Arrays.asList(ints));
205 } catch (NullPointerException success) {}
209 * Queue contains all elements, in traversal order, of successful addAll
211 public void testAddAll5() {
212 Integer[] empty = new Integer[0];
213 Integer[] ints = new Integer[SIZE];
214 for (int i = 0; i < SIZE; ++i)
215 ints[i] = new Integer(i);
216 ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
217 assertFalse(q.addAll(Arrays.asList(empty)));
218 assertTrue(q.addAll(Arrays.asList(ints)));
219 for (int i = 0; i < SIZE; ++i)
220 assertEquals(ints[i], q.poll());
224 * poll succeeds unless empty
226 public void testPoll() {
227 ConcurrentLinkedQueue q = populatedQueue(SIZE);
228 for (int i = 0; i < SIZE; ++i) {
229 assertEquals(i, q.poll());
231 assertNull(q.poll());
235 * peek returns next element, or null if empty
237 public void testPeek() {
238 ConcurrentLinkedQueue q = populatedQueue(SIZE);
239 for (int i = 0; i < SIZE; ++i) {
240 assertEquals(i, q.peek());
241 assertEquals(i, q.poll());
242 assertTrue(q.peek() == null ||
243 !q.peek().equals(i));
245 assertNull(q.peek());
249 * element returns next element, or throws NSEE if empty
251 public void testElement() {
252 ConcurrentLinkedQueue q = populatedQueue(SIZE);
253 for (int i = 0; i < SIZE; ++i) {
254 assertEquals(i, q.element());
255 assertEquals(i, q.poll());
260 } catch (NoSuchElementException success) {}
264 * remove removes next element, or throws NSEE if empty
266 public void testRemove() {
267 ConcurrentLinkedQueue q = populatedQueue(SIZE);
268 for (int i = 0; i < SIZE; ++i) {
269 assertEquals(i, q.remove());
274 } catch (NoSuchElementException success) {}
278 * remove(x) removes x and returns true if present
280 public void testRemoveElement() {
281 ConcurrentLinkedQueue q = populatedQueue(SIZE);
282 for (int i = 1; i < SIZE; i+=2) {
283 assertTrue(q.remove(new Integer(i)));
285 for (int i = 0; i < SIZE; i+=2) {
286 assertTrue(q.remove(new Integer(i)));
287 assertFalse(q.remove(new Integer(i+1)));
289 assertTrue(q.isEmpty());
293 * contains(x) reports true when elements added but not yet removed
295 public void testContains() {
296 ConcurrentLinkedQueue q = populatedQueue(SIZE);
297 for (int i = 0; i < SIZE; ++i) {
298 assertTrue(q.contains(new Integer(i)));
300 assertFalse(q.contains(new Integer(i)));
305 * clear removes all elements
307 public void testClear() {
308 ConcurrentLinkedQueue q = populatedQueue(SIZE);
310 assertTrue(q.isEmpty());
311 assertEquals(0, q.size());
313 assertFalse(q.isEmpty());
315 assertTrue(q.isEmpty());
319 * containsAll(c) is true when c contains a subset of elements
321 public void testContainsAll() {
322 ConcurrentLinkedQueue q = populatedQueue(SIZE);
323 ConcurrentLinkedQueue p = new ConcurrentLinkedQueue();
324 for (int i = 0; i < SIZE; ++i) {
325 assertTrue(q.containsAll(p));
326 assertFalse(p.containsAll(q));
327 p.add(new Integer(i));
329 assertTrue(p.containsAll(q));
333 * retainAll(c) retains only those elements of c and reports true if change
335 public void testRetainAll() {
336 ConcurrentLinkedQueue q = populatedQueue(SIZE);
337 ConcurrentLinkedQueue p = populatedQueue(SIZE);
338 for (int i = 0; i < SIZE; ++i) {
339 boolean changed = q.retainAll(p);
341 assertFalse(changed);
345 assertTrue(q.containsAll(p));
346 assertEquals(SIZE-i, q.size());
352 * removeAll(c) removes only those elements of c and reports true if changed
354 public void testRemoveAll() {
355 for (int i = 1; i < SIZE; ++i) {
356 ConcurrentLinkedQueue q = populatedQueue(SIZE);
357 ConcurrentLinkedQueue p = populatedQueue(i);
358 assertTrue(q.removeAll(p));
359 assertEquals(SIZE-i, q.size());
360 for (int j = 0; j < i; ++j) {
361 Integer I = (Integer)(p.remove());
362 assertFalse(q.contains(I));
368 * toArray contains all elements
370 public void testToArray() {
371 ConcurrentLinkedQueue q = populatedQueue(SIZE);
372 Object[] o = q.toArray();
374 for (int i = 0; i < o.length; i++)
375 assertEquals(o[i], q.poll());
379 * toArray(a) contains all elements
381 public void testToArray2() {
382 ConcurrentLinkedQueue q = populatedQueue(SIZE);
383 Integer[] ints = new Integer[SIZE];
384 ints = (Integer[])q.toArray(ints);
386 for (int i = 0; i < ints.length; i++)
387 assertEquals(ints[i], q.poll());
391 * toArray(null) throws NPE
393 public void testToArray_BadArg() {
394 ConcurrentLinkedQueue q = populatedQueue(SIZE);
396 Object o[] = q.toArray(null);
398 } catch (NullPointerException success) {}
402 * toArray with incompatible array type throws ArrayStoreException
404 public void testToArray1_BadArg() {
405 ConcurrentLinkedQueue q = populatedQueue(SIZE);
407 Object o[] = q.toArray(new String[10]);
409 } catch (ArrayStoreException success) {}
413 * iterator iterates through all elements
415 public void testIterator() {
416 ConcurrentLinkedQueue q = populatedQueue(SIZE);
418 Iterator it = q.iterator();
419 while (it.hasNext()) {
420 assertTrue(q.contains(it.next()));
423 assertEquals(i, SIZE);
427 * iterator ordering is FIFO
429 public void testIteratorOrdering() {
430 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
436 for (Iterator it = q.iterator(); it.hasNext();) {
437 assertEquals(++k, it.next());
444 * Modifications do not cause iterators to fail
446 public void testWeaklyConsistentIteration () {
447 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
452 for (Iterator it = q.iterator(); it.hasNext();) {
457 assertEquals("queue should be empty again", 0, q.size());
461 * iterator.remove removes current element
463 public void testIteratorRemove () {
464 final ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
468 Iterator it = q.iterator();
472 assertSame(it.next(), two);
473 assertSame(it.next(), three);
474 assertFalse(it.hasNext());
479 * toString contains toStrings of elements
481 public void testToString() {
482 ConcurrentLinkedQueue q = populatedQueue(SIZE);
483 String s = q.toString();
484 for (int i = 0; i < SIZE; ++i) {
485 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
490 * A deserialized serialized queue has same elements in same order
492 public void testSerialization() throws Exception {
493 ConcurrentLinkedQueue q = populatedQueue(SIZE);
494 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
495 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
499 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
500 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
501 ConcurrentLinkedQueue r = (ConcurrentLinkedQueue)in.readObject();
502 assertEquals(q.size(), r.size());
504 assertEquals(q.remove(), r.remove());