ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.78
Committed: Mon May 29 22:44:27 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.77: +2 -2 lines
Log Message:
more timeout handling rework; remove most uses of MEDIUM_DELAY_MS; randomize timeouts and TimeUnits; write out IAE and ISE

File Contents

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