ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.61
Committed: Sat Apr 25 04:55:31 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.60: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

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 try {
224 PriorityBlockingQueue q = populatedQueue(SIZE);
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 try {
236 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
237 Integer[] ints = new Integer[SIZE];
238 for (int i = 0; i < SIZE-1; ++i)
239 ints[i] = new Integer(i);
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 for (int i = 0; i < SIZE; ++i) {
397 long t0 = System.nanoTime();
398 assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
399 assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
400 }
401 long t0 = System.nanoTime();
402 aboutToWait.countDown();
403 try {
404 q.poll(LONG_DELAY_MS, MILLISECONDS);
405 shouldThrow();
406 } catch (InterruptedException success) {
407 assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
408 }
409 }});
410
411 aboutToWait.await();
412 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
413 t.interrupt();
414 awaitTermination(t, MEDIUM_DELAY_MS);
415 }
416
417 /**
418 * peek returns next element, or null if empty
419 */
420 public void testPeek() {
421 PriorityBlockingQueue q = populatedQueue(SIZE);
422 for (int i = 0; i < SIZE; ++i) {
423 assertEquals(i, q.peek());
424 assertEquals(i, q.poll());
425 assertTrue(q.peek() == null ||
426 !q.peek().equals(i));
427 }
428 assertNull(q.peek());
429 }
430
431 /**
432 * element returns next element, or throws NSEE if empty
433 */
434 public void testElement() {
435 PriorityBlockingQueue q = populatedQueue(SIZE);
436 for (int i = 0; i < SIZE; ++i) {
437 assertEquals(i, q.element());
438 assertEquals(i, q.poll());
439 }
440 try {
441 q.element();
442 shouldThrow();
443 } catch (NoSuchElementException success) {}
444 }
445
446 /**
447 * remove removes next element, or throws NSEE if empty
448 */
449 public void testRemove() {
450 PriorityBlockingQueue q = populatedQueue(SIZE);
451 for (int i = 0; i < SIZE; ++i) {
452 assertEquals(i, q.remove());
453 }
454 try {
455 q.remove();
456 shouldThrow();
457 } catch (NoSuchElementException success) {}
458 }
459
460 /**
461 * contains(x) reports true when elements added but not yet removed
462 */
463 public void testContains() {
464 PriorityBlockingQueue q = populatedQueue(SIZE);
465 for (int i = 0; i < SIZE; ++i) {
466 assertTrue(q.contains(new Integer(i)));
467 q.poll();
468 assertFalse(q.contains(new Integer(i)));
469 }
470 }
471
472 /**
473 * clear removes all elements
474 */
475 public void testClear() {
476 PriorityBlockingQueue q = populatedQueue(SIZE);
477 q.clear();
478 assertTrue(q.isEmpty());
479 assertEquals(0, q.size());
480 q.add(one);
481 assertFalse(q.isEmpty());
482 assertTrue(q.contains(one));
483 q.clear();
484 assertTrue(q.isEmpty());
485 }
486
487 /**
488 * containsAll(c) is true when c contains a subset of elements
489 */
490 public void testContainsAll() {
491 PriorityBlockingQueue q = populatedQueue(SIZE);
492 PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
493 for (int i = 0; i < SIZE; ++i) {
494 assertTrue(q.containsAll(p));
495 assertFalse(p.containsAll(q));
496 p.add(new Integer(i));
497 }
498 assertTrue(p.containsAll(q));
499 }
500
501 /**
502 * retainAll(c) retains only those elements of c and reports true if changed
503 */
504 public void testRetainAll() {
505 PriorityBlockingQueue q = populatedQueue(SIZE);
506 PriorityBlockingQueue p = populatedQueue(SIZE);
507 for (int i = 0; i < SIZE; ++i) {
508 boolean changed = q.retainAll(p);
509 if (i == 0)
510 assertFalse(changed);
511 else
512 assertTrue(changed);
513
514 assertTrue(q.containsAll(p));
515 assertEquals(SIZE-i, q.size());
516 p.remove();
517 }
518 }
519
520 /**
521 * removeAll(c) removes only those elements of c and reports true if changed
522 */
523 public void testRemoveAll() {
524 for (int i = 1; i < SIZE; ++i) {
525 PriorityBlockingQueue q = populatedQueue(SIZE);
526 PriorityBlockingQueue p = populatedQueue(i);
527 assertTrue(q.removeAll(p));
528 assertEquals(SIZE-i, q.size());
529 for (int j = 0; j < i; ++j) {
530 Integer x = (Integer)(p.remove());
531 assertFalse(q.contains(x));
532 }
533 }
534 }
535
536 /**
537 * toArray contains all elements
538 */
539 public void testToArray() throws InterruptedException {
540 PriorityBlockingQueue q = populatedQueue(SIZE);
541 Object[] o = q.toArray();
542 Arrays.sort(o);
543 for (int i = 0; i < o.length; i++)
544 assertSame(o[i], q.take());
545 }
546
547 /**
548 * toArray(a) contains all elements
549 */
550 public void testToArray2() throws InterruptedException {
551 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
552 Integer[] ints = new Integer[SIZE];
553 Integer[] array = q.toArray(ints);
554 assertSame(ints, array);
555 Arrays.sort(ints);
556 for (int i = 0; i < ints.length; i++)
557 assertSame(ints[i], q.take());
558 }
559
560 /**
561 * toArray(incompatible array type) throws ArrayStoreException
562 */
563 public void testToArray1_BadArg() {
564 PriorityBlockingQueue q = populatedQueue(SIZE);
565 try {
566 q.toArray(new String[10]);
567 shouldThrow();
568 } catch (ArrayStoreException success) {}
569 }
570
571 /**
572 * iterator iterates through all elements
573 */
574 public void testIterator() {
575 PriorityBlockingQueue q = populatedQueue(SIZE);
576 Iterator it = q.iterator();
577 int i;
578 for (i = 0; it.hasNext(); i++)
579 assertTrue(q.contains(it.next()));
580 assertEquals(i, SIZE);
581 assertIteratorExhausted(it);
582 }
583
584 /**
585 * iterator of empty collection has no elements
586 */
587 public void testEmptyIterator() {
588 assertIteratorExhausted(new PriorityBlockingQueue().iterator());
589 }
590
591 /**
592 * iterator.remove removes current element
593 */
594 public void testIteratorRemove() {
595 final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
596 q.add(new Integer(2));
597 q.add(new Integer(1));
598 q.add(new Integer(3));
599
600 Iterator it = q.iterator();
601 it.next();
602 it.remove();
603
604 it = q.iterator();
605 assertEquals(it.next(), new Integer(2));
606 assertEquals(it.next(), new Integer(3));
607 assertFalse(it.hasNext());
608 }
609
610 /**
611 * toString contains toStrings of elements
612 */
613 public void testToString() {
614 PriorityBlockingQueue q = populatedQueue(SIZE);
615 String s = q.toString();
616 for (int i = 0; i < SIZE; ++i) {
617 assertTrue(s.contains(String.valueOf(i)));
618 }
619 }
620
621 /**
622 * timed poll transfers elements across Executor tasks
623 */
624 public void testPollInExecutor() {
625 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
626 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
627 ExecutorService executor = Executors.newFixedThreadPool(2);
628 executor.execute(new CheckedRunnable() {
629 public void realRun() throws InterruptedException {
630 assertNull(q.poll());
631 threadsStarted.await();
632 assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
633 checkEmpty(q);
634 }});
635
636 executor.execute(new CheckedRunnable() {
637 public void realRun() throws InterruptedException {
638 threadsStarted.await();
639 q.put(one);
640 }});
641
642 joinPool(executor);
643 }
644
645 /**
646 * A deserialized serialized queue has same elements
647 */
648 public void testSerialization() throws Exception {
649 Queue x = populatedQueue(SIZE);
650 Queue y = serialClone(x);
651
652 assertNotSame(x, y);
653 assertEquals(x.size(), y.size());
654 while (!x.isEmpty()) {
655 assertFalse(y.isEmpty());
656 assertEquals(x.remove(), y.remove());
657 }
658 assertTrue(y.isEmpty());
659 }
660
661 /**
662 * drainTo(c) empties queue into another collection c
663 */
664 public void testDrainTo() {
665 PriorityBlockingQueue q = populatedQueue(SIZE);
666 ArrayList l = new ArrayList();
667 q.drainTo(l);
668 assertEquals(0, q.size());
669 assertEquals(SIZE, l.size());
670 for (int i = 0; i < SIZE; ++i)
671 assertEquals(l.get(i), new Integer(i));
672 q.add(zero);
673 q.add(one);
674 assertFalse(q.isEmpty());
675 assertTrue(q.contains(zero));
676 assertTrue(q.contains(one));
677 l.clear();
678 q.drainTo(l);
679 assertEquals(0, q.size());
680 assertEquals(2, l.size());
681 for (int i = 0; i < 2; ++i)
682 assertEquals(l.get(i), new Integer(i));
683 }
684
685 /**
686 * drainTo empties queue
687 */
688 public void testDrainToWithActivePut() throws InterruptedException {
689 final PriorityBlockingQueue q = populatedQueue(SIZE);
690 Thread t = new Thread(new CheckedRunnable() {
691 public void realRun() {
692 q.put(new Integer(SIZE+1));
693 }});
694
695 t.start();
696 ArrayList l = new ArrayList();
697 q.drainTo(l);
698 assertTrue(l.size() >= SIZE);
699 for (int i = 0; i < SIZE; ++i)
700 assertEquals(l.get(i), new Integer(i));
701 t.join();
702 assertTrue(q.size() + l.size() >= SIZE);
703 }
704
705 /**
706 * drainTo(c, n) empties first min(n, size) elements of queue into c
707 */
708 public void testDrainToN() {
709 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
710 for (int i = 0; i < SIZE + 2; ++i) {
711 for (int j = 0; j < SIZE; j++)
712 assertTrue(q.offer(new Integer(j)));
713 ArrayList l = new ArrayList();
714 q.drainTo(l, i);
715 int k = (i < SIZE) ? i : SIZE;
716 assertEquals(k, l.size());
717 assertEquals(SIZE-k, q.size());
718 for (int j = 0; j < k; ++j)
719 assertEquals(l.get(j), new Integer(j));
720 do {} while (q.poll() != null);
721 }
722 }
723
724 /**
725 * remove(null), contains(null) always return false
726 */
727 public void testNeverContainsNull() {
728 Collection<?>[] qs = {
729 new PriorityBlockingQueue<Object>(),
730 populatedQueue(2),
731 };
732
733 for (Collection<?> q : qs) {
734 assertFalse(q.contains(null));
735 assertFalse(q.remove(null));
736 }
737 }
738
739 }