ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.79
Committed: Sun Aug 11 22:29:27 2019 UTC (4 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.78: +11 -9 lines
Log Message:
more assertions; more interleavings

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