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

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