ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.76
Committed: Fri Aug 4 03:30:21 2017 UTC (6 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.75: +1 -1 lines
Log Message:
improve javadoc wording for testSerialization methods

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.7 * 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 jsr166 1.40 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.12 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.54 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.util.ArrayList;
12 jsr166 1.45 import java.util.Arrays;
13     import java.util.Collection;
14     import java.util.Iterator;
15     import java.util.NoSuchElementException;
16 jsr166 1.46 import java.util.Queue;
17 jsr166 1.45 import java.util.concurrent.BlockingQueue;
18     import java.util.concurrent.CountDownLatch;
19     import java.util.concurrent.Executors;
20     import java.util.concurrent.ExecutorService;
21 jsr166 1.54 import java.util.concurrent.LinkedBlockingQueue;
22    
23     import junit.framework.Test;
24 dl 1.1
25 dl 1.3 public class LinkedBlockingQueueTest extends JSR166TestCase {
26 dl 1.1
27 jsr166 1.29 public static class Unbounded extends BlockingQueueTest {
28     protected BlockingQueue emptyCollection() {
29     return new LinkedBlockingQueue();
30     }
31     }
32    
33     public static class Bounded extends BlockingQueueTest {
34     protected BlockingQueue emptyCollection() {
35 jsr166 1.47 return new LinkedBlockingQueue(SIZE);
36 jsr166 1.29 }
37     }
38    
39 dl 1.1 public static void main(String[] args) {
40 jsr166 1.59 main(suite(), args);
41 dl 1.1 }
42    
43     public static Test suite() {
44 jsr166 1.65 class Implementation implements CollectionImplementation {
45     public Class<?> klazz() { return LinkedBlockingQueue.class; }
46     public Collection emptyCollection() { return new LinkedBlockingQueue(); }
47     public Object makeElement(int i) { return i; }
48     public boolean isConcurrent() { return true; }
49     public boolean permitsNulls() { return false; }
50     }
51 jsr166 1.29 return newTestSuite(LinkedBlockingQueueTest.class,
52     new Unbounded().testSuite(),
53 jsr166 1.65 new Bounded().testSuite(),
54     CollectionTest.testSuite(new Implementation()));
55 dl 1.1 }
56    
57     /**
58 jsr166 1.51 * Returns a new queue of given size containing consecutive
59 jsr166 1.64 * Integers 0 ... n - 1.
60 dl 1.1 */
61 jsr166 1.66 private static LinkedBlockingQueue<Integer> populatedQueue(int n) {
62 jsr166 1.37 LinkedBlockingQueue<Integer> q =
63     new LinkedBlockingQueue<Integer>(n);
64 dl 1.1 assertTrue(q.isEmpty());
65 jsr166 1.15 for (int i = 0; i < n; i++)
66     assertTrue(q.offer(new Integer(i)));
67 dl 1.1 assertFalse(q.isEmpty());
68     assertEquals(0, q.remainingCapacity());
69 jsr166 1.15 assertEquals(n, q.size());
70 jsr166 1.64 assertEquals((Integer) 0, q.peek());
71 dl 1.1 return q;
72     }
73 jsr166 1.12
74 dl 1.4 /**
75 dl 1.5 * A new queue has the indicated capacity, or Integer.MAX_VALUE if
76     * none given
77 dl 1.4 */
78     public void testConstructor1() {
79 dl 1.3 assertEquals(SIZE, new LinkedBlockingQueue(SIZE).remainingCapacity());
80 dl 1.5 assertEquals(Integer.MAX_VALUE, new LinkedBlockingQueue().remainingCapacity());
81 dl 1.1 }
82    
83 dl 1.4 /**
84 jsr166 1.45 * Constructor throws IllegalArgumentException if capacity argument nonpositive
85 dl 1.4 */
86     public void testConstructor2() {
87 dl 1.1 try {
88 jsr166 1.45 new LinkedBlockingQueue(0);
89 dl 1.4 shouldThrow();
90 jsr166 1.17 } catch (IllegalArgumentException success) {}
91 dl 1.1 }
92    
93 dl 1.4 /**
94 jsr166 1.45 * Initializing from null Collection throws NullPointerException
95 dl 1.4 */
96     public void testConstructor3() {
97 dl 1.1 try {
98 jsr166 1.45 new LinkedBlockingQueue(null);
99 dl 1.4 shouldThrow();
100 jsr166 1.17 } catch (NullPointerException success) {}
101 dl 1.1 }
102    
103 dl 1.4 /**
104 jsr166 1.45 * Initializing from Collection of null elements throws NullPointerException
105 dl 1.4 */
106     public void testConstructor4() {
107 jsr166 1.45 Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
108 dl 1.1 try {
109 jsr166 1.45 new LinkedBlockingQueue(elements);
110 dl 1.4 shouldThrow();
111 jsr166 1.17 } catch (NullPointerException success) {}
112 dl 1.1 }
113    
114 dl 1.4 /**
115 jsr166 1.45 * Initializing from Collection with some null elements throws
116     * NullPointerException
117 dl 1.4 */
118     public void testConstructor5() {
119 jsr166 1.45 Integer[] ints = new Integer[SIZE];
120 jsr166 1.60 for (int i = 0; i < SIZE - 1; ++i)
121 jsr166 1.45 ints[i] = new Integer(i);
122     Collection<Integer> elements = Arrays.asList(ints);
123 dl 1.1 try {
124 jsr166 1.45 new LinkedBlockingQueue(elements);
125 dl 1.4 shouldThrow();
126 jsr166 1.17 } catch (NullPointerException success) {}
127 dl 1.1 }
128    
129 dl 1.4 /**
130 dl 1.5 * Queue contains all elements of collection used to initialize
131 dl 1.4 */
132     public void testConstructor6() {
133 jsr166 1.17 Integer[] ints = new Integer[SIZE];
134     for (int i = 0; i < SIZE; ++i)
135     ints[i] = new Integer(i);
136     LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
137     for (int i = 0; i < SIZE; ++i)
138     assertEquals(ints[i], q.poll());
139 dl 1.1 }
140    
141 dl 1.4 /**
142 dl 1.5 * Queue transitions from empty to full when elements added
143 dl 1.4 */
144 dl 1.1 public void testEmptyFull() {
145     LinkedBlockingQueue q = new LinkedBlockingQueue(2);
146     assertTrue(q.isEmpty());
147     assertEquals("should have room for 2", 2, q.remainingCapacity());
148 dl 1.3 q.add(one);
149 dl 1.1 assertFalse(q.isEmpty());
150 dl 1.3 q.add(two);
151 dl 1.1 assertFalse(q.isEmpty());
152 dl 1.4 assertEquals(0, q.remainingCapacity());
153     assertFalse(q.offer(three));
154 dl 1.1 }
155    
156 dl 1.4 /**
157 dl 1.5 * remainingCapacity decreases on add, increases on remove
158 dl 1.4 */
159     public void testRemainingCapacity() {
160 jsr166 1.58 BlockingQueue q = populatedQueue(SIZE);
161 dl 1.3 for (int i = 0; i < SIZE; ++i) {
162 dl 1.1 assertEquals(i, q.remainingCapacity());
163 jsr166 1.58 assertEquals(SIZE, q.size() + q.remainingCapacity());
164     assertEquals(i, q.remove());
165 dl 1.1 }
166 dl 1.3 for (int i = 0; i < SIZE; ++i) {
167 jsr166 1.60 assertEquals(SIZE - i, q.remainingCapacity());
168 jsr166 1.58 assertEquals(SIZE, q.size() + q.remainingCapacity());
169     assertTrue(q.add(i));
170 dl 1.1 }
171     }
172    
173 dl 1.4 /**
174 dl 1.5 * Offer succeeds if not full; fails if full
175 dl 1.4 */
176     public void testOffer() {
177 dl 1.1 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
178 dl 1.3 assertTrue(q.offer(zero));
179     assertFalse(q.offer(one));
180 dl 1.1 }
181    
182 dl 1.4 /**
183 jsr166 1.45 * add succeeds if not full; throws IllegalStateException if full
184 dl 1.4 */
185     public void testAdd() {
186 jsr166 1.45 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
187     for (int i = 0; i < SIZE; ++i)
188     assertTrue(q.add(new Integer(i)));
189     assertEquals(0, q.remainingCapacity());
190 jsr166 1.15 try {
191 dl 1.3 q.add(new Integer(SIZE));
192 jsr166 1.17 shouldThrow();
193     } catch (IllegalStateException success) {}
194 dl 1.1 }
195    
196 dl 1.4 /**
197 jsr166 1.45 * addAll(this) throws IllegalArgumentException
198 dl 1.6 */
199     public void testAddAllSelf() {
200 jsr166 1.45 LinkedBlockingQueue q = populatedQueue(SIZE);
201 dl 1.6 try {
202     q.addAll(q);
203     shouldThrow();
204 jsr166 1.17 } catch (IllegalArgumentException success) {}
205 dl 1.6 }
206    
207 dl 1.4 /**
208 dl 1.5 * addAll of a collection with any null elements throws NPE after
209     * possibly adding some elements
210 dl 1.4 */
211     public void testAddAll3() {
212 jsr166 1.45 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
213     Integer[] ints = new Integer[SIZE];
214 jsr166 1.60 for (int i = 0; i < SIZE - 1; ++i)
215 jsr166 1.45 ints[i] = new Integer(i);
216     Collection<Integer> elements = Arrays.asList(ints);
217 dl 1.1 try {
218 jsr166 1.45 q.addAll(elements);
219 dl 1.4 shouldThrow();
220 jsr166 1.17 } catch (NullPointerException success) {}
221 dl 1.1 }
222 jsr166 1.27
223 dl 1.4 /**
224 jsr166 1.45 * addAll throws IllegalStateException if not enough room
225 dl 1.4 */
226     public void testAddAll4() {
227 jsr166 1.45 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE - 1);
228     Integer[] ints = new Integer[SIZE];
229     for (int i = 0; i < SIZE; ++i)
230     ints[i] = new Integer(i);
231     Collection<Integer> elements = Arrays.asList(ints);
232 dl 1.1 try {
233 jsr166 1.45 q.addAll(elements);
234 dl 1.4 shouldThrow();
235 jsr166 1.17 } catch (IllegalStateException success) {}
236 dl 1.1 }
237 jsr166 1.27
238 dl 1.4 /**
239 dl 1.5 * Queue contains all elements, in traversal order, of successful addAll
240 dl 1.4 */
241     public void testAddAll5() {
242 jsr166 1.17 Integer[] empty = new Integer[0];
243     Integer[] ints = new Integer[SIZE];
244     for (int i = 0; i < SIZE; ++i)
245     ints[i] = new Integer(i);
246     LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
247     assertFalse(q.addAll(Arrays.asList(empty)));
248     assertTrue(q.addAll(Arrays.asList(ints)));
249     for (int i = 0; i < SIZE; ++i)
250     assertEquals(ints[i], q.poll());
251 dl 1.1 }
252    
253 dl 1.4 /**
254 dl 1.5 * all elements successfully put are contained
255 dl 1.4 */
256 jsr166 1.17 public void testPut() throws InterruptedException {
257     LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
258     for (int i = 0; i < SIZE; ++i) {
259 jsr166 1.56 Integer x = new Integer(i);
260     q.put(x);
261     assertTrue(q.contains(x));
262 dl 1.1 }
263 jsr166 1.17 assertEquals(0, q.remainingCapacity());
264 dl 1.1 }
265    
266 dl 1.4 /**
267 dl 1.5 * put blocks interruptibly if full
268 dl 1.4 */
269 jsr166 1.17 public void testBlockingPut() throws InterruptedException {
270 jsr166 1.22 final LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
271 jsr166 1.44 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
272     Thread t = newStartedThread(new CheckedRunnable() {
273 jsr166 1.22 public void realRun() throws InterruptedException {
274     for (int i = 0; i < SIZE; ++i)
275     q.put(i);
276     assertEquals(SIZE, q.size());
277     assertEquals(0, q.remainingCapacity());
278 jsr166 1.44
279     Thread.currentThread().interrupt();
280     try {
281     q.put(99);
282     shouldThrow();
283     } catch (InterruptedException success) {}
284     assertFalse(Thread.interrupted());
285    
286     pleaseInterrupt.countDown();
287 jsr166 1.17 try {
288 jsr166 1.22 q.put(99);
289     shouldThrow();
290     } catch (InterruptedException success) {}
291 jsr166 1.44 assertFalse(Thread.interrupted());
292 jsr166 1.17 }});
293    
294 jsr166 1.44 await(pleaseInterrupt);
295 jsr166 1.69 assertThreadBlocks(t, Thread.State.WAITING);
296 jsr166 1.17 t.interrupt();
297 jsr166 1.44 awaitTermination(t);
298 jsr166 1.22 assertEquals(SIZE, q.size());
299     assertEquals(0, q.remainingCapacity());
300 dl 1.1 }
301    
302 dl 1.4 /**
303 jsr166 1.44 * put blocks interruptibly waiting for take when full
304 dl 1.4 */
305 jsr166 1.17 public void testPutWithTake() throws InterruptedException {
306 jsr166 1.22 final int capacity = 2;
307 dl 1.1 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
308 jsr166 1.44 final CountDownLatch pleaseTake = new CountDownLatch(1);
309     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
310     Thread t = newStartedThread(new CheckedRunnable() {
311 jsr166 1.22 public void realRun() throws InterruptedException {
312 jsr166 1.44 for (int i = 0; i < capacity; i++)
313 jsr166 1.22 q.put(i);
314 jsr166 1.44 pleaseTake.countDown();
315     q.put(86);
316    
317 jsr166 1.74 Thread.currentThread().interrupt();
318     try {
319     q.put(99);
320     shouldThrow();
321     } catch (InterruptedException success) {}
322     assertFalse(Thread.interrupted());
323    
324 jsr166 1.44 pleaseInterrupt.countDown();
325 jsr166 1.17 try {
326 jsr166 1.22 q.put(99);
327     shouldThrow();
328     } catch (InterruptedException success) {}
329 jsr166 1.44 assertFalse(Thread.interrupted());
330 jsr166 1.17 }});
331    
332 jsr166 1.44 await(pleaseTake);
333 jsr166 1.48 assertEquals(0, q.remainingCapacity());
334 jsr166 1.22 assertEquals(0, q.take());
335 jsr166 1.44
336     await(pleaseInterrupt);
337 jsr166 1.68 assertThreadBlocks(t, Thread.State.WAITING);
338 jsr166 1.17 t.interrupt();
339 jsr166 1.44 awaitTermination(t);
340 jsr166 1.48 assertEquals(0, q.remainingCapacity());
341 dl 1.1 }
342    
343 dl 1.4 /**
344 dl 1.5 * timed offer times out if full and elements not taken
345 dl 1.4 */
346 jsr166 1.43 public void testTimedOffer() {
347 dl 1.1 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
348 jsr166 1.43 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
349     Thread t = newStartedThread(new CheckedRunnable() {
350 jsr166 1.17 public void realRun() throws InterruptedException {
351     q.put(new Object());
352     q.put(new Object());
353 jsr166 1.75
354 jsr166 1.43 long startTime = System.nanoTime();
355     assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
356     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
357 jsr166 1.75
358     Thread.currentThread().interrupt();
359     try {
360     q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
361     shouldThrow();
362     } catch (InterruptedException success) {}
363     assertFalse(Thread.interrupted());
364    
365 jsr166 1.43 pleaseInterrupt.countDown();
366 jsr166 1.21 try {
367 jsr166 1.43 q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
368 jsr166 1.21 shouldThrow();
369     } catch (InterruptedException success) {}
370 jsr166 1.72 assertFalse(Thread.interrupted());
371 jsr166 1.21 }});
372 jsr166 1.12
373 jsr166 1.43 await(pleaseInterrupt);
374 jsr166 1.69 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
375 jsr166 1.17 t.interrupt();
376 jsr166 1.43 awaitTermination(t);
377 dl 1.1 }
378    
379 dl 1.4 /**
380 dl 1.5 * take retrieves elements in FIFO order
381 dl 1.4 */
382 jsr166 1.17 public void testTake() throws InterruptedException {
383     LinkedBlockingQueue q = populatedQueue(SIZE);
384     for (int i = 0; i < SIZE; ++i) {
385 jsr166 1.23 assertEquals(i, q.take());
386 jsr166 1.15 }
387 dl 1.1 }
388    
389 dl 1.4 /**
390 dl 1.5 * Take removes existing elements until empty, then blocks interruptibly
391 dl 1.4 */
392 jsr166 1.17 public void testBlockingTake() throws InterruptedException {
393 jsr166 1.44 final BlockingQueue q = populatedQueue(SIZE);
394     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
395     Thread t = newStartedThread(new CheckedRunnable() {
396 jsr166 1.17 public void realRun() throws InterruptedException {
397 jsr166 1.67 for (int i = 0; i < SIZE; i++) assertEquals(i, q.take());
398 jsr166 1.44
399     Thread.currentThread().interrupt();
400     try {
401     q.take();
402     shouldThrow();
403     } catch (InterruptedException success) {}
404     assertFalse(Thread.interrupted());
405    
406     pleaseInterrupt.countDown();
407 jsr166 1.22 try {
408     q.take();
409     shouldThrow();
410     } catch (InterruptedException success) {}
411 jsr166 1.44 assertFalse(Thread.interrupted());
412 jsr166 1.22 }});
413 jsr166 1.17
414 jsr166 1.44 await(pleaseInterrupt);
415 jsr166 1.67 assertThreadBlocks(t, Thread.State.WAITING);
416 jsr166 1.17 t.interrupt();
417 jsr166 1.44 awaitTermination(t);
418 dl 1.1 }
419    
420 dl 1.4 /**
421 dl 1.5 * poll succeeds unless empty
422 dl 1.4 */
423     public void testPoll() {
424 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
425     for (int i = 0; i < SIZE; ++i) {
426 jsr166 1.23 assertEquals(i, q.poll());
427 dl 1.1 }
428 jsr166 1.15 assertNull(q.poll());
429 dl 1.1 }
430    
431 dl 1.4 /**
432 jsr166 1.33 * timed poll with zero timeout succeeds when non-empty, else times out
433 dl 1.4 */
434 jsr166 1.17 public void testTimedPoll0() throws InterruptedException {
435     LinkedBlockingQueue q = populatedQueue(SIZE);
436     for (int i = 0; i < SIZE; ++i) {
437 jsr166 1.23 assertEquals(i, q.poll(0, MILLISECONDS));
438 jsr166 1.15 }
439 jsr166 1.17 assertNull(q.poll(0, MILLISECONDS));
440 dl 1.1 }
441    
442 dl 1.4 /**
443 jsr166 1.33 * timed poll with nonzero timeout succeeds when non-empty, else times out
444 dl 1.4 */
445 jsr166 1.17 public void testTimedPoll() throws InterruptedException {
446 jsr166 1.44 LinkedBlockingQueue<Integer> q = populatedQueue(SIZE);
447 jsr166 1.17 for (int i = 0; i < SIZE; ++i) {
448 jsr166 1.44 long startTime = System.nanoTime();
449     assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
450     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
451     }
452     long startTime = System.nanoTime();
453     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
454     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
455     checkEmpty(q);
456 dl 1.1 }
457    
458 dl 1.4 /**
459 dl 1.5 * Interrupted timed poll throws InterruptedException instead of
460     * returning timeout status
461 dl 1.4 */
462 jsr166 1.17 public void testInterruptedTimedPoll() throws InterruptedException {
463 jsr166 1.39 final BlockingQueue<Integer> q = populatedQueue(SIZE);
464 jsr166 1.71 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
465 jsr166 1.39 Thread t = newStartedThread(new CheckedRunnable() {
466 jsr166 1.17 public void realRun() throws InterruptedException {
467 jsr166 1.62 long startTime = System.nanoTime();
468 jsr166 1.73 for (int i = 0; i < SIZE; i++)
469 jsr166 1.39 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
470 jsr166 1.73
471     Thread.currentThread().interrupt();
472     try {
473     q.poll(LONG_DELAY_MS, MILLISECONDS);
474     shouldThrow();
475     } catch (InterruptedException success) {}
476     assertFalse(Thread.interrupted());
477 jsr166 1.71
478     pleaseInterrupt.countDown();
479 jsr166 1.19 try {
480 jsr166 1.62 q.poll(LONG_DELAY_MS, MILLISECONDS);
481 jsr166 1.19 shouldThrow();
482 jsr166 1.71 } catch (InterruptedException success) {}
483     assertFalse(Thread.interrupted());
484    
485     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
486 jsr166 1.19 }});
487 jsr166 1.17
488 jsr166 1.71 await(pleaseInterrupt);
489 jsr166 1.70 assertThreadBlocks(t, Thread.State.TIMED_WAITING);
490 jsr166 1.17 t.interrupt();
491 jsr166 1.62 awaitTermination(t);
492 jsr166 1.39 checkEmpty(q);
493 dl 1.1 }
494    
495 dl 1.4 /**
496 dl 1.5 * peek returns next element, or null if empty
497 dl 1.4 */
498     public void testPeek() {
499 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
500     for (int i = 0; i < SIZE; ++i) {
501 jsr166 1.23 assertEquals(i, q.peek());
502     assertEquals(i, q.poll());
503 dl 1.1 assertTrue(q.peek() == null ||
504 jsr166 1.23 !q.peek().equals(i));
505 dl 1.1 }
506 jsr166 1.15 assertNull(q.peek());
507 dl 1.1 }
508    
509 dl 1.4 /**
510 dl 1.5 * element returns next element, or throws NSEE if empty
511 dl 1.4 */
512     public void testElement() {
513 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
514     for (int i = 0; i < SIZE; ++i) {
515 jsr166 1.23 assertEquals(i, q.element());
516     assertEquals(i, q.poll());
517 dl 1.1 }
518     try {
519     q.element();
520 dl 1.4 shouldThrow();
521 jsr166 1.17 } catch (NoSuchElementException success) {}
522 dl 1.1 }
523    
524 dl 1.4 /**
525 dl 1.5 * remove removes next element, or throws NSEE if empty
526 dl 1.4 */
527     public void testRemove() {
528 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
529     for (int i = 0; i < SIZE; ++i) {
530 jsr166 1.23 assertEquals(i, q.remove());
531 dl 1.1 }
532     try {
533     q.remove();
534 dl 1.4 shouldThrow();
535 jsr166 1.17 } catch (NoSuchElementException success) {}
536 dl 1.1 }
537    
538 dl 1.4 /**
539 dl 1.11 * An add following remove(x) succeeds
540     */
541 jsr166 1.17 public void testRemoveElementAndAdd() throws InterruptedException {
542     LinkedBlockingQueue q = new LinkedBlockingQueue();
543     assertTrue(q.add(new Integer(1)));
544     assertTrue(q.add(new Integer(2)));
545     assertTrue(q.remove(new Integer(1)));
546     assertTrue(q.remove(new Integer(2)));
547     assertTrue(q.add(new Integer(3)));
548 jsr166 1.52 assertNotNull(q.take());
549 dl 1.11 }
550 jsr166 1.12
551 dl 1.4 /**
552 dl 1.5 * contains(x) reports true when elements added but not yet removed
553 dl 1.4 */
554     public void testContains() {
555 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
556     for (int i = 0; i < SIZE; ++i) {
557 dl 1.1 assertTrue(q.contains(new Integer(i)));
558     q.poll();
559     assertFalse(q.contains(new Integer(i)));
560     }
561     }
562    
563 dl 1.4 /**
564 dl 1.5 * clear removes all elements
565 dl 1.4 */
566     public void testClear() {
567 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
568 dl 1.1 q.clear();
569     assertTrue(q.isEmpty());
570     assertEquals(0, q.size());
571 dl 1.3 assertEquals(SIZE, q.remainingCapacity());
572     q.add(one);
573 dl 1.1 assertFalse(q.isEmpty());
574 dl 1.10 assertTrue(q.contains(one));
575 dl 1.1 q.clear();
576     assertTrue(q.isEmpty());
577     }
578    
579 dl 1.4 /**
580 dl 1.5 * containsAll(c) is true when c contains a subset of elements
581 dl 1.4 */
582     public void testContainsAll() {
583 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
584     LinkedBlockingQueue p = new LinkedBlockingQueue(SIZE);
585     for (int i = 0; i < SIZE; ++i) {
586 dl 1.1 assertTrue(q.containsAll(p));
587     assertFalse(p.containsAll(q));
588     p.add(new Integer(i));
589     }
590     assertTrue(p.containsAll(q));
591     }
592    
593 dl 1.4 /**
594 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
595 dl 1.4 */
596     public void testRetainAll() {
597 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
598     LinkedBlockingQueue p = populatedQueue(SIZE);
599     for (int i = 0; i < SIZE; ++i) {
600 dl 1.1 boolean changed = q.retainAll(p);
601     if (i == 0)
602     assertFalse(changed);
603     else
604     assertTrue(changed);
605    
606     assertTrue(q.containsAll(p));
607 jsr166 1.60 assertEquals(SIZE - i, q.size());
608 dl 1.1 p.remove();
609     }
610     }
611    
612 dl 1.4 /**
613 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
614 dl 1.4 */
615     public void testRemoveAll() {
616 dl 1.3 for (int i = 1; i < SIZE; ++i) {
617     LinkedBlockingQueue q = populatedQueue(SIZE);
618     LinkedBlockingQueue p = populatedQueue(i);
619 dl 1.1 assertTrue(q.removeAll(p));
620 jsr166 1.60 assertEquals(SIZE - i, q.size());
621 dl 1.1 for (int j = 0; j < i; ++j) {
622 jsr166 1.56 Integer x = (Integer)(p.remove());
623     assertFalse(q.contains(x));
624 dl 1.1 }
625     }
626     }
627    
628 dl 1.4 /**
629 jsr166 1.36 * toArray contains all elements in FIFO order
630 dl 1.4 */
631 jsr166 1.36 public void testToArray() {
632 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
633 jsr166 1.15 Object[] o = q.toArray();
634     for (int i = 0; i < o.length; i++)
635 jsr166 1.36 assertSame(o[i], q.poll());
636 dl 1.1 }
637    
638 dl 1.4 /**
639 jsr166 1.36 * toArray(a) contains all elements in FIFO order
640 dl 1.4 */
641 jsr166 1.17 public void testToArray2() throws InterruptedException {
642 jsr166 1.37 LinkedBlockingQueue<Integer> q = populatedQueue(SIZE);
643 jsr166 1.15 Integer[] ints = new Integer[SIZE];
644 jsr166 1.37 Integer[] array = q.toArray(ints);
645     assertSame(ints, array);
646 jsr166 1.17 for (int i = 0; i < ints.length; i++)
647 jsr166 1.36 assertSame(ints[i], q.poll());
648 dl 1.1 }
649 dl 1.6
650     /**
651 jsr166 1.34 * toArray(incompatible array type) throws ArrayStoreException
652 dl 1.6 */
653     public void testToArray1_BadArg() {
654 jsr166 1.23 LinkedBlockingQueue q = populatedQueue(SIZE);
655 jsr166 1.15 try {
656 jsr166 1.34 q.toArray(new String[10]);
657 jsr166 1.15 shouldThrow();
658 jsr166 1.17 } catch (ArrayStoreException success) {}
659 dl 1.6 }
660    
661 dl 1.4 /**
662 dl 1.5 * iterator iterates through all elements
663 dl 1.4 */
664 jsr166 1.17 public void testIterator() throws InterruptedException {
665 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
666 jsr166 1.15 Iterator it = q.iterator();
667 jsr166 1.57 int i;
668     for (i = 0; it.hasNext(); i++)
669     assertTrue(q.contains(it.next()));
670     assertEquals(i, SIZE);
671     assertIteratorExhausted(it);
672    
673     it = q.iterator();
674     for (i = 0; it.hasNext(); i++)
675 jsr166 1.17 assertEquals(it.next(), q.take());
676 jsr166 1.57 assertEquals(i, SIZE);
677     assertIteratorExhausted(it);
678     }
679    
680     /**
681     * iterator of empty collection has no elements
682     */
683     public void testEmptyIterator() {
684     assertIteratorExhausted(new LinkedBlockingQueue().iterator());
685 dl 1.1 }
686    
687 dl 1.4 /**
688 dl 1.5 * iterator.remove removes current element
689     */
690 jsr166 1.26 public void testIteratorRemove() {
691 dl 1.5 final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
692     q.add(two);
693     q.add(one);
694     q.add(three);
695    
696     Iterator it = q.iterator();
697     it.next();
698     it.remove();
699 jsr166 1.12
700 dl 1.5 it = q.iterator();
701 jsr166 1.25 assertSame(it.next(), one);
702     assertSame(it.next(), three);
703 dl 1.5 assertFalse(it.hasNext());
704     }
705    
706     /**
707     * iterator ordering is FIFO
708 dl 1.4 */
709 dl 1.1 public void testIteratorOrdering() {
710     final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
711 dl 1.3 q.add(one);
712     q.add(two);
713     q.add(three);
714 dl 1.4 assertEquals(0, q.remainingCapacity());
715 dl 1.1 int k = 0;
716     for (Iterator it = q.iterator(); it.hasNext();) {
717 jsr166 1.23 assertEquals(++k, it.next());
718 dl 1.1 }
719 dl 1.4 assertEquals(3, k);
720 dl 1.1 }
721    
722 dl 1.4 /**
723 dl 1.5 * Modifications do not cause iterators to fail
724 dl 1.4 */
725 jsr166 1.26 public void testWeaklyConsistentIteration() {
726 dl 1.1 final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
727 dl 1.3 q.add(one);
728     q.add(two);
729     q.add(three);
730 jsr166 1.17 for (Iterator it = q.iterator(); it.hasNext();) {
731     q.remove();
732     it.next();
733 dl 1.1 }
734 dl 1.4 assertEquals(0, q.size());
735 dl 1.1 }
736    
737 dl 1.4 /**
738 dl 1.5 * toString contains toStrings of elements
739 dl 1.4 */
740     public void testToString() {
741 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
742 dl 1.1 String s = q.toString();
743 dl 1.3 for (int i = 0; i < SIZE; ++i) {
744 jsr166 1.44 assertTrue(s.contains(String.valueOf(i)));
745 dl 1.1 }
746 jsr166 1.12 }
747 dl 1.1
748 dl 1.4 /**
749 dl 1.5 * offer transfers elements across Executor tasks
750 dl 1.4 */
751 dl 1.1 public void testOfferInExecutor() {
752     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
753 dl 1.3 q.add(one);
754     q.add(two);
755 jsr166 1.44 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
756 jsr166 1.61 final ExecutorService executor = Executors.newFixedThreadPool(2);
757     try (PoolCleaner cleaner = cleaner(executor)) {
758     executor.execute(new CheckedRunnable() {
759     public void realRun() throws InterruptedException {
760     assertFalse(q.offer(three));
761     threadsStarted.await();
762     assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
763     assertEquals(0, q.remainingCapacity());
764     }});
765    
766     executor.execute(new CheckedRunnable() {
767     public void realRun() throws InterruptedException {
768     threadsStarted.await();
769     assertSame(one, q.take());
770     }});
771     }
772 dl 1.1 }
773    
774 dl 1.4 /**
775 jsr166 1.44 * timed poll retrieves elements across Executor threads
776 dl 1.4 */
777 dl 1.1 public void testPollInExecutor() {
778     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
779 jsr166 1.44 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
780 jsr166 1.61 final ExecutorService executor = Executors.newFixedThreadPool(2);
781     try (PoolCleaner cleaner = cleaner(executor)) {
782     executor.execute(new CheckedRunnable() {
783     public void realRun() throws InterruptedException {
784     assertNull(q.poll());
785     threadsStarted.await();
786     assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
787     checkEmpty(q);
788     }});
789    
790     executor.execute(new CheckedRunnable() {
791     public void realRun() throws InterruptedException {
792     threadsStarted.await();
793     q.put(one);
794     }});
795     }
796 dl 1.2 }
797    
798 dl 1.4 /**
799 jsr166 1.76 * A deserialized/reserialized queue has same elements in same order
800 dl 1.4 */
801 jsr166 1.17 public void testSerialization() throws Exception {
802 jsr166 1.46 Queue x = populatedQueue(SIZE);
803     Queue y = serialClone(x);
804 dl 1.2
805 jsr166 1.52 assertNotSame(x, y);
806 jsr166 1.46 assertEquals(x.size(), y.size());
807     assertEquals(x.toString(), y.toString());
808     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
809     while (!x.isEmpty()) {
810     assertFalse(y.isEmpty());
811     assertEquals(x.remove(), y.remove());
812     }
813     assertTrue(y.isEmpty());
814 dl 1.6 }
815    
816     /**
817     * drainTo(c) empties queue into another collection c
818 jsr166 1.12 */
819 dl 1.6 public void testDrainTo() {
820     LinkedBlockingQueue q = populatedQueue(SIZE);
821     ArrayList l = new ArrayList();
822     q.drainTo(l);
823 jsr166 1.48 assertEquals(0, q.size());
824     assertEquals(SIZE, l.size());
825 jsr166 1.12 for (int i = 0; i < SIZE; ++i)
826 dl 1.6 assertEquals(l.get(i), new Integer(i));
827 dl 1.10 q.add(zero);
828     q.add(one);
829     assertFalse(q.isEmpty());
830     assertTrue(q.contains(zero));
831     assertTrue(q.contains(one));
832     l.clear();
833     q.drainTo(l);
834 jsr166 1.48 assertEquals(0, q.size());
835     assertEquals(2, l.size());
836 jsr166 1.12 for (int i = 0; i < 2; ++i)
837 dl 1.10 assertEquals(l.get(i), new Integer(i));
838 dl 1.6 }
839    
840     /**
841     * drainTo empties full queue, unblocking a waiting put.
842 jsr166 1.12 */
843 jsr166 1.17 public void testDrainToWithActivePut() throws InterruptedException {
844 dl 1.6 final LinkedBlockingQueue q = populatedQueue(SIZE);
845 jsr166 1.17 Thread t = new Thread(new CheckedRunnable() {
846     public void realRun() throws InterruptedException {
847 jsr166 1.60 q.put(new Integer(SIZE + 1));
848 jsr166 1.17 }});
849    
850     t.start();
851     ArrayList l = new ArrayList();
852     q.drainTo(l);
853     assertTrue(l.size() >= SIZE);
854     for (int i = 0; i < SIZE; ++i)
855     assertEquals(l.get(i), new Integer(i));
856     t.join();
857     assertTrue(q.size() + l.size() >= SIZE);
858 dl 1.6 }
859    
860     /**
861 jsr166 1.30 * drainTo(c, n) empties first min(n, size) elements of queue into c
862 jsr166 1.12 */
863 dl 1.6 public void testDrainToN() {
864 dl 1.10 LinkedBlockingQueue q = new LinkedBlockingQueue();
865 dl 1.6 for (int i = 0; i < SIZE + 2; ++i) {
866 jsr166 1.13 for (int j = 0; j < SIZE; j++)
867 dl 1.10 assertTrue(q.offer(new Integer(j)));
868 dl 1.6 ArrayList l = new ArrayList();
869     q.drainTo(l, i);
870 jsr166 1.31 int k = (i < SIZE) ? i : SIZE;
871 jsr166 1.49 assertEquals(k, l.size());
872 jsr166 1.60 assertEquals(SIZE - k, q.size());
873 jsr166 1.12 for (int j = 0; j < k; ++j)
874 dl 1.6 assertEquals(l.get(j), new Integer(j));
875 jsr166 1.55 do {} while (q.poll() != null);
876 dl 1.2 }
877 dl 1.1 }
878    
879 jsr166 1.53 /**
880     * remove(null), contains(null) always return false
881     */
882     public void testNeverContainsNull() {
883     Collection<?>[] qs = {
884     new LinkedBlockingQueue<Object>(),
885     populatedQueue(2),
886     };
887    
888     for (Collection<?> q : qs) {
889     assertFalse(q.contains(null));
890     assertFalse(q.remove(null));
891     }
892     }
893    
894 dl 1.1 }