ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.53
Committed: Sun Nov 23 22:27:06 2014 UTC (9 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.52: +15 -0 lines
Log Message:
add tests for contains(null), remove(null)

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