ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.45
Committed: Mon May 30 22:43:20 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.44: +21 -122 lines
Log Message:
refactor more generic BlockingQueue tests into BlockingQueueTest.java

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     import junit.framework.*;
10 jsr166 1.45 import java.util.Arrays;
11     import java.util.ArrayList;
12     import java.util.Collection;
13     import java.util.Comparator;
14     import java.util.Iterator;
15     import java.util.NoSuchElementException;
16     import java.util.concurrent.PriorityBlockingQueue;
17     import java.util.concurrent.BlockingQueue;
18     import java.util.concurrent.CountDownLatch;
19     import java.util.concurrent.Executors;
20     import java.util.concurrent.ExecutorService;
21 jsr166 1.17 import static java.util.concurrent.TimeUnit.MILLISECONDS;
22 dl 1.2 import java.io.*;
23 dl 1.1
24 dl 1.3 public class PriorityBlockingQueueTest extends JSR166TestCase {
25 jsr166 1.29
26     public static class Generic extends BlockingQueueTest {
27     protected BlockingQueue emptyCollection() {
28     return new PriorityBlockingQueue();
29     }
30     }
31    
32     public static class InitialCapacity extends BlockingQueueTest {
33     protected BlockingQueue emptyCollection() {
34     return new PriorityBlockingQueue(20);
35     }
36     }
37    
38 dl 1.1 public static void main(String[] args) {
39 jsr166 1.26 junit.textui.TestRunner.run(suite());
40 dl 1.1 }
41 jsr166 1.29
42 dl 1.1 public static Test suite() {
43 jsr166 1.29 return newTestSuite(PriorityBlockingQueueTest.class,
44     new Generic().testSuite(),
45     new InitialCapacity().testSuite());
46 dl 1.1 }
47    
48 dl 1.3 private static final int NOCAP = Integer.MAX_VALUE;
49    
50     /** 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     * Create a queue of given size containing consecutive
59     * 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.16 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 dl 1.1 assertFalse(q.isEmpty());
70     assertEquals(NOCAP, 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 dl 1.3 assertEquals(NOCAP, new PriorityBlockingQueue(SIZE).remainingCapacity());
80 dl 1.1 }
81    
82 dl 1.5 /**
83 jsr166 1.19 * Constructor throws IAE if capacity argument nonpositive
84 dl 1.5 */
85     public void testConstructor2() {
86 dl 1.1 try {
87 jsr166 1.45 new PriorityBlockingQueue(0);
88 dl 1.5 shouldThrow();
89 jsr166 1.15 } catch (IllegalArgumentException success) {}
90 dl 1.1 }
91    
92 dl 1.5 /**
93 dl 1.6 * Initializing from null Collection throws NPE
94 dl 1.5 */
95     public void testConstructor3() {
96 dl 1.1 try {
97 jsr166 1.45 new PriorityBlockingQueue(null);
98 dl 1.5 shouldThrow();
99 jsr166 1.15 } catch (NullPointerException success) {}
100 dl 1.1 }
101    
102 dl 1.5 /**
103 dl 1.6 * Initializing from Collection of null elements throws NPE
104 dl 1.5 */
105     public void testConstructor4() {
106 jsr166 1.45 Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
107 dl 1.1 try {
108 jsr166 1.45 new PriorityBlockingQueue(elements);
109 dl 1.5 shouldThrow();
110 jsr166 1.15 } catch (NullPointerException success) {}
111 dl 1.1 }
112    
113 dl 1.5 /**
114 dl 1.6 * Initializing from Collection with some null elements throws NPE
115 dl 1.5 */
116     public void testConstructor5() {
117 jsr166 1.45 Integer[] ints = new Integer[SIZE];
118     for (int i = 0; i < SIZE-1; ++i)
119     ints[i] = i;
120     Collection<Integer> elements = Arrays.asList(ints);
121 dl 1.1 try {
122 jsr166 1.45 new PriorityBlockingQueue(elements);
123 dl 1.5 shouldThrow();
124 jsr166 1.15 } catch (NullPointerException success) {}
125 dl 1.1 }
126    
127 dl 1.5 /**
128 dl 1.6 * Queue contains all elements of collection used to initialize
129 dl 1.5 */
130     public void testConstructor6() {
131 jsr166 1.15 Integer[] ints = new Integer[SIZE];
132     for (int i = 0; i < SIZE; ++i)
133 jsr166 1.45 ints[i] = i;
134 jsr166 1.15 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
135     for (int i = 0; i < SIZE; ++i)
136     assertEquals(ints[i], q.poll());
137 dl 1.1 }
138    
139 dl 1.5 /**
140 dl 1.6 * The comparator used in constructor is used
141 dl 1.5 */
142     public void testConstructor7() {
143 jsr166 1.15 MyReverseComparator cmp = new MyReverseComparator();
144     PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
145     assertEquals(cmp, q.comparator());
146     Integer[] ints = new Integer[SIZE];
147     for (int i = 0; i < SIZE; ++i)
148     ints[i] = new Integer(i);
149     q.addAll(Arrays.asList(ints));
150     for (int i = SIZE-1; i >= 0; --i)
151     assertEquals(ints[i], q.poll());
152 dl 1.1 }
153    
154 dl 1.5 /**
155 dl 1.6 * isEmpty is true before add, false after
156 dl 1.5 */
157 dl 1.1 public void testEmpty() {
158     PriorityBlockingQueue q = new PriorityBlockingQueue(2);
159     assertTrue(q.isEmpty());
160     assertEquals(NOCAP, q.remainingCapacity());
161 dl 1.6 q.add(one);
162 dl 1.1 assertFalse(q.isEmpty());
163 dl 1.6 q.add(two);
164 dl 1.1 q.remove();
165     q.remove();
166     assertTrue(q.isEmpty());
167     }
168    
169 dl 1.5 /**
170 dl 1.9 * remainingCapacity does not change when elements added or removed,
171 dl 1.6 * but size does
172 dl 1.5 */
173     public void testRemainingCapacity() {
174 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
175     for (int i = 0; i < SIZE; ++i) {
176 dl 1.1 assertEquals(NOCAP, q.remainingCapacity());
177 dl 1.3 assertEquals(SIZE-i, q.size());
178 dl 1.1 q.remove();
179     }
180 dl 1.3 for (int i = 0; i < SIZE; ++i) {
181 dl 1.1 assertEquals(NOCAP, q.remainingCapacity());
182     assertEquals(i, q.size());
183     q.add(new Integer(i));
184     }
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     try {
201     PriorityBlockingQueue q = new PriorityBlockingQueue(1);
202     q.offer(new Object());
203     q.offer(new Object());
204     q.offer(new Object());
205 dl 1.5 shouldThrow();
206 jsr166 1.15 } catch (ClassCastException success) {}
207 dl 1.1 }
208    
209 dl 1.5 /**
210 dl 1.6 * add of comparable succeeds
211 dl 1.5 */
212     public void testAdd() {
213 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
214     for (int i = 0; i < SIZE; ++i) {
215 dl 1.1 assertEquals(i, q.size());
216     assertTrue(q.add(new Integer(i)));
217     }
218     }
219    
220 dl 1.5 /**
221 dl 1.7 * addAll(this) throws IAE
222     */
223     public void testAddAllSelf() {
224     try {
225     PriorityBlockingQueue q = populatedQueue(SIZE);
226     q.addAll(q);
227     shouldThrow();
228 jsr166 1.15 } catch (IllegalArgumentException success) {}
229 dl 1.7 }
230    
231 dl 1.5 /**
232 dl 1.6 * addAll of a collection with any null elements throws NPE after
233     * possibly adding some elements
234 dl 1.5 */
235     public void testAddAll3() {
236 dl 1.1 try {
237 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
238     Integer[] ints = new Integer[SIZE];
239     for (int i = 0; i < SIZE-1; ++i)
240 dl 1.1 ints[i] = new Integer(i);
241     q.addAll(Arrays.asList(ints));
242 dl 1.5 shouldThrow();
243 jsr166 1.15 } catch (NullPointerException success) {}
244 dl 1.1 }
245    
246 dl 1.5 /**
247 dl 1.6 * Queue contains all elements of successful addAll
248 dl 1.5 */
249     public void testAddAll5() {
250 jsr166 1.15 Integer[] empty = new Integer[0];
251     Integer[] ints = new Integer[SIZE];
252     for (int i = SIZE-1; i >= 0; --i)
253     ints[i] = new Integer(i);
254     PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
255     assertFalse(q.addAll(Arrays.asList(empty)));
256     assertTrue(q.addAll(Arrays.asList(ints)));
257     for (int i = 0; i < SIZE; ++i)
258     assertEquals(ints[i], q.poll());
259 dl 1.1 }
260    
261 dl 1.5 /**
262 dl 1.6 * all elements successfully put are contained
263 dl 1.5 */
264 jsr166 1.42 public void testPut() {
265     PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
266     for (int i = 0; i < SIZE; ++i) {
267     Integer I = new Integer(i);
268     q.put(I);
269     assertTrue(q.contains(I));
270     }
271     assertEquals(SIZE, q.size());
272 dl 1.1 }
273    
274 dl 1.5 /**
275 dl 1.6 * put doesn't block waiting for take
276 dl 1.5 */
277 jsr166 1.15 public void testPutWithTake() throws InterruptedException {
278 dl 1.1 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
279 jsr166 1.15 final int size = 4;
280 jsr166 1.44 Thread t = newStartedThread(new CheckedRunnable() {
281 jsr166 1.15 public void realRun() {
282     for (int i = 0; i < size; i++)
283     q.put(new Integer(0));
284     }});
285    
286 jsr166 1.44 awaitTermination(t);
287     assertEquals(size, q.size());
288 jsr166 1.15 q.take();
289 dl 1.1 }
290    
291 dl 1.5 /**
292 dl 1.6 * timed offer does not time out
293 dl 1.5 */
294 jsr166 1.15 public void testTimedOffer() throws InterruptedException {
295 dl 1.1 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
296 jsr166 1.44 Thread t = newStartedThread(new CheckedRunnable() {
297 jsr166 1.18 public void realRun() {
298     q.put(new Integer(0));
299     q.put(new Integer(0));
300 jsr166 1.22 assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, MILLISECONDS));
301     assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, MILLISECONDS));
302 jsr166 1.18 }});
303 jsr166 1.12
304 jsr166 1.44 awaitTermination(t);
305 dl 1.1 }
306    
307 dl 1.5 /**
308 dl 1.6 * take retrieves elements in priority order
309 dl 1.5 */
310 jsr166 1.15 public void testTake() throws InterruptedException {
311     PriorityBlockingQueue q = populatedQueue(SIZE);
312     for (int i = 0; i < SIZE; ++i) {
313 jsr166 1.24 assertEquals(i, q.take());
314 jsr166 1.15 }
315 dl 1.1 }
316    
317 dl 1.5 /**
318 dl 1.6 * Take removes existing elements until empty, then blocks interruptibly
319 dl 1.5 */
320 jsr166 1.15 public void testBlockingTake() throws InterruptedException {
321 jsr166 1.23 final PriorityBlockingQueue q = populatedQueue(SIZE);
322 jsr166 1.44 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
323     Thread t = newStartedThread(new CheckedRunnable() {
324 jsr166 1.15 public void realRun() throws InterruptedException {
325     for (int i = 0; i < SIZE; ++i) {
326 jsr166 1.23 assertEquals(i, q.take());
327 jsr166 1.15 }
328 jsr166 1.44
329     Thread.currentThread().interrupt();
330 jsr166 1.23 try {
331     q.take();
332     shouldThrow();
333     } catch (InterruptedException success) {}
334 jsr166 1.44 assertFalse(Thread.interrupted());
335    
336     pleaseInterrupt.countDown();
337     try {
338     q.take();
339     shouldThrow();
340     } catch (InterruptedException success) {}
341     assertFalse(Thread.interrupted());
342 jsr166 1.15 }});
343    
344 jsr166 1.44 await(pleaseInterrupt);
345     assertThreadStaysAlive(t);
346 jsr166 1.15 t.interrupt();
347 jsr166 1.44 awaitTermination(t);
348 dl 1.1 }
349    
350 dl 1.5 /**
351 dl 1.6 * poll succeeds unless empty
352 dl 1.5 */
353     public void testPoll() {
354 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
355     for (int i = 0; i < SIZE; ++i) {
356 jsr166 1.24 assertEquals(i, q.poll());
357 dl 1.1 }
358 jsr166 1.16 assertNull(q.poll());
359 dl 1.1 }
360    
361 dl 1.5 /**
362 jsr166 1.34 * timed poll with zero timeout succeeds when non-empty, else times out
363 dl 1.5 */
364 jsr166 1.15 public void testTimedPoll0() throws InterruptedException {
365     PriorityBlockingQueue q = populatedQueue(SIZE);
366     for (int i = 0; i < SIZE; ++i) {
367 jsr166 1.24 assertEquals(i, q.poll(0, MILLISECONDS));
368 jsr166 1.15 }
369 jsr166 1.17 assertNull(q.poll(0, MILLISECONDS));
370 dl 1.1 }
371    
372 dl 1.5 /**
373 jsr166 1.34 * timed poll with nonzero timeout succeeds when non-empty, else times out
374 dl 1.5 */
375 jsr166 1.15 public void testTimedPoll() throws InterruptedException {
376 jsr166 1.44 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
377 jsr166 1.15 for (int i = 0; i < SIZE; ++i) {
378 jsr166 1.44 long startTime = System.nanoTime();
379     assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
380     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
381     }
382     long startTime = System.nanoTime();
383     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
384     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
385     checkEmpty(q);
386 dl 1.1 }
387    
388 dl 1.5 /**
389 dl 1.6 * Interrupted timed poll throws InterruptedException instead of
390     * returning timeout status
391 dl 1.5 */
392 jsr166 1.15 public void testInterruptedTimedPoll() throws InterruptedException {
393 jsr166 1.40 final BlockingQueue<Integer> q = populatedQueue(SIZE);
394     final CountDownLatch aboutToWait = new CountDownLatch(1);
395     Thread t = newStartedThread(new CheckedRunnable() {
396 jsr166 1.15 public void realRun() throws InterruptedException {
397     for (int i = 0; i < SIZE; ++i) {
398 jsr166 1.40 long t0 = System.nanoTime();
399     assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
400     assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
401 jsr166 1.15 }
402 jsr166 1.40 long t0 = System.nanoTime();
403     aboutToWait.countDown();
404 jsr166 1.15 try {
405 jsr166 1.44 q.poll(LONG_DELAY_MS, MILLISECONDS);
406 jsr166 1.18 shouldThrow();
407 jsr166 1.40 } catch (InterruptedException success) {
408     assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
409     }
410 jsr166 1.15 }});
411    
412 jsr166 1.40 aboutToWait.await();
413     waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
414 jsr166 1.15 t.interrupt();
415 jsr166 1.40 awaitTermination(t, MEDIUM_DELAY_MS);
416 dl 1.1 }
417    
418 dl 1.5 /**
419 dl 1.6 * peek returns next element, or null if empty
420 dl 1.5 */
421     public void testPeek() {
422 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
423     for (int i = 0; i < SIZE; ++i) {
424 jsr166 1.24 assertEquals(i, q.peek());
425     assertEquals(i, q.poll());
426 dl 1.1 assertTrue(q.peek() == null ||
427 jsr166 1.24 !q.peek().equals(i));
428 dl 1.1 }
429 jsr166 1.16 assertNull(q.peek());
430 dl 1.1 }
431    
432 dl 1.5 /**
433 dl 1.6 * element returns next element, or throws NSEE if empty
434 dl 1.5 */
435     public void testElement() {
436 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
437     for (int i = 0; i < SIZE; ++i) {
438 jsr166 1.24 assertEquals(i, q.element());
439     assertEquals(i, q.poll());
440 dl 1.1 }
441     try {
442     q.element();
443 dl 1.5 shouldThrow();
444 jsr166 1.15 } catch (NoSuchElementException success) {}
445 dl 1.1 }
446    
447 dl 1.5 /**
448 dl 1.6 * remove removes next element, or throws NSEE if empty
449 dl 1.5 */
450     public void testRemove() {
451 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
452     for (int i = 0; i < SIZE; ++i) {
453 jsr166 1.24 assertEquals(i, q.remove());
454 dl 1.1 }
455     try {
456     q.remove();
457 dl 1.5 shouldThrow();
458 jsr166 1.15 } catch (NoSuchElementException success) {}
459 dl 1.1 }
460    
461 dl 1.5 /**
462 dl 1.6 * remove(x) removes x and returns true if present
463 dl 1.5 */
464     public void testRemoveElement() {
465 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
466     for (int i = 1; i < SIZE; i+=2) {
467 jsr166 1.39 assertTrue(q.contains(i));
468     assertTrue(q.remove(i));
469     assertFalse(q.contains(i));
470     assertTrue(q.contains(i-1));
471 dl 1.1 }
472 dl 1.3 for (int i = 0; i < SIZE; i+=2) {
473 jsr166 1.39 assertTrue(q.contains(i));
474     assertTrue(q.remove(i));
475     assertFalse(q.contains(i));
476     assertFalse(q.remove(i+1));
477     assertFalse(q.contains(i+1));
478 dl 1.1 }
479 dl 1.2 assertTrue(q.isEmpty());
480 dl 1.1 }
481 jsr166 1.12
482 dl 1.5 /**
483 dl 1.6 * contains(x) reports true when elements added but not yet removed
484 dl 1.5 */
485     public void testContains() {
486 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
487     for (int i = 0; i < SIZE; ++i) {
488 dl 1.1 assertTrue(q.contains(new Integer(i)));
489     q.poll();
490     assertFalse(q.contains(new Integer(i)));
491     }
492     }
493    
494 dl 1.5 /**
495 dl 1.6 * clear removes all elements
496 dl 1.5 */
497     public void testClear() {
498 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
499 dl 1.1 q.clear();
500     assertTrue(q.isEmpty());
501     assertEquals(0, q.size());
502 dl 1.11 q.add(one);
503 dl 1.1 assertFalse(q.isEmpty());
504 dl 1.11 assertTrue(q.contains(one));
505 dl 1.1 q.clear();
506     assertTrue(q.isEmpty());
507     }
508    
509 dl 1.5 /**
510 dl 1.6 * containsAll(c) is true when c contains a subset of elements
511 dl 1.5 */
512     public void testContainsAll() {
513 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
514     PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
515     for (int i = 0; i < SIZE; ++i) {
516 dl 1.1 assertTrue(q.containsAll(p));
517     assertFalse(p.containsAll(q));
518     p.add(new Integer(i));
519     }
520     assertTrue(p.containsAll(q));
521     }
522    
523 dl 1.5 /**
524 dl 1.6 * retainAll(c) retains only those elements of c and reports true if changed
525 dl 1.5 */
526     public void testRetainAll() {
527 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
528     PriorityBlockingQueue p = populatedQueue(SIZE);
529     for (int i = 0; i < SIZE; ++i) {
530 dl 1.1 boolean changed = q.retainAll(p);
531     if (i == 0)
532     assertFalse(changed);
533     else
534     assertTrue(changed);
535    
536     assertTrue(q.containsAll(p));
537 dl 1.3 assertEquals(SIZE-i, q.size());
538 dl 1.1 p.remove();
539     }
540     }
541    
542 dl 1.5 /**
543 dl 1.6 * removeAll(c) removes only those elements of c and reports true if changed
544 dl 1.5 */
545     public void testRemoveAll() {
546 dl 1.3 for (int i = 1; i < SIZE; ++i) {
547     PriorityBlockingQueue q = populatedQueue(SIZE);
548     PriorityBlockingQueue p = populatedQueue(i);
549 dl 1.1 assertTrue(q.removeAll(p));
550 dl 1.3 assertEquals(SIZE-i, q.size());
551 dl 1.1 for (int j = 0; j < i; ++j) {
552     Integer I = (Integer)(p.remove());
553     assertFalse(q.contains(I));
554     }
555     }
556     }
557    
558 dl 1.5 /**
559 jsr166 1.30 * toArray contains all elements
560 dl 1.5 */
561 jsr166 1.15 public void testToArray() throws InterruptedException {
562 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
563 jsr166 1.16 Object[] o = q.toArray();
564 dl 1.1 Arrays.sort(o);
565 jsr166 1.16 for (int i = 0; i < o.length; i++)
566 jsr166 1.37 assertSame(o[i], q.take());
567 dl 1.1 }
568    
569 dl 1.5 /**
570 dl 1.6 * toArray(a) contains all elements
571 dl 1.5 */
572 jsr166 1.15 public void testToArray2() throws InterruptedException {
573 jsr166 1.38 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
574 jsr166 1.16 Integer[] ints = new Integer[SIZE];
575 jsr166 1.38 Integer[] array = q.toArray(ints);
576     assertSame(ints, array);
577 dl 1.1 Arrays.sort(ints);
578 jsr166 1.15 for (int i = 0; i < ints.length; i++)
579 jsr166 1.37 assertSame(ints[i], q.take());
580 dl 1.1 }
581 dl 1.7
582     /**
583 jsr166 1.35 * toArray(incompatible array type) throws ArrayStoreException
584 dl 1.7 */
585     public void testToArray1_BadArg() {
586 jsr166 1.24 PriorityBlockingQueue q = populatedQueue(SIZE);
587 jsr166 1.16 try {
588 jsr166 1.35 q.toArray(new String[10]);
589 jsr166 1.16 shouldThrow();
590 jsr166 1.19 } catch (ArrayStoreException success) {}
591 dl 1.7 }
592 jsr166 1.12
593 dl 1.5 /**
594 dl 1.6 * iterator iterates through all elements
595 dl 1.5 */
596     public void testIterator() {
597 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
598 dl 1.1 int i = 0;
599 jsr166 1.16 Iterator it = q.iterator();
600 jsr166 1.13 while (it.hasNext()) {
601 dl 1.1 assertTrue(q.contains(it.next()));
602     ++i;
603     }
604 dl 1.3 assertEquals(i, SIZE);
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 dl 1.1 ExecutorService executor = Executors.newFixedThreadPool(2);
644 jsr166 1.15 executor.execute(new CheckedRunnable() {
645     public void realRun() throws InterruptedException {
646 jsr166 1.25 assertNull(q.poll());
647 jsr166 1.44 threadsStarted.await();
648     assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
649     checkEmpty(q);
650 jsr166 1.15 }});
651    
652     executor.execute(new CheckedRunnable() {
653     public void realRun() throws InterruptedException {
654 jsr166 1.44 threadsStarted.await();
655 jsr166 1.25 q.put(one);
656 jsr166 1.15 }});
657 jsr166 1.12
658 dl 1.3 joinPool(executor);
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 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
666 jsr166 1.15 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
667     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
668     out.writeObject(q);
669     out.close();
670    
671     ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
672     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
673     PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
674     assertEquals(q.size(), r.size());
675     while (!q.isEmpty())
676     assertEquals(q.remove(), r.remove());
677 dl 1.1 }
678 dl 1.7
679     /**
680     * drainTo(c) empties queue into another collection c
681 jsr166 1.12 */
682 dl 1.7 public void testDrainTo() {
683     PriorityBlockingQueue q = populatedQueue(SIZE);
684     ArrayList l = new ArrayList();
685     q.drainTo(l);
686     assertEquals(q.size(), 0);
687     assertEquals(l.size(), SIZE);
688 jsr166 1.12 for (int i = 0; i < SIZE; ++i)
689 dl 1.7 assertEquals(l.get(i), new Integer(i));
690 dl 1.11 q.add(zero);
691     q.add(one);
692     assertFalse(q.isEmpty());
693     assertTrue(q.contains(zero));
694     assertTrue(q.contains(one));
695     l.clear();
696     q.drainTo(l);
697     assertEquals(q.size(), 0);
698     assertEquals(l.size(), 2);
699 jsr166 1.12 for (int i = 0; i < 2; ++i)
700 dl 1.11 assertEquals(l.get(i), new Integer(i));
701 dl 1.7 }
702    
703     /**
704     * drainTo empties queue
705 jsr166 1.12 */
706 jsr166 1.15 public void testDrainToWithActivePut() throws InterruptedException {
707 dl 1.7 final PriorityBlockingQueue q = populatedQueue(SIZE);
708 jsr166 1.15 Thread t = new Thread(new CheckedRunnable() {
709     public void realRun() {
710     q.put(new Integer(SIZE+1));
711     }});
712    
713     t.start();
714     ArrayList l = new ArrayList();
715     q.drainTo(l);
716     assertTrue(l.size() >= SIZE);
717     for (int i = 0; i < SIZE; ++i)
718     assertEquals(l.get(i), new Integer(i));
719     t.join();
720     assertTrue(q.size() + l.size() >= SIZE);
721 dl 1.7 }
722    
723     /**
724 jsr166 1.31 * drainTo(c, n) empties first min(n, size) elements of queue into c
725 jsr166 1.12 */
726 dl 1.7 public void testDrainToN() {
727 dl 1.11 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
728 dl 1.7 for (int i = 0; i < SIZE + 2; ++i) {
729 jsr166 1.13 for (int j = 0; j < SIZE; j++)
730 dl 1.11 assertTrue(q.offer(new Integer(j)));
731 dl 1.7 ArrayList l = new ArrayList();
732     q.drainTo(l, i);
733 jsr166 1.32 int k = (i < SIZE) ? i : SIZE;
734 dl 1.11 assertEquals(l.size(), k);
735 dl 1.7 assertEquals(q.size(), SIZE-k);
736 jsr166 1.12 for (int j = 0; j < k; ++j)
737 dl 1.11 assertEquals(l.get(j), new Integer(j));
738     while (q.poll() != null) ;
739 dl 1.7 }
740     }
741    
742 dl 1.1 }