ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.68
Committed: Sat Aug 6 17:02:49 2016 UTC (7 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.67: +1 -1 lines
Log Message:
simplify calls to waitForThreadToEnterWaitState

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 main(suite(), args);
42 }
43
44 public static Test suite() {
45 return newTestSuite(PriorityBlockingQueueTest.class,
46 new Generic().testSuite(),
47 new InitialCapacity().testSuite());
48 }
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(Integer.MAX_VALUE, 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(Integer.MAX_VALUE,
80 new PriorityBlockingQueue(SIZE).remainingCapacity());
81 }
82
83 /**
84 * Constructor throws IAE if capacity argument nonpositive
85 */
86 public void testConstructor2() {
87 try {
88 new PriorityBlockingQueue(0);
89 shouldThrow();
90 } catch (IllegalArgumentException success) {}
91 }
92
93 /**
94 * Initializing from null Collection throws NPE
95 */
96 public void testConstructor3() {
97 try {
98 new PriorityBlockingQueue(null);
99 shouldThrow();
100 } catch (NullPointerException success) {}
101 }
102
103 /**
104 * Initializing from Collection of null elements throws NPE
105 */
106 public void testConstructor4() {
107 Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
108 try {
109 new PriorityBlockingQueue(elements);
110 shouldThrow();
111 } catch (NullPointerException success) {}
112 }
113
114 /**
115 * Initializing from Collection with some null elements throws NPE
116 */
117 public void testConstructor5() {
118 Integer[] ints = new Integer[SIZE];
119 for (int i = 0; i < SIZE - 1; ++i)
120 ints[i] = i;
121 Collection<Integer> elements = Arrays.asList(ints);
122 try {
123 new PriorityBlockingQueue(elements);
124 shouldThrow();
125 } catch (NullPointerException success) {}
126 }
127
128 /**
129 * Queue contains all elements of collection used to initialize
130 */
131 public void testConstructor6() {
132 Integer[] ints = new Integer[SIZE];
133 for (int i = 0; i < SIZE; ++i)
134 ints[i] = i;
135 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
136 for (int i = 0; i < SIZE; ++i)
137 assertEquals(ints[i], q.poll());
138 }
139
140 /**
141 * The comparator used in constructor is used
142 */
143 public void testConstructor7() {
144 MyReverseComparator cmp = new MyReverseComparator();
145 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
146 assertEquals(cmp, q.comparator());
147 Integer[] ints = new Integer[SIZE];
148 for (int i = 0; i < SIZE; ++i)
149 ints[i] = new Integer(i);
150 q.addAll(Arrays.asList(ints));
151 for (int i = SIZE - 1; i >= 0; --i)
152 assertEquals(ints[i], q.poll());
153 }
154
155 /**
156 * isEmpty is true before add, false after
157 */
158 public void testEmpty() {
159 PriorityBlockingQueue q = new PriorityBlockingQueue(2);
160 assertTrue(q.isEmpty());
161 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
162 q.add(one);
163 assertFalse(q.isEmpty());
164 q.add(two);
165 q.remove();
166 q.remove();
167 assertTrue(q.isEmpty());
168 }
169
170 /**
171 * remainingCapacity() always returns Integer.MAX_VALUE
172 */
173 public void testRemainingCapacity() {
174 BlockingQueue q = populatedQueue(SIZE);
175 for (int i = 0; i < SIZE; ++i) {
176 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
177 assertEquals(SIZE - i, q.size());
178 assertEquals(i, q.remove());
179 }
180 for (int i = 0; i < SIZE; ++i) {
181 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
182 assertEquals(i, q.size());
183 assertTrue(q.add(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 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
201 try {
202 q.offer(new Object());
203 shouldThrow();
204 } catch (ClassCastException success) {
205 assertTrue(q.isEmpty());
206 assertEquals(0, q.size());
207 assertNull(q.poll());
208 }
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 PriorityBlockingQueue q = populatedQueue(SIZE);
227 try {
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 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
239 Integer[] ints = new Integer[SIZE];
240 for (int i = 0; i < SIZE - 1; ++i)
241 ints[i] = new Integer(i);
242 try {
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 x = new Integer(i);
270 q.put(x);
271 assertTrue(q.contains(x));
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 long startTime = System.nanoTime();
400 for (int i = 0; i < SIZE; ++i) {
401 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
402 }
403 aboutToWait.countDown();
404 try {
405 q.poll(LONG_DELAY_MS, MILLISECONDS);
406 shouldThrow();
407 } catch (InterruptedException success) {
408 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
409 }
410 }});
411
412 aboutToWait.await();
413 waitForThreadToEnterWaitState(t);
414 t.interrupt();
415 awaitTermination(t);
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 x = (Integer)(p.remove());
532 assertFalse(q.contains(x));
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 Iterator it = q.iterator();
578 int i;
579 for (i = 0; it.hasNext(); i++)
580 assertTrue(q.contains(it.next()));
581 assertEquals(i, SIZE);
582 assertIteratorExhausted(it);
583 }
584
585 /**
586 * iterator of empty collection has no elements
587 */
588 public void testEmptyIterator() {
589 assertIteratorExhausted(new PriorityBlockingQueue().iterator());
590 }
591
592 /**
593 * iterator.remove removes current element
594 */
595 public void testIteratorRemove() {
596 final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
597 q.add(new Integer(2));
598 q.add(new Integer(1));
599 q.add(new Integer(3));
600
601 Iterator it = q.iterator();
602 it.next();
603 it.remove();
604
605 it = q.iterator();
606 assertEquals(it.next(), new Integer(2));
607 assertEquals(it.next(), new Integer(3));
608 assertFalse(it.hasNext());
609 }
610
611 /**
612 * toString contains toStrings of elements
613 */
614 public void testToString() {
615 PriorityBlockingQueue q = populatedQueue(SIZE);
616 String s = q.toString();
617 for (int i = 0; i < SIZE; ++i) {
618 assertTrue(s.contains(String.valueOf(i)));
619 }
620 }
621
622 /**
623 * timed poll transfers elements across Executor tasks
624 */
625 public void testPollInExecutor() {
626 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
627 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
628 final ExecutorService executor = Executors.newFixedThreadPool(2);
629 try (PoolCleaner cleaner = cleaner(executor)) {
630 executor.execute(new CheckedRunnable() {
631 public void realRun() throws InterruptedException {
632 assertNull(q.poll());
633 threadsStarted.await();
634 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
635 checkEmpty(q);
636 }});
637
638 executor.execute(new CheckedRunnable() {
639 public void realRun() throws InterruptedException {
640 threadsStarted.await();
641 q.put(one);
642 }});
643 }
644 }
645
646 /**
647 * A deserialized serialized queue has same elements
648 */
649 public void testSerialization() throws Exception {
650 Queue x = populatedQueue(SIZE);
651 Queue y = serialClone(x);
652
653 assertNotSame(x, y);
654 assertEquals(x.size(), y.size());
655 while (!x.isEmpty()) {
656 assertFalse(y.isEmpty());
657 assertEquals(x.remove(), y.remove());
658 }
659 assertTrue(y.isEmpty());
660 }
661
662 /**
663 * drainTo(c) empties queue into another collection c
664 */
665 public void testDrainTo() {
666 PriorityBlockingQueue q = populatedQueue(SIZE);
667 ArrayList l = new ArrayList();
668 q.drainTo(l);
669 assertEquals(0, q.size());
670 assertEquals(SIZE, l.size());
671 for (int i = 0; i < SIZE; ++i)
672 assertEquals(l.get(i), new Integer(i));
673 q.add(zero);
674 q.add(one);
675 assertFalse(q.isEmpty());
676 assertTrue(q.contains(zero));
677 assertTrue(q.contains(one));
678 l.clear();
679 q.drainTo(l);
680 assertEquals(0, q.size());
681 assertEquals(2, l.size());
682 for (int i = 0; i < 2; ++i)
683 assertEquals(l.get(i), new Integer(i));
684 }
685
686 /**
687 * drainTo empties queue
688 */
689 public void testDrainToWithActivePut() throws InterruptedException {
690 final PriorityBlockingQueue q = populatedQueue(SIZE);
691 Thread t = new Thread(new CheckedRunnable() {
692 public void realRun() {
693 q.put(new Integer(SIZE + 1));
694 }});
695
696 t.start();
697 ArrayList l = new ArrayList();
698 q.drainTo(l);
699 assertTrue(l.size() >= SIZE);
700 for (int i = 0; i < SIZE; ++i)
701 assertEquals(l.get(i), new Integer(i));
702 t.join();
703 assertTrue(q.size() + l.size() >= SIZE);
704 }
705
706 /**
707 * drainTo(c, n) empties first min(n, size) elements of queue into c
708 */
709 public void testDrainToN() {
710 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE * 2);
711 for (int i = 0; i < SIZE + 2; ++i) {
712 for (int j = 0; j < SIZE; j++)
713 assertTrue(q.offer(new Integer(j)));
714 ArrayList l = new ArrayList();
715 q.drainTo(l, i);
716 int k = (i < SIZE) ? i : SIZE;
717 assertEquals(k, l.size());
718 assertEquals(SIZE - k, q.size());
719 for (int j = 0; j < k; ++j)
720 assertEquals(l.get(j), new Integer(j));
721 do {} while (q.poll() != null);
722 }
723 }
724
725 /**
726 * remove(null), contains(null) always return false
727 */
728 public void testNeverContainsNull() {
729 Collection<?>[] qs = {
730 new PriorityBlockingQueue<Object>(),
731 populatedQueue(2),
732 };
733
734 for (Collection<?> q : qs) {
735 assertFalse(q.contains(null));
736 assertFalse(q.remove(null));
737 }
738 }
739
740 }