ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingQueueTest.java
Revision: 1.9
Committed: Wed Jan 7 01:13:50 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
CVS Tags: JSR166_PFD
Changes since 1.8: +1 -1 lines
Log Message:
Fixed drainTo tests

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     * http://creativecommons.org/licenses/publicdomain
5     * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import junit.framework.*;
10     import java.util.*;
11     import java.util.concurrent.*;
12 dl 1.2 import java.io.*;
13 dl 1.1
14 dl 1.3 public class LinkedBlockingQueueTest extends JSR166TestCase {
15 dl 1.1
16     public static void main(String[] args) {
17     junit.textui.TestRunner.run (suite());
18     }
19    
20     public static Test suite() {
21     return new TestSuite(LinkedBlockingQueueTest.class);
22     }
23    
24 dl 1.3
25 dl 1.1 /**
26     * Create a queue of given size containing consecutive
27     * Integers 0 ... n.
28     */
29 dl 1.3 private LinkedBlockingQueue populatedQueue(int n) {
30 dl 1.1 LinkedBlockingQueue q = new LinkedBlockingQueue(n);
31     assertTrue(q.isEmpty());
32     for(int i = 0; i < n; i++)
33     assertTrue(q.offer(new Integer(i)));
34     assertFalse(q.isEmpty());
35     assertEquals(0, q.remainingCapacity());
36     assertEquals(n, q.size());
37     return q;
38     }
39    
40 dl 1.4 /**
41 dl 1.5 * A new queue has the indicated capacity, or Integer.MAX_VALUE if
42     * none given
43 dl 1.4 */
44     public void testConstructor1() {
45 dl 1.3 assertEquals(SIZE, new LinkedBlockingQueue(SIZE).remainingCapacity());
46 dl 1.5 assertEquals(Integer.MAX_VALUE, new LinkedBlockingQueue().remainingCapacity());
47 dl 1.1 }
48    
49 dl 1.4 /**
50 dl 1.5 * Constructor throws IAE if capacity argument nonpositive
51 dl 1.4 */
52     public void testConstructor2() {
53 dl 1.1 try {
54     LinkedBlockingQueue q = new LinkedBlockingQueue(0);
55 dl 1.4 shouldThrow();
56 dl 1.1 }
57     catch (IllegalArgumentException success) {}
58     }
59    
60 dl 1.4 /**
61 dl 1.5 * Initializing from null Collection throws NPE
62 dl 1.4 */
63     public void testConstructor3() {
64 dl 1.1 try {
65     LinkedBlockingQueue q = new LinkedBlockingQueue(null);
66 dl 1.4 shouldThrow();
67 dl 1.1 }
68     catch (NullPointerException success) {}
69     }
70    
71 dl 1.4 /**
72 dl 1.5 * Initializing from Collection of null elements throws NPE
73 dl 1.4 */
74     public void testConstructor4() {
75 dl 1.1 try {
76 dl 1.3 Integer[] ints = new Integer[SIZE];
77 dl 1.1 LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
78 dl 1.4 shouldThrow();
79 dl 1.1 }
80     catch (NullPointerException success) {}
81     }
82    
83 dl 1.4 /**
84 dl 1.5 * Initializing from Collection with some null elements throws NPE
85 dl 1.4 */
86     public void testConstructor5() {
87 dl 1.1 try {
88 dl 1.3 Integer[] ints = new Integer[SIZE];
89     for (int i = 0; i < SIZE-1; ++i)
90 dl 1.1 ints[i] = new Integer(i);
91     LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
92 dl 1.4 shouldThrow();
93 dl 1.1 }
94     catch (NullPointerException success) {}
95     }
96    
97 dl 1.4 /**
98 dl 1.5 * Queue contains all elements of collection used to initialize
99 dl 1.4 */
100     public void testConstructor6() {
101 dl 1.1 try {
102 dl 1.3 Integer[] ints = new Integer[SIZE];
103     for (int i = 0; i < SIZE; ++i)
104 dl 1.1 ints[i] = new Integer(i);
105     LinkedBlockingQueue q = new LinkedBlockingQueue(Arrays.asList(ints));
106 dl 1.3 for (int i = 0; i < SIZE; ++i)
107 dl 1.1 assertEquals(ints[i], q.poll());
108     }
109     finally {}
110     }
111    
112 dl 1.4 /**
113 dl 1.5 * Queue transitions from empty to full when elements added
114 dl 1.4 */
115 dl 1.1 public void testEmptyFull() {
116     LinkedBlockingQueue q = new LinkedBlockingQueue(2);
117     assertTrue(q.isEmpty());
118     assertEquals("should have room for 2", 2, q.remainingCapacity());
119 dl 1.3 q.add(one);
120 dl 1.1 assertFalse(q.isEmpty());
121 dl 1.3 q.add(two);
122 dl 1.1 assertFalse(q.isEmpty());
123 dl 1.4 assertEquals(0, q.remainingCapacity());
124     assertFalse(q.offer(three));
125 dl 1.1 }
126    
127 dl 1.4 /**
128 dl 1.5 * remainingCapacity decreases on add, increases on remove
129 dl 1.4 */
130     public void testRemainingCapacity() {
131 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
132     for (int i = 0; i < SIZE; ++i) {
133 dl 1.1 assertEquals(i, q.remainingCapacity());
134 dl 1.3 assertEquals(SIZE-i, q.size());
135 dl 1.1 q.remove();
136     }
137 dl 1.3 for (int i = 0; i < SIZE; ++i) {
138     assertEquals(SIZE-i, q.remainingCapacity());
139 dl 1.1 assertEquals(i, q.size());
140     q.add(new Integer(i));
141     }
142     }
143    
144 dl 1.4 /**
145 dl 1.5 * offer(null) throws NPE
146 dl 1.4 */
147     public void testOfferNull() {
148 dl 1.1 try {
149     LinkedBlockingQueue q = new LinkedBlockingQueue(1);
150     q.offer(null);
151 dl 1.4 shouldThrow();
152 dl 1.1 } catch (NullPointerException success) { }
153     }
154    
155 dl 1.4 /**
156 dl 1.6 * add(null) throws NPE
157     */
158     public void testAddNull() {
159     try {
160     LinkedBlockingQueue q = new LinkedBlockingQueue(1);
161     q.add(null);
162     shouldThrow();
163     } catch (NullPointerException success) { }
164     }
165    
166     /**
167 dl 1.5 * Offer succeeds if not full; fails if full
168 dl 1.4 */
169     public void testOffer() {
170 dl 1.1 LinkedBlockingQueue q = new LinkedBlockingQueue(1);
171 dl 1.3 assertTrue(q.offer(zero));
172     assertFalse(q.offer(one));
173 dl 1.1 }
174    
175 dl 1.4 /**
176 dl 1.5 * add succeeds if not full; throws ISE if full
177 dl 1.4 */
178     public void testAdd() {
179 dl 1.1 try {
180 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
181     for (int i = 0; i < SIZE; ++i) {
182 dl 1.1 assertTrue(q.add(new Integer(i)));
183     }
184     assertEquals(0, q.remainingCapacity());
185 dl 1.3 q.add(new Integer(SIZE));
186 dl 1.1 } catch (IllegalStateException success){
187     }
188     }
189    
190 dl 1.4 /**
191 dl 1.5 * addAll(null) throws NPE
192 dl 1.4 */
193     public void testAddAll1() {
194 dl 1.1 try {
195     LinkedBlockingQueue q = new LinkedBlockingQueue(1);
196     q.addAll(null);
197 dl 1.4 shouldThrow();
198 dl 1.1 }
199     catch (NullPointerException success) {}
200     }
201 dl 1.6
202     /**
203     * addAll(this) throws IAE
204     */
205     public void testAddAllSelf() {
206     try {
207     LinkedBlockingQueue q = populatedQueue(SIZE);
208     q.addAll(q);
209     shouldThrow();
210     }
211     catch (IllegalArgumentException success) {}
212     }
213    
214 dl 1.4 /**
215 dl 1.5 * addAll of a collection with null elements throws NPE
216 dl 1.4 */
217     public void testAddAll2() {
218 dl 1.1 try {
219 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
220     Integer[] ints = new Integer[SIZE];
221 dl 1.1 q.addAll(Arrays.asList(ints));
222 dl 1.4 shouldThrow();
223 dl 1.1 }
224     catch (NullPointerException success) {}
225     }
226 dl 1.4 /**
227 dl 1.5 * addAll of a collection with any null elements throws NPE after
228     * possibly adding some elements
229 dl 1.4 */
230     public void testAddAll3() {
231 dl 1.1 try {
232 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
233     Integer[] ints = new Integer[SIZE];
234     for (int i = 0; i < SIZE-1; ++i)
235 dl 1.1 ints[i] = new Integer(i);
236     q.addAll(Arrays.asList(ints));
237 dl 1.4 shouldThrow();
238 dl 1.1 }
239     catch (NullPointerException success) {}
240     }
241 dl 1.4 /**
242 dl 1.5 * addAll throws ISE if not enough room
243 dl 1.4 */
244     public void testAddAll4() {
245 dl 1.1 try {
246     LinkedBlockingQueue q = new LinkedBlockingQueue(1);
247 dl 1.3 Integer[] ints = new Integer[SIZE];
248     for (int i = 0; i < SIZE; ++i)
249 dl 1.1 ints[i] = new Integer(i);
250     q.addAll(Arrays.asList(ints));
251 dl 1.4 shouldThrow();
252 dl 1.1 }
253     catch (IllegalStateException success) {}
254     }
255 dl 1.4 /**
256 dl 1.5 * Queue contains all elements, in traversal order, of successful addAll
257 dl 1.4 */
258     public void testAddAll5() {
259 dl 1.1 try {
260     Integer[] empty = new Integer[0];
261 dl 1.3 Integer[] ints = new Integer[SIZE];
262     for (int i = 0; i < SIZE; ++i)
263 dl 1.1 ints[i] = new Integer(i);
264 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
265 dl 1.1 assertFalse(q.addAll(Arrays.asList(empty)));
266     assertTrue(q.addAll(Arrays.asList(ints)));
267 dl 1.3 for (int i = 0; i < SIZE; ++i)
268 dl 1.1 assertEquals(ints[i], q.poll());
269     }
270     finally {}
271     }
272    
273 dl 1.4 /**
274 dl 1.5 * put(null) throws NPE
275 dl 1.4 */
276 dl 1.1 public void testPutNull() {
277     try {
278 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
279 dl 1.1 q.put(null);
280 dl 1.4 shouldThrow();
281 dl 1.1 }
282     catch (NullPointerException success){
283     }
284     catch (InterruptedException ie) {
285 dl 1.4 unexpectedException();
286 dl 1.1 }
287     }
288    
289 dl 1.4 /**
290 dl 1.5 * all elements successfully put are contained
291 dl 1.4 */
292 dl 1.1 public void testPut() {
293     try {
294 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
295     for (int i = 0; i < SIZE; ++i) {
296 dl 1.1 Integer I = new Integer(i);
297     q.put(I);
298     assertTrue(q.contains(I));
299     }
300     assertEquals(0, q.remainingCapacity());
301     }
302     catch (InterruptedException ie) {
303 dl 1.4 unexpectedException();
304 dl 1.1 }
305     }
306    
307 dl 1.4 /**
308 dl 1.5 * put blocks interruptibly if full
309 dl 1.4 */
310     public void testBlockingPut() {
311 dl 1.1 Thread t = new Thread(new Runnable() {
312     public void run() {
313     int added = 0;
314     try {
315 dl 1.3 LinkedBlockingQueue q = new LinkedBlockingQueue(SIZE);
316     for (int i = 0; i < SIZE; ++i) {
317 dl 1.1 q.put(new Integer(i));
318     ++added;
319     }
320 dl 1.3 q.put(new Integer(SIZE));
321 dl 1.4 threadShouldThrow();
322 dl 1.1 } catch (InterruptedException ie){
323 dl 1.3 threadAssertEquals(added, SIZE);
324 dl 1.1 }
325     }});
326     t.start();
327     try {
328     Thread.sleep(SHORT_DELAY_MS);
329     t.interrupt();
330     t.join();
331     }
332     catch (InterruptedException ie) {
333 dl 1.4 unexpectedException();
334 dl 1.1 }
335     }
336    
337 dl 1.4 /**
338 dl 1.5 * put blocks waiting for take when full
339 dl 1.4 */
340 dl 1.1 public void testPutWithTake() {
341     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
342     Thread t = new Thread(new Runnable() {
343 dl 1.4 public void run() {
344 dl 1.1 int added = 0;
345     try {
346     q.put(new Object());
347     ++added;
348     q.put(new Object());
349     ++added;
350     q.put(new Object());
351     ++added;
352     q.put(new Object());
353     ++added;
354 dl 1.4 threadShouldThrow();
355 dl 1.1 } catch (InterruptedException e){
356 dl 1.3 threadAssertTrue(added >= 2);
357 dl 1.1 }
358     }
359     });
360     try {
361     t.start();
362     Thread.sleep(SHORT_DELAY_MS);
363     q.take();
364     t.interrupt();
365     t.join();
366     } catch (Exception e){
367 dl 1.4 unexpectedException();
368 dl 1.1 }
369     }
370    
371 dl 1.4 /**
372 dl 1.5 * timed offer times out if full and elements not taken
373 dl 1.4 */
374 dl 1.1 public void testTimedOffer() {
375     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
376     Thread t = new Thread(new Runnable() {
377 dl 1.4 public void run() {
378 dl 1.1 try {
379     q.put(new Object());
380     q.put(new Object());
381 dl 1.3 threadAssertFalse(q.offer(new Object(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
382 dl 1.1 q.offer(new Object(), LONG_DELAY_MS, TimeUnit.MILLISECONDS);
383 dl 1.4 threadShouldThrow();
384 dl 1.1 } catch (InterruptedException success){}
385     }
386     });
387    
388     try {
389     t.start();
390 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
391 dl 1.1 t.interrupt();
392     t.join();
393     } catch (Exception e){
394 dl 1.4 unexpectedException();
395 dl 1.1 }
396     }
397    
398 dl 1.4 /**
399 dl 1.5 * take retrieves elements in FIFO order
400 dl 1.4 */
401     public void testTake() {
402 dl 1.1 try {
403 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
404     for (int i = 0; i < SIZE; ++i) {
405 dl 1.1 assertEquals(i, ((Integer)q.take()).intValue());
406     }
407     } catch (InterruptedException e){
408 dl 1.4 unexpectedException();
409 dl 1.1 }
410     }
411    
412 dl 1.4 /**
413 dl 1.5 * take blocks interruptibly when empty
414 dl 1.4 */
415 dl 1.1 public void testTakeFromEmpty() {
416     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
417     Thread t = new Thread(new Runnable() {
418 dl 1.4 public void run() {
419 dl 1.1 try {
420     q.take();
421 dl 1.4 threadShouldThrow();
422 dl 1.1 } catch (InterruptedException success){ }
423     }
424     });
425     try {
426     t.start();
427     Thread.sleep(SHORT_DELAY_MS);
428     t.interrupt();
429     t.join();
430     } catch (Exception e){
431 dl 1.4 unexpectedException();
432 dl 1.1 }
433     }
434    
435 dl 1.4 /**
436 dl 1.5 * Take removes existing elements until empty, then blocks interruptibly
437 dl 1.4 */
438     public void testBlockingTake() {
439 dl 1.1 Thread t = new Thread(new Runnable() {
440     public void run() {
441     try {
442 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
443     for (int i = 0; i < SIZE; ++i) {
444 dl 1.1 assertEquals(i, ((Integer)q.take()).intValue());
445     }
446     q.take();
447 dl 1.4 threadShouldThrow();
448 dl 1.1 } catch (InterruptedException success){
449     }
450     }});
451     t.start();
452     try {
453     Thread.sleep(SHORT_DELAY_MS);
454     t.interrupt();
455     t.join();
456     }
457     catch (InterruptedException ie) {
458 dl 1.4 unexpectedException();
459 dl 1.1 }
460     }
461    
462    
463 dl 1.4 /**
464 dl 1.5 * poll succeeds unless empty
465 dl 1.4 */
466     public void testPoll() {
467 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
468     for (int i = 0; i < SIZE; ++i) {
469 dl 1.1 assertEquals(i, ((Integer)q.poll()).intValue());
470     }
471     assertNull(q.poll());
472     }
473    
474 dl 1.4 /**
475 dl 1.5 * timed pool with zero timeout succeeds when non-empty, else times out
476 dl 1.4 */
477 dl 1.1 public void testTimedPoll0() {
478     try {
479 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
480     for (int i = 0; i < SIZE; ++i) {
481 dl 1.1 assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
482     }
483     assertNull(q.poll(0, TimeUnit.MILLISECONDS));
484     } catch (InterruptedException e){
485 dl 1.4 unexpectedException();
486 dl 1.1 }
487     }
488    
489 dl 1.4 /**
490 dl 1.5 * timed pool with nonzero timeout succeeds when non-empty, else times out
491 dl 1.4 */
492 dl 1.1 public void testTimedPoll() {
493     try {
494 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
495     for (int i = 0; i < SIZE; ++i) {
496 dl 1.1 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
497     }
498     assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
499     } catch (InterruptedException e){
500 dl 1.4 unexpectedException();
501 dl 1.1 }
502     }
503    
504 dl 1.4 /**
505 dl 1.5 * Interrupted timed poll throws InterruptedException instead of
506     * returning timeout status
507 dl 1.4 */
508     public void testInterruptedTimedPoll() {
509 dl 1.1 Thread t = new Thread(new Runnable() {
510     public void run() {
511     try {
512 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
513     for (int i = 0; i < SIZE; ++i) {
514     threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
515 dl 1.1 }
516 dl 1.3 threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
517 dl 1.1 } catch (InterruptedException success){
518     }
519     }});
520     t.start();
521     try {
522     Thread.sleep(SHORT_DELAY_MS);
523     t.interrupt();
524     t.join();
525     }
526     catch (InterruptedException ie) {
527 dl 1.4 unexpectedException();
528 dl 1.1 }
529     }
530    
531 dl 1.4 /**
532 dl 1.5 * timed poll before a delayed offer fails; after offer succeeds;
533     * on interruption throws
534 dl 1.4 */
535     public void testTimedPollWithOffer() {
536 dl 1.1 final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
537     Thread t = new Thread(new Runnable() {
538 dl 1.4 public void run() {
539 dl 1.1 try {
540 dl 1.3 threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
541 dl 1.1 q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
542     q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
543 dl 1.4 threadShouldThrow();
544 dl 1.1 } catch (InterruptedException success) { }
545     }
546     });
547     try {
548     t.start();
549 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
550     assertTrue(q.offer(zero, SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
551 dl 1.1 t.interrupt();
552     t.join();
553     } catch (Exception e){
554 dl 1.4 unexpectedException();
555 dl 1.1 }
556     }
557    
558 dl 1.4 /**
559 dl 1.5 * peek returns next element, or null if empty
560 dl 1.4 */
561     public void testPeek() {
562 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
563     for (int i = 0; i < SIZE; ++i) {
564 dl 1.1 assertEquals(i, ((Integer)q.peek()).intValue());
565     q.poll();
566     assertTrue(q.peek() == null ||
567     i != ((Integer)q.peek()).intValue());
568     }
569     assertNull(q.peek());
570     }
571    
572 dl 1.4 /**
573 dl 1.5 * element returns next element, or throws NSEE if empty
574 dl 1.4 */
575     public void testElement() {
576 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
577     for (int i = 0; i < SIZE; ++i) {
578 dl 1.1 assertEquals(i, ((Integer)q.element()).intValue());
579     q.poll();
580     }
581     try {
582     q.element();
583 dl 1.4 shouldThrow();
584 dl 1.1 }
585     catch (NoSuchElementException success) {}
586     }
587    
588 dl 1.4 /**
589 dl 1.5 * remove removes next element, or throws NSEE if empty
590 dl 1.4 */
591     public void testRemove() {
592 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
593     for (int i = 0; i < SIZE; ++i) {
594 dl 1.1 assertEquals(i, ((Integer)q.remove()).intValue());
595     }
596     try {
597     q.remove();
598 dl 1.4 shouldThrow();
599 dl 1.1 } catch (NoSuchElementException success){
600     }
601     }
602    
603 dl 1.4 /**
604 dl 1.5 * remove(x) removes x and returns true if present
605 dl 1.4 */
606     public void testRemoveElement() {
607 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
608     for (int i = 1; i < SIZE; i+=2) {
609 dl 1.1 assertTrue(q.remove(new Integer(i)));
610     }
611 dl 1.3 for (int i = 0; i < SIZE; i+=2) {
612 dl 1.1 assertTrue(q.remove(new Integer(i)));
613     assertFalse(q.remove(new Integer(i+1)));
614     }
615 dl 1.2 assertTrue(q.isEmpty());
616 dl 1.1 }
617    
618 dl 1.4 /**
619 dl 1.5 * contains(x) reports true when elements added but not yet removed
620 dl 1.4 */
621     public void testContains() {
622 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
623     for (int i = 0; i < SIZE; ++i) {
624 dl 1.1 assertTrue(q.contains(new Integer(i)));
625     q.poll();
626     assertFalse(q.contains(new Integer(i)));
627     }
628     }
629    
630 dl 1.4 /**
631 dl 1.5 * clear removes all elements
632 dl 1.4 */
633     public void testClear() {
634 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
635 dl 1.1 q.clear();
636     assertTrue(q.isEmpty());
637     assertEquals(0, q.size());
638 dl 1.3 assertEquals(SIZE, q.remainingCapacity());
639     q.add(one);
640 dl 1.1 assertFalse(q.isEmpty());
641     q.clear();
642     assertTrue(q.isEmpty());
643     }
644    
645 dl 1.4 /**
646 dl 1.5 * containsAll(c) is true when c contains a subset of elements
647 dl 1.4 */
648     public void testContainsAll() {
649 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
650     LinkedBlockingQueue p = new LinkedBlockingQueue(SIZE);
651     for (int i = 0; i < SIZE; ++i) {
652 dl 1.1 assertTrue(q.containsAll(p));
653     assertFalse(p.containsAll(q));
654     p.add(new Integer(i));
655     }
656     assertTrue(p.containsAll(q));
657     }
658    
659 dl 1.4 /**
660 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
661 dl 1.4 */
662     public void testRetainAll() {
663 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
664     LinkedBlockingQueue p = populatedQueue(SIZE);
665     for (int i = 0; i < SIZE; ++i) {
666 dl 1.1 boolean changed = q.retainAll(p);
667     if (i == 0)
668     assertFalse(changed);
669     else
670     assertTrue(changed);
671    
672     assertTrue(q.containsAll(p));
673 dl 1.3 assertEquals(SIZE-i, q.size());
674 dl 1.1 p.remove();
675     }
676     }
677    
678 dl 1.4 /**
679 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
680 dl 1.4 */
681     public void testRemoveAll() {
682 dl 1.3 for (int i = 1; i < SIZE; ++i) {
683     LinkedBlockingQueue q = populatedQueue(SIZE);
684     LinkedBlockingQueue p = populatedQueue(i);
685 dl 1.1 assertTrue(q.removeAll(p));
686 dl 1.3 assertEquals(SIZE-i, q.size());
687 dl 1.1 for (int j = 0; j < i; ++j) {
688     Integer I = (Integer)(p.remove());
689     assertFalse(q.contains(I));
690     }
691     }
692     }
693    
694 dl 1.4 /**
695 dl 1.5 * toArray contains all elements
696 dl 1.4 */
697     public void testToArray() {
698 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
699 dl 1.1 Object[] o = q.toArray();
700     try {
701     for(int i = 0; i < o.length; i++)
702     assertEquals(o[i], q.take());
703     } catch (InterruptedException e){
704 dl 1.4 unexpectedException();
705 dl 1.1 }
706     }
707    
708 dl 1.4 /**
709 dl 1.5 * toArray(a) contains all elements
710 dl 1.4 */
711     public void testToArray2() {
712 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
713     Integer[] ints = new Integer[SIZE];
714 dl 1.1 ints = (Integer[])q.toArray(ints);
715     try {
716     for(int i = 0; i < ints.length; i++)
717     assertEquals(ints[i], q.take());
718     } catch (InterruptedException e){
719 dl 1.4 unexpectedException();
720 dl 1.1 }
721     }
722 dl 1.6
723     /**
724     * toArray(null) throws NPE
725     */
726     public void testToArray_BadArg() {
727     try {
728     LinkedBlockingQueue q = populatedQueue(SIZE);
729     Object o[] = q.toArray(null);
730     shouldThrow();
731     } catch(NullPointerException success){}
732     }
733    
734     /**
735 dl 1.8 * toArray with incompatible array type throws CCE
736 dl 1.6 */
737     public void testToArray1_BadArg() {
738     try {
739     LinkedBlockingQueue q = populatedQueue(SIZE);
740     Object o[] = q.toArray(new String[10] );
741     shouldThrow();
742     } catch(ArrayStoreException success){}
743     }
744    
745 dl 1.1
746 dl 1.4 /**
747 dl 1.5 * iterator iterates through all elements
748 dl 1.4 */
749     public void testIterator() {
750 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
751 dl 1.1 Iterator it = q.iterator();
752     try {
753     while(it.hasNext()){
754     assertEquals(it.next(), q.take());
755     }
756     } catch (InterruptedException e){
757 dl 1.4 unexpectedException();
758 dl 1.1 }
759     }
760    
761 dl 1.4 /**
762 dl 1.5 * iterator.remove removes current element
763     */
764     public void testIteratorRemove () {
765     final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
766     q.add(two);
767     q.add(one);
768     q.add(three);
769    
770     Iterator it = q.iterator();
771     it.next();
772     it.remove();
773    
774     it = q.iterator();
775     assertEquals(it.next(), one);
776     assertEquals(it.next(), three);
777     assertFalse(it.hasNext());
778     }
779    
780    
781     /**
782     * iterator ordering is FIFO
783 dl 1.4 */
784 dl 1.1 public void testIteratorOrdering() {
785     final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
786 dl 1.3 q.add(one);
787     q.add(two);
788     q.add(three);
789 dl 1.4 assertEquals(0, q.remainingCapacity());
790 dl 1.1 int k = 0;
791     for (Iterator it = q.iterator(); it.hasNext();) {
792     int i = ((Integer)(it.next())).intValue();
793 dl 1.4 assertEquals(++k, i);
794 dl 1.1 }
795 dl 1.4 assertEquals(3, k);
796 dl 1.1 }
797    
798 dl 1.4 /**
799 dl 1.5 * Modifications do not cause iterators to fail
800 dl 1.4 */
801 dl 1.1 public void testWeaklyConsistentIteration () {
802     final LinkedBlockingQueue q = new LinkedBlockingQueue(3);
803 dl 1.3 q.add(one);
804     q.add(two);
805     q.add(three);
806 dl 1.1 try {
807     for (Iterator it = q.iterator(); it.hasNext();) {
808     q.remove();
809     it.next();
810     }
811     }
812     catch (ConcurrentModificationException e) {
813 dl 1.4 unexpectedException();
814 dl 1.1 }
815 dl 1.4 assertEquals(0, q.size());
816 dl 1.1 }
817    
818    
819 dl 1.4 /**
820 dl 1.5 * toString contains toStrings of elements
821 dl 1.4 */
822     public void testToString() {
823 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
824 dl 1.1 String s = q.toString();
825 dl 1.3 for (int i = 0; i < SIZE; ++i) {
826 dl 1.1 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
827     }
828     }
829    
830    
831 dl 1.4 /**
832 dl 1.5 * offer transfers elements across Executor tasks
833 dl 1.4 */
834 dl 1.1 public void testOfferInExecutor() {
835     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
836 dl 1.3 q.add(one);
837     q.add(two);
838 dl 1.1 ExecutorService executor = Executors.newFixedThreadPool(2);
839     executor.execute(new Runnable() {
840     public void run() {
841 dl 1.3 threadAssertFalse(q.offer(three));
842 dl 1.1 try {
843 dl 1.3 threadAssertTrue(q.offer(three, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
844     threadAssertEquals(0, q.remainingCapacity());
845 dl 1.1 }
846     catch (InterruptedException e) {
847 dl 1.4 threadUnexpectedException();
848 dl 1.1 }
849     }
850     });
851    
852     executor.execute(new Runnable() {
853     public void run() {
854     try {
855 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
856     threadAssertEquals(one, q.take());
857 dl 1.1 }
858     catch (InterruptedException e) {
859 dl 1.4 threadUnexpectedException();
860 dl 1.1 }
861     }
862     });
863    
864 dl 1.3 joinPool(executor);
865 dl 1.1 }
866    
867 dl 1.4 /**
868 dl 1.5 * poll retrieves elements across Executor threads
869 dl 1.4 */
870 dl 1.1 public void testPollInExecutor() {
871     final LinkedBlockingQueue q = new LinkedBlockingQueue(2);
872     ExecutorService executor = Executors.newFixedThreadPool(2);
873     executor.execute(new Runnable() {
874     public void run() {
875 dl 1.3 threadAssertNull(q.poll());
876 dl 1.1 try {
877 dl 1.3 threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
878     threadAssertTrue(q.isEmpty());
879 dl 1.1 }
880     catch (InterruptedException e) {
881 dl 1.4 threadUnexpectedException();
882 dl 1.1 }
883     }
884     });
885    
886     executor.execute(new Runnable() {
887     public void run() {
888     try {
889 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
890     q.put(one);
891 dl 1.1 }
892     catch (InterruptedException e) {
893 dl 1.4 threadUnexpectedException();
894 dl 1.1 }
895     }
896     });
897    
898 dl 1.3 joinPool(executor);
899 dl 1.2 }
900    
901 dl 1.4 /**
902 dl 1.5 * A deserialized serialized queue has same elements in same order
903 dl 1.4 */
904 dl 1.2 public void testSerialization() {
905 dl 1.3 LinkedBlockingQueue q = populatedQueue(SIZE);
906 dl 1.2
907     try {
908     ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
909     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
910     out.writeObject(q);
911     out.close();
912    
913     ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
914     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
915     LinkedBlockingQueue r = (LinkedBlockingQueue)in.readObject();
916     assertEquals(q.size(), r.size());
917     while (!q.isEmpty())
918     assertEquals(q.remove(), r.remove());
919     } catch(Exception e){
920 dl 1.4 unexpectedException();
921 dl 1.6 }
922     }
923    
924     /**
925     * drainTo(null) throws NPE
926     */
927     public void testDrainToNull() {
928     LinkedBlockingQueue q = populatedQueue(SIZE);
929     try {
930     q.drainTo(null);
931     shouldThrow();
932     } catch(NullPointerException success) {
933     }
934     }
935    
936     /**
937     * drainTo(this) throws IAE
938     */
939     public void testDrainToSelf() {
940     LinkedBlockingQueue q = populatedQueue(SIZE);
941     try {
942     q.drainTo(q);
943     shouldThrow();
944     } catch(IllegalArgumentException success) {
945     }
946     }
947    
948     /**
949     * drainTo(c) empties queue into another collection c
950     */
951     public void testDrainTo() {
952     LinkedBlockingQueue q = populatedQueue(SIZE);
953     ArrayList l = new ArrayList();
954     q.drainTo(l);
955     assertEquals(q.size(), 0);
956     assertEquals(l.size(), SIZE);
957     for (int i = 0; i < SIZE; ++i)
958     assertEquals(l.get(i), new Integer(i));
959     }
960    
961     /**
962     * drainTo empties full queue, unblocking a waiting put.
963     */
964     public void testDrainToWithActivePut() {
965     final LinkedBlockingQueue q = populatedQueue(SIZE);
966     Thread t = new Thread(new Runnable() {
967     public void run() {
968     try {
969     q.put(new Integer(SIZE+1));
970     } catch (InterruptedException ie){
971     threadUnexpectedException();
972     }
973     }
974     });
975     try {
976     t.start();
977     ArrayList l = new ArrayList();
978     q.drainTo(l);
979     assertTrue(l.size() >= SIZE);
980     for (int i = 0; i < SIZE; ++i)
981     assertEquals(l.get(i), new Integer(i));
982     t.join();
983 dl 1.9 assertTrue(q.size() + l.size() >= SIZE);
984 dl 1.6 } catch(Exception e){
985     unexpectedException();
986     }
987     }
988    
989     /**
990     * drainTo(null, n) throws NPE
991     */
992     public void testDrainToNullN() {
993     LinkedBlockingQueue q = populatedQueue(SIZE);
994     try {
995     q.drainTo(null, 0);
996     shouldThrow();
997     } catch(NullPointerException success) {
998     }
999     }
1000    
1001     /**
1002     * drainTo(this, n) throws IAE
1003     */
1004     public void testDrainToSelfN() {
1005     LinkedBlockingQueue q = populatedQueue(SIZE);
1006     try {
1007     q.drainTo(q, 0);
1008     shouldThrow();
1009     } catch(IllegalArgumentException success) {
1010     }
1011     }
1012    
1013     /**
1014     * drainTo(c, n) empties first max {n, size} elements of queue into c
1015     */
1016     public void testDrainToN() {
1017     for (int i = 0; i < SIZE + 2; ++i) {
1018     LinkedBlockingQueue q = populatedQueue(SIZE);
1019     ArrayList l = new ArrayList();
1020     q.drainTo(l, i);
1021     int k = (i < SIZE)? i : SIZE;
1022     assertEquals(q.size(), SIZE-k);
1023     assertEquals(l.size(), k);
1024     for (int j = 0; j < k; ++j)
1025     assertEquals(l.get(j), new Integer(j));
1026 dl 1.2 }
1027 dl 1.1 }
1028    
1029     }