ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.66
Committed: Tue Oct 6 00:03:55 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.65: +4 -6 lines
Log Message:
improve 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/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 q.offer(new Object());
204 shouldThrow();
205 } catch (ClassCastException success) {}
206 }
207
208 /**
209 * add of comparable succeeds
210 */
211 public void testAdd() {
212 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
213 for (int i = 0; i < SIZE; ++i) {
214 assertEquals(i, q.size());
215 assertTrue(q.add(new Integer(i)));
216 }
217 }
218
219 /**
220 * addAll(this) throws IAE
221 */
222 public void testAddAllSelf() {
223 PriorityBlockingQueue q = populatedQueue(SIZE);
224 try {
225 q.addAll(q);
226 shouldThrow();
227 } catch (IllegalArgumentException success) {}
228 }
229
230 /**
231 * addAll of a collection with any null elements throws NPE after
232 * possibly adding some elements
233 */
234 public void testAddAll3() {
235 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
236 Integer[] ints = new Integer[SIZE];
237 for (int i = 0; i < SIZE - 1; ++i)
238 ints[i] = new Integer(i);
239 try {
240 q.addAll(Arrays.asList(ints));
241 shouldThrow();
242 } catch (NullPointerException success) {}
243 }
244
245 /**
246 * Queue contains all elements of successful addAll
247 */
248 public void testAddAll5() {
249 Integer[] empty = new Integer[0];
250 Integer[] ints = new Integer[SIZE];
251 for (int i = SIZE - 1; i >= 0; --i)
252 ints[i] = new Integer(i);
253 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
254 assertFalse(q.addAll(Arrays.asList(empty)));
255 assertTrue(q.addAll(Arrays.asList(ints)));
256 for (int i = 0; i < SIZE; ++i)
257 assertEquals(ints[i], q.poll());
258 }
259
260 /**
261 * all elements successfully put are contained
262 */
263 public void testPut() {
264 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
265 for (int i = 0; i < SIZE; ++i) {
266 Integer x = new Integer(i);
267 q.put(x);
268 assertTrue(q.contains(x));
269 }
270 assertEquals(SIZE, q.size());
271 }
272
273 /**
274 * put doesn't block waiting for take
275 */
276 public void testPutWithTake() throws InterruptedException {
277 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
278 final int size = 4;
279 Thread t = newStartedThread(new CheckedRunnable() {
280 public void realRun() {
281 for (int i = 0; i < size; i++)
282 q.put(new Integer(0));
283 }});
284
285 awaitTermination(t);
286 assertEquals(size, q.size());
287 q.take();
288 }
289
290 /**
291 * timed offer does not time out
292 */
293 public void testTimedOffer() throws InterruptedException {
294 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
295 Thread t = newStartedThread(new CheckedRunnable() {
296 public void realRun() {
297 q.put(new Integer(0));
298 q.put(new Integer(0));
299 assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, MILLISECONDS));
300 assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, MILLISECONDS));
301 }});
302
303 awaitTermination(t);
304 }
305
306 /**
307 * take retrieves elements in priority order
308 */
309 public void testTake() throws InterruptedException {
310 PriorityBlockingQueue q = populatedQueue(SIZE);
311 for (int i = 0; i < SIZE; ++i) {
312 assertEquals(i, q.take());
313 }
314 }
315
316 /**
317 * Take removes existing elements until empty, then blocks interruptibly
318 */
319 public void testBlockingTake() throws InterruptedException {
320 final PriorityBlockingQueue q = populatedQueue(SIZE);
321 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
322 Thread t = newStartedThread(new CheckedRunnable() {
323 public void realRun() throws InterruptedException {
324 for (int i = 0; i < SIZE; ++i) {
325 assertEquals(i, q.take());
326 }
327
328 Thread.currentThread().interrupt();
329 try {
330 q.take();
331 shouldThrow();
332 } catch (InterruptedException success) {}
333 assertFalse(Thread.interrupted());
334
335 pleaseInterrupt.countDown();
336 try {
337 q.take();
338 shouldThrow();
339 } catch (InterruptedException success) {}
340 assertFalse(Thread.interrupted());
341 }});
342
343 await(pleaseInterrupt);
344 assertThreadStaysAlive(t);
345 t.interrupt();
346 awaitTermination(t);
347 }
348
349 /**
350 * poll succeeds unless empty
351 */
352 public void testPoll() {
353 PriorityBlockingQueue q = populatedQueue(SIZE);
354 for (int i = 0; i < SIZE; ++i) {
355 assertEquals(i, q.poll());
356 }
357 assertNull(q.poll());
358 }
359
360 /**
361 * timed poll with zero timeout succeeds when non-empty, else times out
362 */
363 public void testTimedPoll0() throws InterruptedException {
364 PriorityBlockingQueue q = populatedQueue(SIZE);
365 for (int i = 0; i < SIZE; ++i) {
366 assertEquals(i, q.poll(0, MILLISECONDS));
367 }
368 assertNull(q.poll(0, MILLISECONDS));
369 }
370
371 /**
372 * timed poll with nonzero timeout succeeds when non-empty, else times out
373 */
374 public void testTimedPoll() throws InterruptedException {
375 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
376 for (int i = 0; i < SIZE; ++i) {
377 long startTime = System.nanoTime();
378 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
379 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
380 }
381 long startTime = System.nanoTime();
382 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
383 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
384 checkEmpty(q);
385 }
386
387 /**
388 * Interrupted timed poll throws InterruptedException instead of
389 * returning timeout status
390 */
391 public void testInterruptedTimedPoll() throws InterruptedException {
392 final BlockingQueue<Integer> q = populatedQueue(SIZE);
393 final CountDownLatch aboutToWait = new CountDownLatch(1);
394 Thread t = newStartedThread(new CheckedRunnable() {
395 public void realRun() throws InterruptedException {
396 long startTime = System.nanoTime();
397 for (int i = 0; i < SIZE; ++i) {
398 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
399 }
400 aboutToWait.countDown();
401 try {
402 q.poll(LONG_DELAY_MS, MILLISECONDS);
403 shouldThrow();
404 } catch (InterruptedException success) {
405 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
406 }
407 }});
408
409 aboutToWait.await();
410 waitForThreadToEnterWaitState(t, LONG_DELAY_MS);
411 t.interrupt();
412 awaitTermination(t);
413 }
414
415 /**
416 * peek returns next element, or null if empty
417 */
418 public void testPeek() {
419 PriorityBlockingQueue q = populatedQueue(SIZE);
420 for (int i = 0; i < SIZE; ++i) {
421 assertEquals(i, q.peek());
422 assertEquals(i, q.poll());
423 assertTrue(q.peek() == null ||
424 !q.peek().equals(i));
425 }
426 assertNull(q.peek());
427 }
428
429 /**
430 * element returns next element, or throws NSEE if empty
431 */
432 public void testElement() {
433 PriorityBlockingQueue q = populatedQueue(SIZE);
434 for (int i = 0; i < SIZE; ++i) {
435 assertEquals(i, q.element());
436 assertEquals(i, q.poll());
437 }
438 try {
439 q.element();
440 shouldThrow();
441 } catch (NoSuchElementException success) {}
442 }
443
444 /**
445 * remove removes next element, or throws NSEE if empty
446 */
447 public void testRemove() {
448 PriorityBlockingQueue q = populatedQueue(SIZE);
449 for (int i = 0; i < SIZE; ++i) {
450 assertEquals(i, q.remove());
451 }
452 try {
453 q.remove();
454 shouldThrow();
455 } catch (NoSuchElementException success) {}
456 }
457
458 /**
459 * contains(x) reports true when elements added but not yet removed
460 */
461 public void testContains() {
462 PriorityBlockingQueue q = populatedQueue(SIZE);
463 for (int i = 0; i < SIZE; ++i) {
464 assertTrue(q.contains(new Integer(i)));
465 q.poll();
466 assertFalse(q.contains(new Integer(i)));
467 }
468 }
469
470 /**
471 * clear removes all elements
472 */
473 public void testClear() {
474 PriorityBlockingQueue q = populatedQueue(SIZE);
475 q.clear();
476 assertTrue(q.isEmpty());
477 assertEquals(0, q.size());
478 q.add(one);
479 assertFalse(q.isEmpty());
480 assertTrue(q.contains(one));
481 q.clear();
482 assertTrue(q.isEmpty());
483 }
484
485 /**
486 * containsAll(c) is true when c contains a subset of elements
487 */
488 public void testContainsAll() {
489 PriorityBlockingQueue q = populatedQueue(SIZE);
490 PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
491 for (int i = 0; i < SIZE; ++i) {
492 assertTrue(q.containsAll(p));
493 assertFalse(p.containsAll(q));
494 p.add(new Integer(i));
495 }
496 assertTrue(p.containsAll(q));
497 }
498
499 /**
500 * retainAll(c) retains only those elements of c and reports true if changed
501 */
502 public void testRetainAll() {
503 PriorityBlockingQueue q = populatedQueue(SIZE);
504 PriorityBlockingQueue p = populatedQueue(SIZE);
505 for (int i = 0; i < SIZE; ++i) {
506 boolean changed = q.retainAll(p);
507 if (i == 0)
508 assertFalse(changed);
509 else
510 assertTrue(changed);
511
512 assertTrue(q.containsAll(p));
513 assertEquals(SIZE - i, q.size());
514 p.remove();
515 }
516 }
517
518 /**
519 * removeAll(c) removes only those elements of c and reports true if changed
520 */
521 public void testRemoveAll() {
522 for (int i = 1; i < SIZE; ++i) {
523 PriorityBlockingQueue q = populatedQueue(SIZE);
524 PriorityBlockingQueue p = populatedQueue(i);
525 assertTrue(q.removeAll(p));
526 assertEquals(SIZE - i, q.size());
527 for (int j = 0; j < i; ++j) {
528 Integer x = (Integer)(p.remove());
529 assertFalse(q.contains(x));
530 }
531 }
532 }
533
534 /**
535 * toArray contains all elements
536 */
537 public void testToArray() throws InterruptedException {
538 PriorityBlockingQueue q = populatedQueue(SIZE);
539 Object[] o = q.toArray();
540 Arrays.sort(o);
541 for (int i = 0; i < o.length; i++)
542 assertSame(o[i], q.take());
543 }
544
545 /**
546 * toArray(a) contains all elements
547 */
548 public void testToArray2() throws InterruptedException {
549 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
550 Integer[] ints = new Integer[SIZE];
551 Integer[] array = q.toArray(ints);
552 assertSame(ints, array);
553 Arrays.sort(ints);
554 for (int i = 0; i < ints.length; i++)
555 assertSame(ints[i], q.take());
556 }
557
558 /**
559 * toArray(incompatible array type) throws ArrayStoreException
560 */
561 public void testToArray1_BadArg() {
562 PriorityBlockingQueue q = populatedQueue(SIZE);
563 try {
564 q.toArray(new String[10]);
565 shouldThrow();
566 } catch (ArrayStoreException success) {}
567 }
568
569 /**
570 * iterator iterates through all elements
571 */
572 public void testIterator() {
573 PriorityBlockingQueue q = populatedQueue(SIZE);
574 Iterator it = q.iterator();
575 int i;
576 for (i = 0; it.hasNext(); i++)
577 assertTrue(q.contains(it.next()));
578 assertEquals(i, SIZE);
579 assertIteratorExhausted(it);
580 }
581
582 /**
583 * iterator of empty collection has no elements
584 */
585 public void testEmptyIterator() {
586 assertIteratorExhausted(new PriorityBlockingQueue().iterator());
587 }
588
589 /**
590 * iterator.remove removes current element
591 */
592 public void testIteratorRemove() {
593 final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
594 q.add(new Integer(2));
595 q.add(new Integer(1));
596 q.add(new Integer(3));
597
598 Iterator it = q.iterator();
599 it.next();
600 it.remove();
601
602 it = q.iterator();
603 assertEquals(it.next(), new Integer(2));
604 assertEquals(it.next(), new Integer(3));
605 assertFalse(it.hasNext());
606 }
607
608 /**
609 * toString contains toStrings of elements
610 */
611 public void testToString() {
612 PriorityBlockingQueue q = populatedQueue(SIZE);
613 String s = q.toString();
614 for (int i = 0; i < SIZE; ++i) {
615 assertTrue(s.contains(String.valueOf(i)));
616 }
617 }
618
619 /**
620 * timed poll transfers elements across Executor tasks
621 */
622 public void testPollInExecutor() {
623 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
624 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
625 final ExecutorService executor = Executors.newFixedThreadPool(2);
626 try (PoolCleaner cleaner = cleaner(executor)) {
627 executor.execute(new CheckedRunnable() {
628 public void realRun() throws InterruptedException {
629 assertNull(q.poll());
630 threadsStarted.await();
631 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
632 checkEmpty(q);
633 }});
634
635 executor.execute(new CheckedRunnable() {
636 public void realRun() throws InterruptedException {
637 threadsStarted.await();
638 q.put(one);
639 }});
640 }
641 }
642
643 /**
644 * A deserialized serialized queue has same elements
645 */
646 public void testSerialization() throws Exception {
647 Queue x = populatedQueue(SIZE);
648 Queue y = serialClone(x);
649
650 assertNotSame(x, y);
651 assertEquals(x.size(), y.size());
652 while (!x.isEmpty()) {
653 assertFalse(y.isEmpty());
654 assertEquals(x.remove(), y.remove());
655 }
656 assertTrue(y.isEmpty());
657 }
658
659 /**
660 * drainTo(c) empties queue into another collection c
661 */
662 public void testDrainTo() {
663 PriorityBlockingQueue q = populatedQueue(SIZE);
664 ArrayList l = new ArrayList();
665 q.drainTo(l);
666 assertEquals(0, q.size());
667 assertEquals(SIZE, l.size());
668 for (int i = 0; i < SIZE; ++i)
669 assertEquals(l.get(i), new Integer(i));
670 q.add(zero);
671 q.add(one);
672 assertFalse(q.isEmpty());
673 assertTrue(q.contains(zero));
674 assertTrue(q.contains(one));
675 l.clear();
676 q.drainTo(l);
677 assertEquals(0, q.size());
678 assertEquals(2, l.size());
679 for (int i = 0; i < 2; ++i)
680 assertEquals(l.get(i), new Integer(i));
681 }
682
683 /**
684 * drainTo empties queue
685 */
686 public void testDrainToWithActivePut() throws InterruptedException {
687 final PriorityBlockingQueue q = populatedQueue(SIZE);
688 Thread t = new Thread(new CheckedRunnable() {
689 public void realRun() {
690 q.put(new Integer(SIZE + 1));
691 }});
692
693 t.start();
694 ArrayList l = new ArrayList();
695 q.drainTo(l);
696 assertTrue(l.size() >= SIZE);
697 for (int i = 0; i < SIZE; ++i)
698 assertEquals(l.get(i), new Integer(i));
699 t.join();
700 assertTrue(q.size() + l.size() >= SIZE);
701 }
702
703 /**
704 * drainTo(c, n) empties first min(n, size) elements of queue into c
705 */
706 public void testDrainToN() {
707 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE * 2);
708 for (int i = 0; i < SIZE + 2; ++i) {
709 for (int j = 0; j < SIZE; j++)
710 assertTrue(q.offer(new Integer(j)));
711 ArrayList l = new ArrayList();
712 q.drainTo(l, i);
713 int k = (i < SIZE) ? i : SIZE;
714 assertEquals(k, l.size());
715 assertEquals(SIZE - k, q.size());
716 for (int j = 0; j < k; ++j)
717 assertEquals(l.get(j), new Integer(j));
718 do {} while (q.poll() != null);
719 }
720 }
721
722 /**
723 * remove(null), contains(null) always return false
724 */
725 public void testNeverContainsNull() {
726 Collection<?>[] qs = {
727 new PriorityBlockingQueue<Object>(),
728 populatedQueue(2),
729 };
730
731 for (Collection<?> q : qs) {
732 assertFalse(q.contains(null));
733 assertFalse(q.remove(null));
734 }
735 }
736
737 }