ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
(Generate patch)

Comparing jsr166/src/test/tck/PriorityBlockingQueueTest.java (file contents):
Revision 1.2 by dl, Sun Sep 7 20:39:11 2003 UTC vs.
Revision 1.50 by jsr166, Tue Feb 21 01:54:04 2012 UTC

# Line 1 | Line 1
1   /*
2 < * Written by members of JCP JSR-166 Expert Group and released to the
3 < * public domain. Use, modify, and redistribute this code in any way
4 < * without acknowledgement. Other contributors include Andrew Wright,
5 < * Jeffrey Hayes, Pat Fischer, Mike Judd.
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 junit.framework.*;
10 < import java.util.*;
11 < import java.util.concurrent.*;
12 < import java.io.*;
13 <
14 < public class PriorityBlockingQueueTest extends TestCase {
15 <
16 <    private static final int N = 10;
17 <    private static final long SHORT_DELAY_MS = 100;
18 <    private static final long MEDIUM_DELAY_MS = 1000;
19 <    private static final long LONG_DELAY_MS = 10000;
20 <    private static final int NOCAP = Integer.MAX_VALUE;
10 > 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.Queue;
17 > import java.util.concurrent.PriorityBlockingQueue;
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 static java.util.concurrent.TimeUnit.MILLISECONDS;
23 >
24 > public class PriorityBlockingQueueTest extends JSR166TestCase {
25 >
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(SIZE);
35 >        }
36 >    }
37  
38      public static void main(String[] args) {
39 <        junit.textui.TestRunner.run (suite());  
39 >        junit.textui.TestRunner.run(suite());
40      }
41  
42      public static Test suite() {
43 <        return new TestSuite(PriorityBlockingQueueTest.class);
43 >        return newTestSuite(PriorityBlockingQueueTest.class,
44 >                            new Generic().testSuite(),
45 >                            new InitialCapacity().testSuite());
46      }
47  
48 <    static class MyReverseComparator implements Comparator {
48 >    private static final int NOCAP = Integer.MAX_VALUE;
49 >
50 >    /** Sample Comparator */
51 >    static class MyReverseComparator implements Comparator {
52          public int compare(Object x, Object y) {
53 <            int i = ((Integer)x).intValue();
32 <            int j = ((Integer)y).intValue();
33 <            if (i < j) return 1;
34 <            if (i > j) return -1;
35 <            return 0;
53 >            return ((Comparable)y).compareTo(x);
54          }
55      }
56  
39
57      /**
58 <     * Create a queue of given size containing consecutive
58 >     * Creates a queue of given size containing consecutive
59       * Integers 0 ... n.
60       */
61 <    private PriorityBlockingQueue fullQueue(int n) {
62 <        PriorityBlockingQueue q = new PriorityBlockingQueue(n);
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)));
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(NOCAP, q.remainingCapacity());
71 <        assertEquals(n, q.size());
71 >        assertEquals(n, q.size());
72          return q;
73      }
74 <
75 <    public void testConstructor1(){
76 <        assertEquals(NOCAP, new PriorityBlockingQueue(N).remainingCapacity());
74 >
75 >    /**
76 >     * A new queue has unbounded capacity
77 >     */
78 >    public void testConstructor1() {
79 >        assertEquals(NOCAP, new PriorityBlockingQueue(SIZE).remainingCapacity());
80      }
81  
82 <    public void testConstructor2(){
82 >    /**
83 >     * Constructor throws IAE if capacity argument nonpositive
84 >     */
85 >    public void testConstructor2() {
86          try {
87 <            PriorityBlockingQueue q = new PriorityBlockingQueue(0);
88 <            fail("Cannot make zero-sized");
89 <        }
66 <        catch (IllegalArgumentException success) {}
87 >            new PriorityBlockingQueue(0);
88 >            shouldThrow();
89 >        } catch (IllegalArgumentException success) {}
90      }
91  
92 <    public void testConstructor3(){
93 <
92 >    /**
93 >     * Initializing from null Collection throws NPE
94 >     */
95 >    public void testConstructor3() {
96          try {
97 <            PriorityBlockingQueue q = new PriorityBlockingQueue(null);
98 <            fail("Cannot make from null collection");
99 <        }
75 <        catch (NullPointerException success) {}
97 >            new PriorityBlockingQueue(null);
98 >            shouldThrow();
99 >        } catch (NullPointerException success) {}
100      }
101  
102 <    public void testConstructor4(){
102 >    /**
103 >     * Initializing from Collection of null elements throws NPE
104 >     */
105 >    public void testConstructor4() {
106 >        Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
107          try {
108 <            Integer[] ints = new Integer[N];
109 <            PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
110 <            fail("Cannot make with null elements");
83 <        }
84 <        catch (NullPointerException success) {}
108 >            new PriorityBlockingQueue(elements);
109 >            shouldThrow();
110 >        } catch (NullPointerException success) {}
111      }
112  
113 <    public void testConstructor5(){
114 <        try {
115 <            Integer[] ints = new Integer[N];
116 <            for (int i = 0; i < N-1; ++i)
117 <                ints[i] = new Integer(i);
118 <            PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
119 <            fail("Cannot make with null elements");
120 <        }
121 <        catch (NullPointerException success) {}
113 >    /**
114 >     * Initializing from Collection with some null elements throws NPE
115 >     */
116 >    public void testConstructor5() {
117 >        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 >        try {
122 >            new PriorityBlockingQueue(elements);
123 >            shouldThrow();
124 >        } catch (NullPointerException success) {}
125      }
126  
127 <    public void testConstructor6(){
128 <        try {
129 <            Integer[] ints = new Integer[N];
130 <            for (int i = 0; i < N; ++i)
131 <                ints[i] = new Integer(i);
132 <            PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
133 <            for (int i = 0; i < N; ++i)
134 <                assertEquals(ints[i], q.poll());
135 <        }
136 <        finally {}
127 >    /**
128 >     * Queue contains all elements of collection used to initialize
129 >     */
130 >    public void testConstructor6() {
131 >        Integer[] ints = new Integer[SIZE];
132 >        for (int i = 0; i < SIZE; ++i)
133 >            ints[i] = i;
134 >        PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
135 >        for (int i = 0; i < SIZE; ++i)
136 >            assertEquals(ints[i], q.poll());
137      }
138  
139 <    public void testConstructor7(){
140 <        try {
141 <            PriorityBlockingQueue q = new PriorityBlockingQueue(N, new MyReverseComparator());
142 <            Integer[] ints = new Integer[N];
143 <            for (int i = 0; i < N; ++i)
144 <                ints[i] = new Integer(i);
145 <            q.addAll(Arrays.asList(ints));
146 <            for (int i = N-1; i >= 0; --i)
147 <                assertEquals(ints[i], q.poll());
148 <        }
149 <        finally {}
139 >    /**
140 >     * The comparator used in constructor is used
141 >     */
142 >    public void testConstructor7() {
143 >        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      }
153  
154 +    /**
155 +     * isEmpty is true before add, false after
156 +     */
157      public void testEmpty() {
158          PriorityBlockingQueue q = new PriorityBlockingQueue(2);
159          assertTrue(q.isEmpty());
160          assertEquals(NOCAP, q.remainingCapacity());
161 <        q.add(new Integer(1));
161 >        q.add(one);
162          assertFalse(q.isEmpty());
163 <        q.add(new Integer(2));
163 >        q.add(two);
164          q.remove();
165          q.remove();
166          assertTrue(q.isEmpty());
167      }
168  
169 <    public void testRemainingCapacity(){
170 <        PriorityBlockingQueue q = fullQueue(N);
171 <        for (int i = 0; i < N; ++i) {
169 >    /**
170 >     * remainingCapacity does not change when elements added or removed,
171 >     * but size does
172 >     */
173 >    public void testRemainingCapacity() {
174 >        PriorityBlockingQueue q = populatedQueue(SIZE);
175 >        for (int i = 0; i < SIZE; ++i) {
176              assertEquals(NOCAP, q.remainingCapacity());
177 <            assertEquals(N-i, q.size());
177 >            assertEquals(SIZE-i, q.size());
178              q.remove();
179          }
180 <        for (int i = 0; i < N; ++i) {
180 >        for (int i = 0; i < SIZE; ++i) {
181              assertEquals(NOCAP, q.remainingCapacity());
182              assertEquals(i, q.size());
183              q.add(new Integer(i));
184          }
185      }
186  
187 <    public void testOfferNull(){
188 <        try {
189 <            PriorityBlockingQueue q = new PriorityBlockingQueue(1);
152 <            q.offer(null);
153 <            fail("should throw NPE");
154 <        } catch (NullPointerException success) { }  
155 <    }
156 <
187 >    /**
188 >     * Offer of comparable element succeeds
189 >     */
190      public void testOffer() {
191          PriorityBlockingQueue q = new PriorityBlockingQueue(1);
192 <        assertTrue(q.offer(new Integer(0)));
193 <        assertTrue(q.offer(new Integer(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          try {
201              PriorityBlockingQueue q = new PriorityBlockingQueue(1);
202              q.offer(new Object());
203              q.offer(new Object());
204              q.offer(new Object());
205 <            fail("should throw CCE");
206 <        }
171 <        catch(ClassCastException success) {}
205 >            shouldThrow();
206 >        } catch (ClassCastException success) {}
207      }
208  
209 <    public void testAdd(){
210 <        PriorityBlockingQueue q = new PriorityBlockingQueue(N);
211 <        for (int i = 0; i < N; ++i) {
209 >    /**
210 >     * add of comparable succeeds
211 >     */
212 >    public void testAdd() {
213 >        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
214 >        for (int i = 0; i < SIZE; ++i) {
215              assertEquals(i, q.size());
216              assertTrue(q.add(new Integer(i)));
217          }
218      }
219  
220 <    public void testAddAll1(){
221 <        try {
222 <            PriorityBlockingQueue q = new PriorityBlockingQueue(1);
223 <            q.addAll(null);
186 <            fail("Cannot add null collection");
187 <        }
188 <        catch (NullPointerException success) {}
189 <    }
190 <    public void testAddAll2(){
220 >    /**
221 >     * addAll(this) throws IAE
222 >     */
223 >    public void testAddAllSelf() {
224          try {
225 <            PriorityBlockingQueue q = new PriorityBlockingQueue(N);
226 <            Integer[] ints = new Integer[N];
227 <            q.addAll(Arrays.asList(ints));
228 <            fail("Cannot add null elements");
196 <        }
197 <        catch (NullPointerException success) {}
225 >            PriorityBlockingQueue q = populatedQueue(SIZE);
226 >            q.addAll(q);
227 >            shouldThrow();
228 >        } catch (IllegalArgumentException success) {}
229      }
230 <    public void testAddAll3(){
230 >
231 >    /**
232 >     * addAll of a collection with any null elements throws NPE after
233 >     * possibly adding some elements
234 >     */
235 >    public void testAddAll3() {
236          try {
237 <            PriorityBlockingQueue q = new PriorityBlockingQueue(N);
238 <            Integer[] ints = new Integer[N];
239 <            for (int i = 0; i < N-1; ++i)
237 >            PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
238 >            Integer[] ints = new Integer[SIZE];
239 >            for (int i = 0; i < SIZE-1; ++i)
240                  ints[i] = new Integer(i);
241              q.addAll(Arrays.asList(ints));
242 <            fail("Cannot add null elements");
243 <        }
208 <        catch (NullPointerException success) {}
242 >            shouldThrow();
243 >        } catch (NullPointerException success) {}
244      }
245  
246 <    public void testAddAll5(){
247 <        try {
248 <            Integer[] empty = new Integer[0];
249 <            Integer[] ints = new Integer[N];
250 <            for (int i = N-1; i >= 0; --i)
251 <                ints[i] = new Integer(i);
252 <            PriorityBlockingQueue q = new PriorityBlockingQueue(N);
253 <            assertFalse(q.addAll(Arrays.asList(empty)));
254 <            assertTrue(q.addAll(Arrays.asList(ints)));
255 <            for (int i = 0; i < N; ++i)
256 <                assertEquals(ints[i], q.poll());
257 <        }
258 <        finally {}
224 <    }
225 <
226 <     public void testPutNull() {
227 <        try {
228 <            PriorityBlockingQueue q = new PriorityBlockingQueue(N);
229 <            q.put(null);
230 <            fail("put should throw NPE");
231 <        }
232 <        catch (NullPointerException success){
233 <        }  
234 <     }
235 <
236 <     public void testPut() {
237 <         try {
238 <             PriorityBlockingQueue q = new PriorityBlockingQueue(N);
239 <             for (int i = 0; i < N; ++i) {
240 <                 Integer I = new Integer(i);
241 <                 q.put(I);
242 <                 assertTrue(q.contains(I));
243 <             }
244 <             assertEquals(N, q.size());
245 <         }
246 <         finally {
247 <        }
246 >    /**
247 >     * Queue contains all elements of successful addAll
248 >     */
249 >    public void testAddAll5() {
250 >        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      }
260  
261 <    public void testPutWithTake() {
262 <        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
263 <        Thread t = new Thread(new Runnable() {
264 <                public void run(){
265 <                    int added = 0;
266 <                    try {
267 <                        q.put(new Integer(0));
268 <                        ++added;
269 <                        q.put(new Integer(0));
259 <                        ++added;
260 <                        q.put(new Integer(0));
261 <                        ++added;
262 <                        q.put(new Integer(0));
263 <                        ++added;
264 <                        assertTrue(added == 4);
265 <                    } finally {
266 <                    }
267 <                }
268 <            });
269 <        try {
270 <            t.start();
271 <            Thread.sleep(SHORT_DELAY_MS);
272 <            q.take();
273 <            t.interrupt();
274 <            t.join();
275 <        } catch (Exception e){
276 <            fail("Unexpected exception");
261 >    /**
262 >     * all elements successfully put are contained
263 >     */
264 >    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      }
273  
274 <    public void testTimedOffer() {
274 >    /**
275 >     * put doesn't block waiting for take
276 >     */
277 >    public void testPutWithTake() throws InterruptedException {
278          final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
279 <        Thread t = new Thread(new Runnable() {
280 <                public void run(){
281 <                    try {
282 <                        q.put(new Integer(0));
283 <                        q.put(new Integer(0));
284 <                        assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS/2, TimeUnit.MILLISECONDS));
285 <                        assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, TimeUnit.MILLISECONDS));
286 <                    } finally { }
287 <                }
288 <            });
292 <        
293 <        try {
294 <            t.start();
295 <            Thread.sleep(SHORT_DELAY_MS);
296 <            t.interrupt();
297 <            t.join();
298 <        } catch (Exception e){
299 <            fail("Unexpected exception");
300 <        }
279 >        final int size = 4;
280 >        Thread t = newStartedThread(new CheckedRunnable() {
281 >            public void realRun() {
282 >                for (int i = 0; i < size; i++)
283 >                    q.put(new Integer(0));
284 >            }});
285 >
286 >        awaitTermination(t);
287 >        assertEquals(size, q.size());
288 >        q.take();
289      }
290  
291 <    public void testTake(){
292 <        try {
293 <            PriorityBlockingQueue q = fullQueue(N);
294 <            for (int i = 0; i < N; ++i) {
307 <                assertEquals(i, ((Integer)q.take()).intValue());
308 <            }
309 <        } catch (InterruptedException e){
310 <            fail("Unexpected exception");
311 <        }  
312 <    }
313 <
314 <    public void testTakeFromEmpty() {
291 >    /**
292 >     * timed offer does not time out
293 >     */
294 >    public void testTimedOffer() throws InterruptedException {
295          final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
296 <        Thread t = new Thread(new Runnable() {
297 <                public void run(){
298 <                    try {
299 <                        q.take();
300 <                        fail("Should block");
301 <                    } catch (InterruptedException success){ }                
302 <                }
303 <            });
304 <        try {
325 <            t.start();
326 <            Thread.sleep(SHORT_DELAY_MS);
327 <            t.interrupt();
328 <            t.join();
329 <        } catch (Exception e){
330 <            fail("Unexpected exception");
331 <        }
296 >        Thread t = newStartedThread(new CheckedRunnable() {
297 >            public void realRun() {
298 >                q.put(new Integer(0));
299 >                q.put(new Integer(0));
300 >                assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, MILLISECONDS));
301 >                assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, MILLISECONDS));
302 >            }});
303 >
304 >        awaitTermination(t);
305      }
306  
307 <    public void testBlockingTake(){
308 <        Thread t = new Thread(new Runnable() {
309 <                public void run() {
310 <                    try {
311 <                        PriorityBlockingQueue q = fullQueue(N);
312 <                        for (int i = 0; i < N; ++i) {
313 <                            assertEquals(i, ((Integer)q.take()).intValue());
341 <                        }
342 <                        q.take();
343 <                        fail("take should block");
344 <                    } catch (InterruptedException success){
345 <                    }  
346 <                }});
347 <        t.start();
348 <        try {
349 <           Thread.sleep(SHORT_DELAY_MS);
350 <           t.interrupt();
351 <           t.join();
352 <        }
353 <        catch (InterruptedException ie) {
354 <            fail("Unexpected exception");
307 >    /**
308 >     * take retrieves elements in priority order
309 >     */
310 >    public void testTake() throws InterruptedException {
311 >        PriorityBlockingQueue q = populatedQueue(SIZE);
312 >        for (int i = 0; i < SIZE; ++i) {
313 >            assertEquals(i, q.take());
314          }
315      }
316  
317 +    /**
318 +     * Take removes existing elements until empty, then blocks interruptibly
319 +     */
320 +    public void testBlockingTake() throws InterruptedException {
321 +        final PriorityBlockingQueue q = populatedQueue(SIZE);
322 +        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
323 +        Thread t = newStartedThread(new CheckedRunnable() {
324 +            public void realRun() throws InterruptedException {
325 +                for (int i = 0; i < SIZE; ++i) {
326 +                    assertEquals(i, q.take());
327 +                }
328  
329 <    public void testPoll(){
330 <        PriorityBlockingQueue q = fullQueue(N);
331 <        for (int i = 0; i < N; ++i) {
332 <            assertEquals(i, ((Integer)q.poll()).intValue());
333 <        }
334 <        assertNull(q.poll());
365 <    }
329 >                Thread.currentThread().interrupt();
330 >                try {
331 >                    q.take();
332 >                    shouldThrow();
333 >                } catch (InterruptedException success) {}
334 >                assertFalse(Thread.interrupted());
335  
336 <    public void testTimedPoll0() {
337 <        try {
338 <            PriorityBlockingQueue q = fullQueue(N);
339 <            for (int i = 0; i < N; ++i) {
340 <                assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
341 <            }
342 <            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
343 <        } catch (InterruptedException e){
344 <            fail("Unexpected exception");
345 <        }  
336 >                pleaseInterrupt.countDown();
337 >                try {
338 >                    q.take();
339 >                    shouldThrow();
340 >                } catch (InterruptedException success) {}
341 >                assertFalse(Thread.interrupted());
342 >            }});
343 >
344 >        await(pleaseInterrupt);
345 >        assertThreadStaysAlive(t);
346 >        t.interrupt();
347 >        awaitTermination(t);
348      }
349  
350 <    public void testTimedPoll() {
351 <        try {
352 <            PriorityBlockingQueue q = fullQueue(N);
353 <            for (int i = 0; i < N; ++i) {
354 <                assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
355 <            }
356 <            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
386 <        } catch (InterruptedException e){
387 <            fail("Unexpected exception");
388 <        }  
389 <    }
390 <
391 <    public void testInterruptedTimedPoll(){
392 <        Thread t = new Thread(new Runnable() {
393 <                public void run() {
394 <                    try {
395 <                        PriorityBlockingQueue q = fullQueue(N);
396 <                        for (int i = 0; i < N; ++i) {
397 <                            assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
398 <                        }
399 <                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
400 <                    } catch (InterruptedException success){
401 <                    }  
402 <                }});
403 <        t.start();
404 <        try {
405 <           Thread.sleep(SHORT_DELAY_MS);
406 <           t.interrupt();
407 <           t.join();
350 >    /**
351 >     * poll succeeds unless empty
352 >     */
353 >    public void testPoll() {
354 >        PriorityBlockingQueue q = populatedQueue(SIZE);
355 >        for (int i = 0; i < SIZE; ++i) {
356 >            assertEquals(i, q.poll());
357          }
358 <        catch (InterruptedException ie) {
359 <            fail("Unexpected exception");
358 >        assertNull(q.poll());
359 >    }
360 >
361 >    /**
362 >     * timed poll with zero timeout succeeds when non-empty, else times out
363 >     */
364 >    public void testTimedPoll0() throws InterruptedException {
365 >        PriorityBlockingQueue q = populatedQueue(SIZE);
366 >        for (int i = 0; i < SIZE; ++i) {
367 >            assertEquals(i, q.poll(0, MILLISECONDS));
368          }
369 +        assertNull(q.poll(0, MILLISECONDS));
370      }
371  
372 <    public void testTimedPollWithOffer(){
373 <        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
374 <        Thread t = new Thread(new Runnable() {
375 <                public void run(){
376 <                    try {
377 <                        assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
378 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
379 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
380 <                        fail("Should block");
381 <                    } catch (InterruptedException success) { }                
372 >    /**
373 >     * timed poll with nonzero timeout succeeds when non-empty, else times out
374 >     */
375 >    public void testTimedPoll() throws InterruptedException {
376 >        PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
377 >        for (int i = 0; i < SIZE; ++i) {
378 >            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 >    }
387 >
388 >    /**
389 >     * Interrupted timed poll throws InterruptedException instead of
390 >     * returning timeout status
391 >     */
392 >    public void testInterruptedTimedPoll() throws InterruptedException {
393 >        final BlockingQueue<Integer> q = populatedQueue(SIZE);
394 >        final CountDownLatch aboutToWait = new CountDownLatch(1);
395 >        Thread t = newStartedThread(new CheckedRunnable() {
396 >            public void realRun() throws InterruptedException {
397 >                for (int i = 0; i < SIZE; ++i) {
398 >                    long t0 = System.nanoTime();
399 >                    assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
400 >                    assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
401                  }
402 <            });
403 <        try {
404 <            t.start();
405 <            Thread.sleep(SHORT_DELAY_MS * 2);
406 <            assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
407 <            t.interrupt();
408 <            t.join();
409 <        } catch (Exception e){
410 <            fail("Unexpected exception");
434 <        }
435 <    }  
402 >                long t0 = System.nanoTime();
403 >                aboutToWait.countDown();
404 >                try {
405 >                    q.poll(LONG_DELAY_MS, MILLISECONDS);
406 >                    shouldThrow();
407 >                } catch (InterruptedException success) {
408 >                    assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
409 >                }
410 >            }});
411  
412 +        aboutToWait.await();
413 +        waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
414 +        t.interrupt();
415 +        awaitTermination(t, MEDIUM_DELAY_MS);
416 +    }
417  
418 <    public void testPeek(){
419 <        PriorityBlockingQueue q = fullQueue(N);
420 <        for (int i = 0; i < N; ++i) {
421 <            assertEquals(i, ((Integer)q.peek()).intValue());
422 <            q.poll();
418 >    /**
419 >     * peek returns next element, or null if empty
420 >     */
421 >    public void testPeek() {
422 >        PriorityBlockingQueue q = populatedQueue(SIZE);
423 >        for (int i = 0; i < SIZE; ++i) {
424 >            assertEquals(i, q.peek());
425 >            assertEquals(i, q.poll());
426              assertTrue(q.peek() == null ||
427 <                       i != ((Integer)q.peek()).intValue());
427 >                       !q.peek().equals(i));
428          }
429 <        assertNull(q.peek());
429 >        assertNull(q.peek());
430      }
431  
432 <    public void testElement(){
433 <        PriorityBlockingQueue q = fullQueue(N);
434 <        for (int i = 0; i < N; ++i) {
435 <            assertEquals(i, ((Integer)q.element()).intValue());
436 <            q.poll();
432 >    /**
433 >     * element returns next element, or throws NSEE if empty
434 >     */
435 >    public void testElement() {
436 >        PriorityBlockingQueue q = populatedQueue(SIZE);
437 >        for (int i = 0; i < SIZE; ++i) {
438 >            assertEquals(i, q.element());
439 >            assertEquals(i, q.poll());
440          }
441          try {
442              q.element();
443 <            fail("no such element");
444 <        }
459 <        catch (NoSuchElementException success) {}
443 >            shouldThrow();
444 >        } catch (NoSuchElementException success) {}
445      }
446  
447 <    public void testRemove(){
448 <        PriorityBlockingQueue q = fullQueue(N);
449 <        for (int i = 0; i < N; ++i) {
450 <            assertEquals(i, ((Integer)q.remove()).intValue());
447 >    /**
448 >     * remove removes next element, or throws NSEE if empty
449 >     */
450 >    public void testRemove() {
451 >        PriorityBlockingQueue q = populatedQueue(SIZE);
452 >        for (int i = 0; i < SIZE; ++i) {
453 >            assertEquals(i, q.remove());
454          }
455          try {
456              q.remove();
457 <            fail("remove should throw");
458 <        } catch (NoSuchElementException success){
471 <        }  
457 >            shouldThrow();
458 >        } catch (NoSuchElementException success) {}
459      }
460  
461 <    public void testRemoveElement(){
462 <        PriorityBlockingQueue q = fullQueue(N);
463 <        for (int i = 1; i < N; i+=2) {
464 <            assertTrue(q.remove(new Integer(i)));
465 <        }
466 <        for (int i = 0; i < N; i+=2) {
480 <            assertTrue(q.remove(new Integer(i)));
481 <            assertFalse(q.remove(new Integer(i+1)));
482 <        }
483 <        assertTrue(q.isEmpty());
484 <    }
485 <        
486 <    public void testContains(){
487 <        PriorityBlockingQueue q = fullQueue(N);
488 <        for (int i = 0; i < N; ++i) {
461 >    /**
462 >     * contains(x) reports true when elements added but not yet removed
463 >     */
464 >    public void testContains() {
465 >        PriorityBlockingQueue q = populatedQueue(SIZE);
466 >        for (int i = 0; i < SIZE; ++i) {
467              assertTrue(q.contains(new Integer(i)));
468              q.poll();
469              assertFalse(q.contains(new Integer(i)));
470          }
471      }
472  
473 <    public void testClear(){
474 <        PriorityBlockingQueue q = fullQueue(N);
473 >    /**
474 >     * clear removes all elements
475 >     */
476 >    public void testClear() {
477 >        PriorityBlockingQueue q = populatedQueue(SIZE);
478          q.clear();
479          assertTrue(q.isEmpty());
480          assertEquals(0, q.size());
481 <        assertEquals(NOCAP, q.remainingCapacity());
501 <        q.add(new Integer(1));
481 >        q.add(one);
482          assertFalse(q.isEmpty());
483 +        assertTrue(q.contains(one));
484          q.clear();
485          assertTrue(q.isEmpty());
486      }
487  
488 <    public void testContainsAll(){
489 <        PriorityBlockingQueue q = fullQueue(N);
490 <        PriorityBlockingQueue p = new PriorityBlockingQueue(N);
491 <        for (int i = 0; i < N; ++i) {
488 >    /**
489 >     * containsAll(c) is true when c contains a subset of elements
490 >     */
491 >    public void testContainsAll() {
492 >        PriorityBlockingQueue q = populatedQueue(SIZE);
493 >        PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
494 >        for (int i = 0; i < SIZE; ++i) {
495              assertTrue(q.containsAll(p));
496              assertFalse(p.containsAll(q));
497              p.add(new Integer(i));
# Line 515 | Line 499 | public class PriorityBlockingQueueTest e
499          assertTrue(p.containsAll(q));
500      }
501  
502 <    public void testRetainAll(){
503 <        PriorityBlockingQueue q = fullQueue(N);
504 <        PriorityBlockingQueue p = fullQueue(N);
505 <        for (int i = 0; i < N; ++i) {
502 >    /**
503 >     * retainAll(c) retains only those elements of c and reports true if changed
504 >     */
505 >    public void testRetainAll() {
506 >        PriorityBlockingQueue q = populatedQueue(SIZE);
507 >        PriorityBlockingQueue p = populatedQueue(SIZE);
508 >        for (int i = 0; i < SIZE; ++i) {
509              boolean changed = q.retainAll(p);
510              if (i == 0)
511                  assertFalse(changed);
# Line 526 | Line 513 | public class PriorityBlockingQueueTest e
513                  assertTrue(changed);
514  
515              assertTrue(q.containsAll(p));
516 <            assertEquals(N-i, q.size());
516 >            assertEquals(SIZE-i, q.size());
517              p.remove();
518          }
519      }
520  
521 <    public void testRemoveAll(){
522 <        for (int i = 1; i < N; ++i) {
523 <            PriorityBlockingQueue q = fullQueue(N);
524 <            PriorityBlockingQueue p = fullQueue(i);
521 >    /**
522 >     * removeAll(c) removes only those elements of c and reports true if changed
523 >     */
524 >    public void testRemoveAll() {
525 >        for (int i = 1; i < SIZE; ++i) {
526 >            PriorityBlockingQueue q = populatedQueue(SIZE);
527 >            PriorityBlockingQueue p = populatedQueue(i);
528              assertTrue(q.removeAll(p));
529 <            assertEquals(N-i, q.size());
529 >            assertEquals(SIZE-i, q.size());
530              for (int j = 0; j < i; ++j) {
531                  Integer I = (Integer)(p.remove());
532                  assertFalse(q.contains(I));
# Line 544 | Line 534 | public class PriorityBlockingQueueTest e
534          }
535      }
536  
537 <    public void testToArray(){
538 <        PriorityBlockingQueue q = fullQueue(N);
539 <        Object[] o = q.toArray();
537 >    /**
538 >     * toArray contains all elements
539 >     */
540 >    public void testToArray() throws InterruptedException {
541 >        PriorityBlockingQueue q = populatedQueue(SIZE);
542 >        Object[] o = q.toArray();
543          Arrays.sort(o);
544 <        try {
545 <        for(int i = 0; i < o.length; i++)
553 <            assertEquals(o[i], q.take());
554 <        } catch (InterruptedException e){
555 <            fail("Unexpected exception");
556 <        }    
544 >        for (int i = 0; i < o.length; i++)
545 >            assertSame(o[i], q.take());
546      }
547  
548 <    public void testToArray2(){
549 <        PriorityBlockingQueue q = fullQueue(N);
550 <        Integer[] ints = new Integer[N];
551 <        ints = (Integer[])q.toArray(ints);
548 >    /**
549 >     * toArray(a) contains all elements
550 >     */
551 >    public void testToArray2() throws InterruptedException {
552 >        PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
553 >        Integer[] ints = new Integer[SIZE];
554 >        Integer[] array = q.toArray(ints);
555 >        assertSame(ints, array);
556          Arrays.sort(ints);
557 <        try {
558 <            for(int i = 0; i < ints.length; i++)
559 <                assertEquals(ints[i], q.take());
560 <        } catch (InterruptedException e){
561 <            fail("Unexpected exception");
562 <        }    
563 <    }
564 <    
565 <    public void testIterator(){
566 <        PriorityBlockingQueue q = fullQueue(N);
557 >        for (int i = 0; i < ints.length; i++)
558 >            assertSame(ints[i], q.take());
559 >    }
560 >
561 >    /**
562 >     * toArray(incompatible array type) throws ArrayStoreException
563 >     */
564 >    public void testToArray1_BadArg() {
565 >        PriorityBlockingQueue q = populatedQueue(SIZE);
566 >        try {
567 >            q.toArray(new String[10]);
568 >            shouldThrow();
569 >        } catch (ArrayStoreException success) {}
570 >    }
571 >
572 >    /**
573 >     * iterator iterates through all elements
574 >     */
575 >    public void testIterator() {
576 >        PriorityBlockingQueue q = populatedQueue(SIZE);
577          int i = 0;
578 <        Iterator it = q.iterator();
579 <        while(it.hasNext()) {
578 >        Iterator it = q.iterator();
579 >        while (it.hasNext()) {
580              assertTrue(q.contains(it.next()));
581              ++i;
582          }
583 <        assertEquals(i, N);
583 >        assertEquals(i, SIZE);
584      }
585  
586 <    public void testIteratorRemove () {
587 <
586 >    /**
587 >     * iterator.remove removes current element
588 >     */
589 >    public void testIteratorRemove() {
590          final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
586
591          q.add(new Integer(2));
592          q.add(new Integer(1));
593          q.add(new Integer(3));
# Line 598 | Line 602 | public class PriorityBlockingQueueTest e
602          assertFalse(it.hasNext());
603      }
604  
605 <
606 <    public void testToString(){
607 <        PriorityBlockingQueue q = fullQueue(N);
605 >    /**
606 >     * toString contains toStrings of elements
607 >     */
608 >    public void testToString() {
609 >        PriorityBlockingQueue q = populatedQueue(SIZE);
610          String s = q.toString();
611 <        for (int i = 0; i < N; ++i) {
612 <            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
611 >        for (int i = 0; i < SIZE; ++i) {
612 >            assertTrue(s.contains(String.valueOf(i)));
613          }
614 <    }        
614 >    }
615  
616 +    /**
617 +     * timed poll transfers elements across Executor tasks
618 +     */
619      public void testPollInExecutor() {
611
620          final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
621 <
621 >        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
622          ExecutorService executor = Executors.newFixedThreadPool(2);
623 +        executor.execute(new CheckedRunnable() {
624 +            public void realRun() throws InterruptedException {
625 +                assertNull(q.poll());
626 +                threadsStarted.await();
627 +                assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
628 +                checkEmpty(q);
629 +            }});
630 +
631 +        executor.execute(new CheckedRunnable() {
632 +            public void realRun() throws InterruptedException {
633 +                threadsStarted.await();
634 +                q.put(one);
635 +            }});
636  
637 <        executor.execute(new Runnable() {
638 <            public void run() {
618 <                assertNull("poll should fail", q.poll());
619 <                try {
620 <                    assertTrue(null != q.poll(MEDIUM_DELAY_MS * 2, TimeUnit.MILLISECONDS));
621 <                    assertTrue(q.isEmpty());
622 <                }
623 <                catch (InterruptedException e) {
624 <                    fail("should not be interrupted");
625 <                }
626 <            }
627 <        });
637 >        joinPool(executor);
638 >    }
639  
640 <        executor.execute(new Runnable() {
641 <            public void run() {
642 <                try {
643 <                    Thread.sleep(MEDIUM_DELAY_MS);
644 <                    q.put(new Integer(1));
645 <                }
646 <                catch (InterruptedException e) {
647 <                    fail("should not be interrupted");
648 <                }
649 <            }
650 <        });
651 <        
652 <        executor.shutdown();
640 >    /**
641 >     * A deserialized serialized queue has same elements
642 >     */
643 >    public void testSerialization() throws Exception {
644 >        Queue x = populatedQueue(SIZE);
645 >        Queue y = serialClone(x);
646 >
647 >        assertTrue(x != y);
648 >        assertEquals(x.size(), y.size());
649 >        while (!x.isEmpty()) {
650 >            assertFalse(y.isEmpty());
651 >            assertEquals(x.remove(), y.remove());
652 >        }
653 >        assertTrue(y.isEmpty());
654 >    }
655  
656 +    /**
657 +     * drainTo(c) empties queue into another collection c
658 +     */
659 +    public void testDrainTo() {
660 +        PriorityBlockingQueue q = populatedQueue(SIZE);
661 +        ArrayList l = new ArrayList();
662 +        q.drainTo(l);
663 +        assertEquals(0, q.size());
664 +        assertEquals(SIZE, l.size());
665 +        for (int i = 0; i < SIZE; ++i)
666 +            assertEquals(l.get(i), new Integer(i));
667 +        q.add(zero);
668 +        q.add(one);
669 +        assertFalse(q.isEmpty());
670 +        assertTrue(q.contains(zero));
671 +        assertTrue(q.contains(one));
672 +        l.clear();
673 +        q.drainTo(l);
674 +        assertEquals(0, q.size());
675 +        assertEquals(2, l.size());
676 +        for (int i = 0; i < 2; ++i)
677 +            assertEquals(l.get(i), new Integer(i));
678      }
679  
680 <    public void testSerialization() {
681 <        PriorityBlockingQueue q = fullQueue(N);
682 <        try {
683 <            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
684 <            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
685 <            out.writeObject(q);
686 <            out.close();
687 <
688 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
689 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
690 <            PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
691 <            assertEquals(q.size(), r.size());
692 <            while (!q.isEmpty())
693 <                assertEquals(q.remove(), r.remove());
694 <        } catch(Exception e){
695 <            fail("unexpected exception");
680 >    /**
681 >     * drainTo empties queue
682 >     */
683 >    public void testDrainToWithActivePut() throws InterruptedException {
684 >        final PriorityBlockingQueue q = populatedQueue(SIZE);
685 >        Thread t = new Thread(new CheckedRunnable() {
686 >            public void realRun() {
687 >                q.put(new Integer(SIZE+1));
688 >            }});
689 >
690 >        t.start();
691 >        ArrayList l = new ArrayList();
692 >        q.drainTo(l);
693 >        assertTrue(l.size() >= SIZE);
694 >        for (int i = 0; i < SIZE; ++i)
695 >            assertEquals(l.get(i), new Integer(i));
696 >        t.join();
697 >        assertTrue(q.size() + l.size() >= SIZE);
698 >    }
699 >
700 >    /**
701 >     * drainTo(c, n) empties first min(n, size) elements of queue into c
702 >     */
703 >    public void testDrainToN() {
704 >        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
705 >        for (int i = 0; i < SIZE + 2; ++i) {
706 >            for (int j = 0; j < SIZE; j++)
707 >                assertTrue(q.offer(new Integer(j)));
708 >            ArrayList l = new ArrayList();
709 >            q.drainTo(l, i);
710 >            int k = (i < SIZE) ? i : SIZE;
711 >            assertEquals(k, l.size());
712 >            assertEquals(SIZE-k, q.size());
713 >            for (int j = 0; j < k; ++j)
714 >                assertEquals(l.get(j), new Integer(j));
715 >            while (q.poll() != null) ;
716          }
717      }
718  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines