ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.69
Committed: Sun Oct 16 20:44:18 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.68: +2 -1 lines
Log Message:
improve populatedFoo methods

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