ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.40
Committed: Sun Nov 28 08:43:53 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.39: +15 -8 lines
Log Message:
update testInterruptedTimedPoll

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import static java.util.concurrent.TimeUnit.MILLISECONDS;
13 import java.io.*;
14
15 public class PriorityBlockingQueueTest extends JSR166TestCase {
16
17 public static class Generic extends BlockingQueueTest {
18 protected BlockingQueue emptyCollection() {
19 return new PriorityBlockingQueue();
20 }
21 }
22
23 public static class InitialCapacity extends BlockingQueueTest {
24 protected BlockingQueue emptyCollection() {
25 return new PriorityBlockingQueue(20);
26 }
27 }
28
29 public static void main(String[] args) {
30 junit.textui.TestRunner.run(suite());
31 }
32
33 public static Test suite() {
34 return newTestSuite(PriorityBlockingQueueTest.class,
35 new Generic().testSuite(),
36 new InitialCapacity().testSuite());
37 }
38
39 private static final int NOCAP = Integer.MAX_VALUE;
40
41 /** Sample Comparator */
42 static class MyReverseComparator implements Comparator {
43 public int compare(Object x, Object y) {
44 return ((Comparable)y).compareTo(x);
45 }
46 }
47
48 /**
49 * Create a queue of given size containing consecutive
50 * Integers 0 ... n.
51 */
52 private PriorityBlockingQueue<Integer> populatedQueue(int n) {
53 PriorityBlockingQueue<Integer> q =
54 new PriorityBlockingQueue<Integer>(n);
55 assertTrue(q.isEmpty());
56 for (int i = n-1; i >= 0; i-=2)
57 assertTrue(q.offer(new Integer(i)));
58 for (int i = (n & 1); i < n; i+=2)
59 assertTrue(q.offer(new Integer(i)));
60 assertFalse(q.isEmpty());
61 assertEquals(NOCAP, q.remainingCapacity());
62 assertEquals(n, q.size());
63 return q;
64 }
65
66 /**
67 * A new queue has unbounded capacity
68 */
69 public void testConstructor1() {
70 assertEquals(NOCAP, new PriorityBlockingQueue(SIZE).remainingCapacity());
71 }
72
73 /**
74 * Constructor throws IAE if capacity argument nonpositive
75 */
76 public void testConstructor2() {
77 try {
78 PriorityBlockingQueue q = new PriorityBlockingQueue(0);
79 shouldThrow();
80 } catch (IllegalArgumentException success) {}
81 }
82
83 /**
84 * Initializing from null Collection throws NPE
85 */
86 public void testConstructor3() {
87 try {
88 PriorityBlockingQueue q = new PriorityBlockingQueue(null);
89 shouldThrow();
90 } catch (NullPointerException success) {}
91 }
92
93 /**
94 * Initializing from Collection of null elements throws NPE
95 */
96 public void testConstructor4() {
97 try {
98 Integer[] ints = new Integer[SIZE];
99 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
100 shouldThrow();
101 } catch (NullPointerException success) {}
102 }
103
104 /**
105 * Initializing from Collection with some null elements throws NPE
106 */
107 public void testConstructor5() {
108 try {
109 Integer[] ints = new Integer[SIZE];
110 for (int i = 0; i < SIZE-1; ++i)
111 ints[i] = new Integer(i);
112 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
113 shouldThrow();
114 } catch (NullPointerException success) {}
115 }
116
117 /**
118 * Queue contains all elements of collection used to initialize
119 */
120 public void testConstructor6() {
121 Integer[] ints = new Integer[SIZE];
122 for (int i = 0; i < SIZE; ++i)
123 ints[i] = new Integer(i);
124 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
125 for (int i = 0; i < SIZE; ++i)
126 assertEquals(ints[i], q.poll());
127 }
128
129 /**
130 * The comparator used in constructor is used
131 */
132 public void testConstructor7() {
133 MyReverseComparator cmp = new MyReverseComparator();
134 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
135 assertEquals(cmp, q.comparator());
136 Integer[] ints = new Integer[SIZE];
137 for (int i = 0; i < SIZE; ++i)
138 ints[i] = new Integer(i);
139 q.addAll(Arrays.asList(ints));
140 for (int i = SIZE-1; i >= 0; --i)
141 assertEquals(ints[i], q.poll());
142 }
143
144 /**
145 * isEmpty is true before add, false after
146 */
147 public void testEmpty() {
148 PriorityBlockingQueue q = new PriorityBlockingQueue(2);
149 assertTrue(q.isEmpty());
150 assertEquals(NOCAP, q.remainingCapacity());
151 q.add(one);
152 assertFalse(q.isEmpty());
153 q.add(two);
154 q.remove();
155 q.remove();
156 assertTrue(q.isEmpty());
157 }
158
159 /**
160 * remainingCapacity does not change when elements added or removed,
161 * but size does
162 */
163 public void testRemainingCapacity() {
164 PriorityBlockingQueue q = populatedQueue(SIZE);
165 for (int i = 0; i < SIZE; ++i) {
166 assertEquals(NOCAP, q.remainingCapacity());
167 assertEquals(SIZE-i, q.size());
168 q.remove();
169 }
170 for (int i = 0; i < SIZE; ++i) {
171 assertEquals(NOCAP, q.remainingCapacity());
172 assertEquals(i, q.size());
173 q.add(new Integer(i));
174 }
175 }
176
177 /**
178 * offer(null) throws NPE
179 */
180 public void testOfferNull() {
181 try {
182 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
183 q.offer(null);
184 shouldThrow();
185 } catch (NullPointerException success) {}
186 }
187
188 /**
189 * add(null) throws NPE
190 */
191 public void testAddNull() {
192 try {
193 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
194 q.add(null);
195 shouldThrow();
196 } catch (NullPointerException success) {}
197 }
198
199 /**
200 * Offer of comparable element succeeds
201 */
202 public void testOffer() {
203 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
204 assertTrue(q.offer(zero));
205 assertTrue(q.offer(one));
206 }
207
208 /**
209 * Offer of non-Comparable throws CCE
210 */
211 public void testOfferNonComparable() {
212 try {
213 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
214 q.offer(new Object());
215 q.offer(new Object());
216 q.offer(new Object());
217 shouldThrow();
218 } catch (ClassCastException success) {}
219 }
220
221 /**
222 * add of comparable succeeds
223 */
224 public void testAdd() {
225 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
226 for (int i = 0; i < SIZE; ++i) {
227 assertEquals(i, q.size());
228 assertTrue(q.add(new Integer(i)));
229 }
230 }
231
232 /**
233 * addAll(null) throws NPE
234 */
235 public void testAddAll1() {
236 try {
237 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
238 q.addAll(null);
239 shouldThrow();
240 } catch (NullPointerException success) {}
241 }
242
243 /**
244 * addAll(this) throws IAE
245 */
246 public void testAddAllSelf() {
247 try {
248 PriorityBlockingQueue q = populatedQueue(SIZE);
249 q.addAll(q);
250 shouldThrow();
251 } catch (IllegalArgumentException success) {}
252 }
253
254 /**
255 * addAll of a collection with null elements throws NPE
256 */
257 public void testAddAll2() {
258 try {
259 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
260 Integer[] ints = new Integer[SIZE];
261 q.addAll(Arrays.asList(ints));
262 shouldThrow();
263 } catch (NullPointerException success) {}
264 }
265
266 /**
267 * addAll of a collection with any null elements throws NPE after
268 * possibly adding some elements
269 */
270 public void testAddAll3() {
271 try {
272 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
273 Integer[] ints = new Integer[SIZE];
274 for (int i = 0; i < SIZE-1; ++i)
275 ints[i] = new Integer(i);
276 q.addAll(Arrays.asList(ints));
277 shouldThrow();
278 } catch (NullPointerException success) {}
279 }
280
281 /**
282 * Queue contains all elements of successful addAll
283 */
284 public void testAddAll5() {
285 Integer[] empty = new Integer[0];
286 Integer[] ints = new Integer[SIZE];
287 for (int i = SIZE-1; i >= 0; --i)
288 ints[i] = new Integer(i);
289 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
290 assertFalse(q.addAll(Arrays.asList(empty)));
291 assertTrue(q.addAll(Arrays.asList(ints)));
292 for (int i = 0; i < SIZE; ++i)
293 assertEquals(ints[i], q.poll());
294 }
295
296 /**
297 * put(null) throws NPE
298 */
299 public void testPutNull() {
300 try {
301 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
302 q.put(null);
303 shouldThrow();
304 } catch (NullPointerException success) {}
305 }
306
307 /**
308 * all elements successfully put are contained
309 */
310 public void testPut() {
311 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
312 for (int i = 0; i < SIZE; ++i) {
313 Integer I = new Integer(i);
314 q.put(I);
315 assertTrue(q.contains(I));
316 }
317 assertEquals(SIZE, q.size());
318 }
319
320 /**
321 * put doesn't block waiting for take
322 */
323 public void testPutWithTake() throws InterruptedException {
324 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
325 final int size = 4;
326 Thread t = new Thread(new CheckedRunnable() {
327 public void realRun() {
328 for (int i = 0; i < size; i++)
329 q.put(new Integer(0));
330 }});
331
332 t.start();
333 Thread.sleep(SHORT_DELAY_MS);
334 assertEquals(q.size(), size);
335 q.take();
336 t.interrupt();
337 t.join();
338 }
339
340 /**
341 * timed offer does not time out
342 */
343 public void testTimedOffer() throws InterruptedException {
344 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
345 Thread t = new Thread(new CheckedRunnable() {
346 public void realRun() {
347 q.put(new Integer(0));
348 q.put(new Integer(0));
349 assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, MILLISECONDS));
350 assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, MILLISECONDS));
351 }});
352
353 t.start();
354 Thread.sleep(SMALL_DELAY_MS);
355 t.interrupt();
356 t.join();
357 }
358
359 /**
360 * take retrieves elements in priority order
361 */
362 public void testTake() throws InterruptedException {
363 PriorityBlockingQueue q = populatedQueue(SIZE);
364 for (int i = 0; i < SIZE; ++i) {
365 assertEquals(i, q.take());
366 }
367 }
368
369 /**
370 * Take removes existing elements until empty, then blocks interruptibly
371 */
372 public void testBlockingTake() throws InterruptedException {
373 final PriorityBlockingQueue q = populatedQueue(SIZE);
374 Thread t = new Thread(new CheckedRunnable() {
375 public void realRun() throws InterruptedException {
376 for (int i = 0; i < SIZE; ++i) {
377 assertEquals(i, q.take());
378 }
379 try {
380 q.take();
381 shouldThrow();
382 } catch (InterruptedException success) {}
383 }});
384
385 t.start();
386 Thread.sleep(SHORT_DELAY_MS);
387 t.interrupt();
388 t.join();
389 }
390
391
392 /**
393 * poll succeeds unless empty
394 */
395 public void testPoll() {
396 PriorityBlockingQueue q = populatedQueue(SIZE);
397 for (int i = 0; i < SIZE; ++i) {
398 assertEquals(i, q.poll());
399 }
400 assertNull(q.poll());
401 }
402
403 /**
404 * timed poll with zero timeout succeeds when non-empty, else times out
405 */
406 public void testTimedPoll0() throws InterruptedException {
407 PriorityBlockingQueue q = populatedQueue(SIZE);
408 for (int i = 0; i < SIZE; ++i) {
409 assertEquals(i, q.poll(0, MILLISECONDS));
410 }
411 assertNull(q.poll(0, MILLISECONDS));
412 }
413
414 /**
415 * timed poll with nonzero timeout succeeds when non-empty, else times out
416 */
417 public void testTimedPoll() throws InterruptedException {
418 PriorityBlockingQueue q = populatedQueue(SIZE);
419 for (int i = 0; i < SIZE; ++i) {
420 assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
421 }
422 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
423 }
424
425 /**
426 * Interrupted timed poll throws InterruptedException instead of
427 * returning timeout status
428 */
429 public void testInterruptedTimedPoll() throws InterruptedException {
430 final BlockingQueue<Integer> q = populatedQueue(SIZE);
431 final CountDownLatch aboutToWait = new CountDownLatch(1);
432 Thread t = newStartedThread(new CheckedRunnable() {
433 public void realRun() throws InterruptedException {
434 for (int i = 0; i < SIZE; ++i) {
435 long t0 = System.nanoTime();
436 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
437 assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
438 }
439 long t0 = System.nanoTime();
440 aboutToWait.countDown();
441 try {
442 q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
443 shouldThrow();
444 } catch (InterruptedException success) {
445 assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
446 }
447 }});
448
449 aboutToWait.await();
450 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
451 t.interrupt();
452 awaitTermination(t, MEDIUM_DELAY_MS);
453 }
454
455 /**
456 * peek returns next element, or null if empty
457 */
458 public void testPeek() {
459 PriorityBlockingQueue q = populatedQueue(SIZE);
460 for (int i = 0; i < SIZE; ++i) {
461 assertEquals(i, q.peek());
462 assertEquals(i, q.poll());
463 assertTrue(q.peek() == null ||
464 !q.peek().equals(i));
465 }
466 assertNull(q.peek());
467 }
468
469 /**
470 * element returns next element, or throws NSEE if empty
471 */
472 public void testElement() {
473 PriorityBlockingQueue q = populatedQueue(SIZE);
474 for (int i = 0; i < SIZE; ++i) {
475 assertEquals(i, q.element());
476 assertEquals(i, q.poll());
477 }
478 try {
479 q.element();
480 shouldThrow();
481 } catch (NoSuchElementException success) {}
482 }
483
484 /**
485 * remove removes next element, or throws NSEE if empty
486 */
487 public void testRemove() {
488 PriorityBlockingQueue q = populatedQueue(SIZE);
489 for (int i = 0; i < SIZE; ++i) {
490 assertEquals(i, q.remove());
491 }
492 try {
493 q.remove();
494 shouldThrow();
495 } catch (NoSuchElementException success) {}
496 }
497
498 /**
499 * remove(x) removes x and returns true if present
500 */
501 public void testRemoveElement() {
502 PriorityBlockingQueue q = populatedQueue(SIZE);
503 for (int i = 1; i < SIZE; i+=2) {
504 assertTrue(q.contains(i));
505 assertTrue(q.remove(i));
506 assertFalse(q.contains(i));
507 assertTrue(q.contains(i-1));
508 }
509 for (int i = 0; i < SIZE; i+=2) {
510 assertTrue(q.contains(i));
511 assertTrue(q.remove(i));
512 assertFalse(q.contains(i));
513 assertFalse(q.remove(i+1));
514 assertFalse(q.contains(i+1));
515 }
516 assertTrue(q.isEmpty());
517 }
518
519 /**
520 * contains(x) reports true when elements added but not yet removed
521 */
522 public void testContains() {
523 PriorityBlockingQueue q = populatedQueue(SIZE);
524 for (int i = 0; i < SIZE; ++i) {
525 assertTrue(q.contains(new Integer(i)));
526 q.poll();
527 assertFalse(q.contains(new Integer(i)));
528 }
529 }
530
531 /**
532 * clear removes all elements
533 */
534 public void testClear() {
535 PriorityBlockingQueue q = populatedQueue(SIZE);
536 q.clear();
537 assertTrue(q.isEmpty());
538 assertEquals(0, q.size());
539 q.add(one);
540 assertFalse(q.isEmpty());
541 assertTrue(q.contains(one));
542 q.clear();
543 assertTrue(q.isEmpty());
544 }
545
546 /**
547 * containsAll(c) is true when c contains a subset of elements
548 */
549 public void testContainsAll() {
550 PriorityBlockingQueue q = populatedQueue(SIZE);
551 PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
552 for (int i = 0; i < SIZE; ++i) {
553 assertTrue(q.containsAll(p));
554 assertFalse(p.containsAll(q));
555 p.add(new Integer(i));
556 }
557 assertTrue(p.containsAll(q));
558 }
559
560 /**
561 * retainAll(c) retains only those elements of c and reports true if changed
562 */
563 public void testRetainAll() {
564 PriorityBlockingQueue q = populatedQueue(SIZE);
565 PriorityBlockingQueue p = populatedQueue(SIZE);
566 for (int i = 0; i < SIZE; ++i) {
567 boolean changed = q.retainAll(p);
568 if (i == 0)
569 assertFalse(changed);
570 else
571 assertTrue(changed);
572
573 assertTrue(q.containsAll(p));
574 assertEquals(SIZE-i, q.size());
575 p.remove();
576 }
577 }
578
579 /**
580 * removeAll(c) removes only those elements of c and reports true if changed
581 */
582 public void testRemoveAll() {
583 for (int i = 1; i < SIZE; ++i) {
584 PriorityBlockingQueue q = populatedQueue(SIZE);
585 PriorityBlockingQueue p = populatedQueue(i);
586 assertTrue(q.removeAll(p));
587 assertEquals(SIZE-i, q.size());
588 for (int j = 0; j < i; ++j) {
589 Integer I = (Integer)(p.remove());
590 assertFalse(q.contains(I));
591 }
592 }
593 }
594
595 /**
596 * toArray contains all elements
597 */
598 public void testToArray() throws InterruptedException {
599 PriorityBlockingQueue q = populatedQueue(SIZE);
600 Object[] o = q.toArray();
601 Arrays.sort(o);
602 for (int i = 0; i < o.length; i++)
603 assertSame(o[i], q.take());
604 }
605
606 /**
607 * toArray(a) contains all elements
608 */
609 public void testToArray2() throws InterruptedException {
610 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
611 Integer[] ints = new Integer[SIZE];
612 Integer[] array = q.toArray(ints);
613 assertSame(ints, array);
614 Arrays.sort(ints);
615 for (int i = 0; i < ints.length; i++)
616 assertSame(ints[i], q.take());
617 }
618
619 /**
620 * toArray(null) throws NullPointerException
621 */
622 public void testToArray_NullArg() {
623 PriorityBlockingQueue q = populatedQueue(SIZE);
624 try {
625 q.toArray(null);
626 shouldThrow();
627 } catch (NullPointerException success) {}
628 }
629
630 /**
631 * toArray(incompatible array type) throws ArrayStoreException
632 */
633 public void testToArray1_BadArg() {
634 PriorityBlockingQueue q = populatedQueue(SIZE);
635 try {
636 q.toArray(new String[10]);
637 shouldThrow();
638 } catch (ArrayStoreException success) {}
639 }
640
641 /**
642 * iterator iterates through all elements
643 */
644 public void testIterator() {
645 PriorityBlockingQueue q = populatedQueue(SIZE);
646 int i = 0;
647 Iterator it = q.iterator();
648 while (it.hasNext()) {
649 assertTrue(q.contains(it.next()));
650 ++i;
651 }
652 assertEquals(i, SIZE);
653 }
654
655 /**
656 * iterator.remove removes current element
657 */
658 public void testIteratorRemove() {
659 final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
660 q.add(new Integer(2));
661 q.add(new Integer(1));
662 q.add(new Integer(3));
663
664 Iterator it = q.iterator();
665 it.next();
666 it.remove();
667
668 it = q.iterator();
669 assertEquals(it.next(), new Integer(2));
670 assertEquals(it.next(), new Integer(3));
671 assertFalse(it.hasNext());
672 }
673
674
675 /**
676 * toString contains toStrings of elements
677 */
678 public void testToString() {
679 PriorityBlockingQueue q = populatedQueue(SIZE);
680 String s = q.toString();
681 for (int i = 0; i < SIZE; ++i) {
682 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
683 }
684 }
685
686 /**
687 * offer transfers elements across Executor tasks
688 */
689 public void testPollInExecutor() {
690 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
691 ExecutorService executor = Executors.newFixedThreadPool(2);
692 executor.execute(new CheckedRunnable() {
693 public void realRun() throws InterruptedException {
694 assertNull(q.poll());
695 assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
696 assertTrue(q.isEmpty());
697 }});
698
699 executor.execute(new CheckedRunnable() {
700 public void realRun() throws InterruptedException {
701 Thread.sleep(SMALL_DELAY_MS);
702 q.put(one);
703 }});
704
705 joinPool(executor);
706 }
707
708 /**
709 * A deserialized serialized queue has same elements
710 */
711 public void testSerialization() throws Exception {
712 PriorityBlockingQueue q = populatedQueue(SIZE);
713 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
714 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
715 out.writeObject(q);
716 out.close();
717
718 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
719 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
720 PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
721 assertEquals(q.size(), r.size());
722 while (!q.isEmpty())
723 assertEquals(q.remove(), r.remove());
724 }
725
726 /**
727 * drainTo(null) throws NPE
728 */
729 public void testDrainToNull() {
730 PriorityBlockingQueue q = populatedQueue(SIZE);
731 try {
732 q.drainTo(null);
733 shouldThrow();
734 } catch (NullPointerException success) {}
735 }
736
737 /**
738 * drainTo(this) throws IAE
739 */
740 public void testDrainToSelf() {
741 PriorityBlockingQueue q = populatedQueue(SIZE);
742 try {
743 q.drainTo(q);
744 shouldThrow();
745 } catch (IllegalArgumentException success) {}
746 }
747
748 /**
749 * drainTo(c) empties queue into another collection c
750 */
751 public void testDrainTo() {
752 PriorityBlockingQueue q = populatedQueue(SIZE);
753 ArrayList l = new ArrayList();
754 q.drainTo(l);
755 assertEquals(q.size(), 0);
756 assertEquals(l.size(), SIZE);
757 for (int i = 0; i < SIZE; ++i)
758 assertEquals(l.get(i), new Integer(i));
759 q.add(zero);
760 q.add(one);
761 assertFalse(q.isEmpty());
762 assertTrue(q.contains(zero));
763 assertTrue(q.contains(one));
764 l.clear();
765 q.drainTo(l);
766 assertEquals(q.size(), 0);
767 assertEquals(l.size(), 2);
768 for (int i = 0; i < 2; ++i)
769 assertEquals(l.get(i), new Integer(i));
770 }
771
772 /**
773 * drainTo empties queue
774 */
775 public void testDrainToWithActivePut() throws InterruptedException {
776 final PriorityBlockingQueue q = populatedQueue(SIZE);
777 Thread t = new Thread(new CheckedRunnable() {
778 public void realRun() {
779 q.put(new Integer(SIZE+1));
780 }});
781
782 t.start();
783 ArrayList l = new ArrayList();
784 q.drainTo(l);
785 assertTrue(l.size() >= SIZE);
786 for (int i = 0; i < SIZE; ++i)
787 assertEquals(l.get(i), new Integer(i));
788 t.join();
789 assertTrue(q.size() + l.size() >= SIZE);
790 }
791
792 /**
793 * drainTo(null, n) throws NPE
794 */
795 public void testDrainToNullN() {
796 PriorityBlockingQueue q = populatedQueue(SIZE);
797 try {
798 q.drainTo(null, 0);
799 shouldThrow();
800 } catch (NullPointerException success) {}
801 }
802
803 /**
804 * drainTo(this, n) throws IAE
805 */
806 public void testDrainToSelfN() {
807 PriorityBlockingQueue q = populatedQueue(SIZE);
808 try {
809 q.drainTo(q, 0);
810 shouldThrow();
811 } catch (IllegalArgumentException success) {}
812 }
813
814 /**
815 * drainTo(c, n) empties first min(n, size) elements of queue into c
816 */
817 public void testDrainToN() {
818 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
819 for (int i = 0; i < SIZE + 2; ++i) {
820 for (int j = 0; j < SIZE; j++)
821 assertTrue(q.offer(new Integer(j)));
822 ArrayList l = new ArrayList();
823 q.drainTo(l, i);
824 int k = (i < SIZE) ? i : SIZE;
825 assertEquals(l.size(), k);
826 assertEquals(q.size(), SIZE-k);
827 for (int j = 0; j < k; ++j)
828 assertEquals(l.get(j), new Integer(j));
829 while (q.poll() != null) ;
830 }
831 }
832
833 }