ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.56
Committed: Wed Dec 31 20:09:08 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.55: +2 -2 lines
Log Message:
whitespace

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