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

Comparing jsr166/src/test/tck/DelayQueueTest.java (file contents):
Revision 1.4 by dl, Sat Sep 20 18:20:07 2003 UTC vs.
Revision 1.23 by jsr166, Sat Nov 21 21:00:34 2009 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/licenses/publicdomain
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 static java.util.concurrent.TimeUnit.MILLISECONDS;
12   import java.util.concurrent.*;
13  
14   public class DelayQueueTest extends JSR166TestCase {
15      public static void main(String[] args) {
16 <        junit.textui.TestRunner.run (suite());  
16 >        junit.textui.TestRunner.run (suite());
17      }
18  
19      public static Test suite() {
20 <        return new TestSuite(DelayQueueTest.class);
20 >        return new TestSuite(DelayQueueTest.class);
21      }
22  
23      private static final int NOCAP = Integer.MAX_VALUE;
24  
25      /**
26 <     * A delayed implmentation for testing.
27 <     * Most Q/BQ tests use Pseudodelays, where delays are all elapsed
26 >     * A delayed implementation for testing.
27 >     * Most  tests use Pseudodelays, where delays are all elapsed
28       * (so, no blocking solely for delays) but are still ordered
29 <     */
30 <    static class PDelay implements Delayed {
29 >     */
30 >    static class PDelay implements Delayed {
31          int pseudodelay;
32          PDelay(int i) { pseudodelay = Integer.MIN_VALUE + i; }
33 <        public int compareTo(Object y) {
33 >        public int compareTo(PDelay y) {
34              int i = pseudodelay;
35              int j = ((PDelay)y).pseudodelay;
36              if (i < j) return -1;
# Line 36 | Line 38 | public class DelayQueueTest extends JSR1
38              return 0;
39          }
40  
41 <        public int compareTo(PDelay y) {
41 >        public int compareTo(Delayed y) {
42              int i = pseudodelay;
43              int j = ((PDelay)y).pseudodelay;
44              if (i < j) return -1;
# Line 68 | Line 70 | public class DelayQueueTest extends JSR1
70      /**
71       * Delayed implementation that actually delays
72       */
73 <    static class NanoDelay implements Delayed {
73 >    static class NanoDelay implements Delayed {
74          long trigger;
75 <        NanoDelay(long i) {
75 >        NanoDelay(long i) {
76              trigger = System.nanoTime() + i;
77          }
78 <        public int compareTo(Object y) {
78 >        public int compareTo(NanoDelay y) {
79              long i = trigger;
80              long j = ((NanoDelay)y).trigger;
81              if (i < j) return -1;
# Line 81 | Line 83 | public class DelayQueueTest extends JSR1
83              return 0;
84          }
85  
86 <        public int compareTo(NanoDelay y) {
86 >        public int compareTo(Delayed y) {
87              long i = trigger;
88              long j = ((NanoDelay)y).trigger;
89              if (i < j) return -1;
# Line 118 | Line 120 | public class DelayQueueTest extends JSR1
120      private DelayQueue populatedQueue(int n) {
121          DelayQueue q = new DelayQueue();
122          assertTrue(q.isEmpty());
123 <        for(int i = n-1; i >= 0; i-=2)
124 <            assertTrue(q.offer(new PDelay(i)));
125 <        for(int i = (n & 1); i < n; i+=2)
126 <            assertTrue(q.offer(new PDelay(i)));
123 >        for (int i = n-1; i >= 0; i-=2)
124 >            assertTrue(q.offer(new PDelay(i)));
125 >        for (int i = (n & 1); i < n; i+=2)
126 >            assertTrue(q.offer(new PDelay(i)));
127          assertFalse(q.isEmpty());
128          assertEquals(NOCAP, q.remainingCapacity());
129 <        assertEquals(n, q.size());
129 >        assertEquals(n, q.size());
130          return q;
131      }
132 <
132 >
133      /**
134 <     *
134 >     * A new queue has unbounded capacity
135       */
136      public void testConstructor1() {
137          assertEquals(NOCAP, new DelayQueue().remainingCapacity());
138      }
139  
140      /**
141 <     *
141 >     * Initializing from null Collection throws NPE
142       */
143      public void testConstructor3() {
144          try {
145              DelayQueue q = new DelayQueue(null);
146              shouldThrow();
147 <        }
146 <        catch (NullPointerException success) {}
147 >        } catch (NullPointerException success) {}
148      }
149  
150      /**
151 <     *
151 >     * Initializing from Collection of null elements throws NPE
152       */
153      public void testConstructor4() {
154          try {
155              PDelay[] ints = new PDelay[SIZE];
156              DelayQueue q = new DelayQueue(Arrays.asList(ints));
157              shouldThrow();
158 <        }
158 <        catch (NullPointerException success) {}
158 >        } catch (NullPointerException success) {}
159      }
160  
161      /**
162 <     *
162 >     * Initializing from Collection with some null elements throws NPE
163       */
164      public void testConstructor5() {
165          try {
# Line 168 | Line 168 | public class DelayQueueTest extends JSR1
168                  ints[i] = new PDelay(i);
169              DelayQueue q = new DelayQueue(Arrays.asList(ints));
170              shouldThrow();
171 <        }
172 <        catch (NullPointerException success) {}
171 >        } catch (NullPointerException success) {}
172      }
173  
174      /**
175 <     *
175 >     * Queue contains all elements of collection used to initialize
176       */
177      public void testConstructor6() {
178 <        try {
179 <            PDelay[] ints = new PDelay[SIZE];
180 <            for (int i = 0; i < SIZE; ++i)
181 <                ints[i] = new PDelay(i);
182 <            DelayQueue q = new DelayQueue(Arrays.asList(ints));
183 <            for (int i = 0; i < SIZE; ++i)
185 <                assertEquals(ints[i], q.poll());
186 <        }
187 <        finally {}
178 >        PDelay[] ints = new PDelay[SIZE];
179 >        for (int i = 0; i < SIZE; ++i)
180 >            ints[i] = new PDelay(i);
181 >        DelayQueue q = new DelayQueue(Arrays.asList(ints));
182 >        for (int i = 0; i < SIZE; ++i)
183 >            assertEquals(ints[i], q.poll());
184      }
185  
186      /**
187 <     *
187 >     * isEmpty is true before add, false after
188       */
189      public void testEmpty() {
190          DelayQueue q = new DelayQueue();
# Line 203 | Line 199 | public class DelayQueueTest extends JSR1
199      }
200  
201      /**
202 <     *
202 >     * remainingCapacity does not change when elementa added or removed,
203 >     * but size does
204       */
205      public void testRemainingCapacity() {
206          DelayQueue q = populatedQueue(SIZE);
# Line 220 | Line 217 | public class DelayQueueTest extends JSR1
217      }
218  
219      /**
220 <     *
220 >     * offer(null) throws NPE
221       */
222      public void testOfferNull() {
223 <        try {
223 >        try {
224              DelayQueue q = new DelayQueue();
225              q.offer(null);
226              shouldThrow();
227 <        } catch (NullPointerException success) { }  
227 >        } catch (NullPointerException success) {}
228 >    }
229 >
230 >    /**
231 >     * add(null) throws NPE
232 >     */
233 >    public void testAddNull() {
234 >        try {
235 >            DelayQueue q = new DelayQueue();
236 >            q.add(null);
237 >            shouldThrow();
238 >        } catch (NullPointerException success) {}
239      }
240  
241      /**
242 <     *
242 >     * offer non-null succeeds
243       */
244      public void testOffer() {
245          DelayQueue q = new DelayQueue();
# Line 240 | Line 248 | public class DelayQueueTest extends JSR1
248      }
249  
250      /**
251 <     *
251 >     * add succeeds
252       */
253      public void testAdd() {
254          DelayQueue q = new DelayQueue();
# Line 251 | Line 259 | public class DelayQueueTest extends JSR1
259      }
260  
261      /**
262 <     *
262 >     * addAll(null) throws NPE
263       */
264      public void testAddAll1() {
265          try {
266              DelayQueue q = new DelayQueue();
267              q.addAll(null);
268              shouldThrow();
269 <        }
262 <        catch (NullPointerException success) {}
269 >        } catch (NullPointerException success) {}
270      }
271 +
272 +
273      /**
274 <     *
274 >     * addAll(this) throws IAE
275 >     */
276 >    public void testAddAllSelf() {
277 >        try {
278 >            DelayQueue q = populatedQueue(SIZE);
279 >            q.addAll(q);
280 >            shouldThrow();
281 >        } catch (IllegalArgumentException success) {}
282 >    }
283 >
284 >    /**
285 >     * addAll of a collection with null elements throws NPE
286       */
287      public void testAddAll2() {
288          try {
# Line 270 | Line 290 | public class DelayQueueTest extends JSR1
290              PDelay[] ints = new PDelay[SIZE];
291              q.addAll(Arrays.asList(ints));
292              shouldThrow();
293 <        }
274 <        catch (NullPointerException success) {}
293 >        } catch (NullPointerException success) {}
294      }
295      /**
296 <     *
296 >     * addAll of a collection with any null elements throws NPE after
297 >     * possibly adding some elements
298       */
299      public void testAddAll3() {
300          try {
# Line 284 | Line 304 | public class DelayQueueTest extends JSR1
304                  ints[i] = new PDelay(i);
305              q.addAll(Arrays.asList(ints));
306              shouldThrow();
307 <        }
288 <        catch (NullPointerException success) {}
307 >        } catch (NullPointerException success) {}
308      }
309  
310      /**
311 <     *
311 >     * Queue contains all elements of successful addAll
312       */
313      public void testAddAll5() {
314 <        try {
315 <            PDelay[] empty = new PDelay[0];
316 <            PDelay[] ints = new PDelay[SIZE];
317 <            for (int i = SIZE-1; i >= 0; --i)
318 <                ints[i] = new PDelay(i);
319 <            DelayQueue q = new DelayQueue();
320 <            assertFalse(q.addAll(Arrays.asList(empty)));
321 <            assertTrue(q.addAll(Arrays.asList(ints)));
322 <            for (int i = 0; i < SIZE; ++i)
304 <                assertEquals(ints[i], q.poll());
305 <        }
306 <        finally {}
314 >        PDelay[] empty = new PDelay[0];
315 >        PDelay[] ints = new PDelay[SIZE];
316 >        for (int i = SIZE-1; i >= 0; --i)
317 >            ints[i] = new PDelay(i);
318 >        DelayQueue q = new DelayQueue();
319 >        assertFalse(q.addAll(Arrays.asList(empty)));
320 >        assertTrue(q.addAll(Arrays.asList(ints)));
321 >        for (int i = 0; i < SIZE; ++i)
322 >            assertEquals(ints[i], q.poll());
323      }
324  
325      /**
326 <     *
326 >     * put(null) throws NPE
327       */
328       public void testPutNull() {
329 <        try {
329 >        try {
330              DelayQueue q = new DelayQueue();
331              q.put(null);
332              shouldThrow();
333 <        }
318 <        catch (NullPointerException success){
319 <        }  
333 >        } catch (NullPointerException success) {}
334       }
335  
336      /**
337 <     *
337 >     * all elements successfully put are contained
338       */
339       public void testPut() {
340 <         try {
341 <             DelayQueue q = new DelayQueue();
342 <             for (int i = 0; i < SIZE; ++i) {
343 <                 PDelay I = new PDelay(i);
344 <                 q.put(I);
331 <                 assertTrue(q.contains(I));
332 <             }
333 <             assertEquals(SIZE, q.size());
340 >         DelayQueue q = new DelayQueue();
341 >         for (int i = 0; i < SIZE; ++i) {
342 >             PDelay I = new PDelay(i);
343 >             q.put(I);
344 >             assertTrue(q.contains(I));
345           }
346 <         finally {
336 <        }
346 >         assertEquals(SIZE, q.size());
347      }
348  
349      /**
350 <     *
350 >     * put doesn't block waiting for take
351       */
352 <    public void testPutWithTake() {
352 >    public void testPutWithTake() throws InterruptedException {
353          final DelayQueue q = new DelayQueue();
354 <        Thread t = new Thread(new Runnable() {
355 <                public void run() {
356 <                    int added = 0;
357 <                    try {
358 <                        q.put(new PDelay(0));
359 <                        ++added;
360 <                        q.put(new PDelay(0));
361 <                        ++added;
362 <                        q.put(new PDelay(0));
363 <                        ++added;
364 <                        q.put(new PDelay(0));
365 <                        ++added;
366 <                        threadAssertTrue(added == 4);
357 <                    } finally {
358 <                    }
359 <                }
360 <            });
361 <        try {
362 <            t.start();
363 <            Thread.sleep(SHORT_DELAY_MS);
364 <            q.take();
365 <            t.interrupt();
366 <            t.join();
367 <        } catch (Exception e){
368 <            unexpectedException();
369 <        }
354 >        Thread t = new Thread(new CheckedRunnable() {
355 >            public void realRun() {
356 >                q.put(new PDelay(0));
357 >                q.put(new PDelay(0));
358 >                q.put(new PDelay(0));
359 >                q.put(new PDelay(0));
360 >            }});
361 >
362 >        t.start();
363 >        Thread.sleep(SHORT_DELAY_MS);
364 >        q.take();
365 >        t.interrupt();
366 >        t.join();
367      }
368  
369      /**
370 <     *
370 >     * timed offer does not time out
371       */
372 <    public void testTimedOffer() {
372 >    public void testTimedOffer() throws InterruptedException {
373          final DelayQueue q = new DelayQueue();
374 <        Thread t = new Thread(new Runnable() {
375 <                public void run() {
376 <                    try {
377 <                        q.put(new PDelay(0));
378 <                        q.put(new PDelay(0));
379 <                        threadAssertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
380 <                        threadAssertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, TimeUnit.MILLISECONDS));
381 <                    } finally { }
382 <                }
383 <            });
384 <        
385 <        try {
389 <            t.start();
390 <            Thread.sleep(SMALL_DELAY_MS);
391 <            t.interrupt();
392 <            t.join();
393 <        } catch (Exception e){
394 <            unexpectedException();
395 <        }
374 >        Thread t = new Thread(new CheckedRunnable() {
375 >            public void realRun() throws InterruptedException {
376 >                q.put(new PDelay(0));
377 >                q.put(new PDelay(0));
378 >                threadAssertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, MILLISECONDS));
379 >                threadAssertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, MILLISECONDS));
380 >            }});
381 >
382 >        t.start();
383 >        Thread.sleep(SMALL_DELAY_MS);
384 >        t.interrupt();
385 >        t.join();
386      }
387  
388      /**
389 <     *
389 >     * take retrieves elements in priority order
390       */
391 <    public void testTake() {
392 <        try {
393 <            DelayQueue q = populatedQueue(SIZE);
394 <            for (int i = 0; i < SIZE; ++i) {
395 <                assertEquals(new PDelay(i), ((PDelay)q.take()));
406 <            }
407 <        } catch (InterruptedException e){
408 <            unexpectedException();
409 <        }  
391 >    public void testTake() throws InterruptedException {
392 >        DelayQueue q = populatedQueue(SIZE);
393 >        for (int i = 0; i < SIZE; ++i) {
394 >            assertEquals(new PDelay(i), ((PDelay)q.take()));
395 >        }
396      }
397  
398      /**
399 <     *
399 >     * take blocks interruptibly when empty
400       */
401 <    public void testTakeFromEmpty() {
401 >    public void testTakeFromEmpty() throws InterruptedException {
402          final DelayQueue q = new DelayQueue();
403 <        Thread t = new Thread(new Runnable() {
404 <                public void run() {
405 <                    try {
406 <                        q.take();
407 <                        threadShouldThrow();
408 <                    } catch (InterruptedException success){ }                
409 <                }
410 <            });
411 <        try {
426 <            t.start();
427 <            Thread.sleep(SHORT_DELAY_MS);
428 <            t.interrupt();
429 <            t.join();
430 <        } catch (Exception e){
431 <            unexpectedException();
432 <        }
403 >        Thread t = new ThreadShouldThrow(InterruptedException.class) {
404 >            public void realRun() throws InterruptedException {
405 >                q.take();
406 >            }};
407 >
408 >        t.start();
409 >        Thread.sleep(SHORT_DELAY_MS);
410 >        t.interrupt();
411 >        t.join();
412      }
413  
414      /**
415 <     *
416 <     */
417 <    public void testBlockingTake() {
418 <        Thread t = new Thread(new Runnable() {
419 <                public void run() {
420 <                    try {
421 <                        DelayQueue q = populatedQueue(SIZE);
422 <                        for (int i = 0; i < SIZE; ++i) {
423 <                            threadAssertEquals(new PDelay(i), ((PDelay)q.take()));
424 <                        }
425 <                        q.take();
426 <                        threadShouldThrow();
448 <                    } catch (InterruptedException success){
449 <                    }  
450 <                }});
415 >     * Take removes existing elements until empty, then blocks interruptibly
416 >     */
417 >    public void testBlockingTake() throws InterruptedException {
418 >        Thread t = new ThreadShouldThrow(InterruptedException.class) {
419 >            public void realRun() throws InterruptedException {
420 >                DelayQueue q = populatedQueue(SIZE);
421 >                for (int i = 0; i < SIZE; ++i) {
422 >                    threadAssertEquals(new PDelay(i), ((PDelay)q.take()));
423 >                }
424 >                q.take();
425 >            }};
426 >
427          t.start();
428 <        try {
429 <           Thread.sleep(SHORT_DELAY_MS);
430 <           t.interrupt();
455 <           t.join();
456 <        }
457 <        catch (InterruptedException ie) {
458 <            unexpectedException();
459 <        }
428 >        Thread.sleep(SHORT_DELAY_MS);
429 >        t.interrupt();
430 >        t.join();
431      }
432  
433  
434      /**
435 <     *
435 >     * poll succeeds unless empty
436       */
437      public void testPoll() {
438          DelayQueue q = populatedQueue(SIZE);
439          for (int i = 0; i < SIZE; ++i) {
440              assertEquals(new PDelay(i), ((PDelay)q.poll()));
441          }
442 <        assertNull(q.poll());
442 >        assertNull(q.poll());
443      }
444  
445      /**
446 <     *
446 >     * timed pool with zero timeout succeeds when non-empty, else times out
447       */
448 <    public void testTimedPoll0() {
449 <        try {
450 <            DelayQueue q = populatedQueue(SIZE);
451 <            for (int i = 0; i < SIZE; ++i) {
452 <                assertEquals(new PDelay(i), ((PDelay)q.poll(0, TimeUnit.MILLISECONDS)));
453 <            }
483 <            assertNull(q.poll(0, TimeUnit.MILLISECONDS));
484 <        } catch (InterruptedException e){
485 <            unexpectedException();
486 <        }  
448 >    public void testTimedPoll0() throws InterruptedException {
449 >        DelayQueue q = populatedQueue(SIZE);
450 >        for (int i = 0; i < SIZE; ++i) {
451 >            assertEquals(new PDelay(i), ((PDelay)q.poll(0, MILLISECONDS)));
452 >        }
453 >        assertNull(q.poll(0, MILLISECONDS));
454      }
455  
456      /**
457 <     *
457 >     * timed pool with nonzero timeout succeeds when non-empty, else times out
458       */
459 <    public void testTimedPoll() {
460 <        try {
461 <            DelayQueue q = populatedQueue(SIZE);
462 <            for (int i = 0; i < SIZE; ++i) {
463 <                assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)));
464 <            }
498 <            assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
499 <        } catch (InterruptedException e){
500 <            unexpectedException();
501 <        }  
459 >    public void testTimedPoll() throws InterruptedException {
460 >        DelayQueue q = populatedQueue(SIZE);
461 >        for (int i = 0; i < SIZE; ++i) {
462 >            assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
463 >        }
464 >        assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
465      }
466  
467      /**
468 <     *
469 <     */
470 <    public void testInterruptedTimedPoll() {
471 <        Thread t = new Thread(new Runnable() {
472 <                public void run() {
473 <                    try {
474 <                        DelayQueue q = populatedQueue(SIZE);
475 <                        for (int i = 0; i < SIZE; ++i) {
476 <                            threadAssertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)));
477 <                        }
478 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
479 <                    } catch (InterruptedException success){
480 <                    }  
481 <                }});
468 >     * Interrupted timed poll throws InterruptedException instead of
469 >     * returning timeout status
470 >     */
471 >    public void testInterruptedTimedPoll() throws InterruptedException {
472 >        Thread t = new Thread(new CheckedRunnable() {
473 >            public void realRun() throws InterruptedException {
474 >                DelayQueue q = populatedQueue(SIZE);
475 >                for (int i = 0; i < SIZE; ++i) {
476 >                    assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS)));
477 >                }
478 >                try {
479 >                    q.poll(SMALL_DELAY_MS, MILLISECONDS);
480 >                    shouldThrow();
481 >                } catch (InterruptedException success) {}
482 >            }});
483 >
484          t.start();
485 <        try {
486 <           Thread.sleep(SHORT_DELAY_MS);
487 <           t.interrupt();
523 <           t.join();
524 <        }
525 <        catch (InterruptedException ie) {
526 <            unexpectedException();
527 <        }
485 >        Thread.sleep(SHORT_DELAY_MS);
486 >        t.interrupt();
487 >        t.join();
488      }
489  
490      /**
491 <     *
491 >     *  timed poll before a delayed offer fails; after offer succeeds;
492 >     *  on interruption throws
493       */
494 <    public void testTimedPollWithOffer() {
494 >    public void testTimedPollWithOffer() throws InterruptedException {
495          final DelayQueue q = new DelayQueue();
496 <        Thread t = new Thread(new Runnable() {
497 <                public void run() {
498 <                    try {
499 <                        threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
500 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
501 <                        q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
502 <                        threadFail("Should block");
503 <                    } catch (InterruptedException success) { }                
504 <                }
505 <            });
506 <        try {
507 <            t.start();
508 <            Thread.sleep(SMALL_DELAY_MS);
509 <            assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
510 <            t.interrupt();
511 <            t.join();
512 <        } catch (Exception e){
552 <            unexpectedException();
553 <        }
554 <    }  
496 >        final PDelay pdelay = new PDelay(0);
497 >        Thread t = new Thread(new CheckedRunnable() {
498 >            public void realRun() throws InterruptedException {
499 >                assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
500 >                assertSame(pdelay, q.poll(LONG_DELAY_MS, MILLISECONDS));
501 >                try {
502 >                    q.poll(LONG_DELAY_MS, MILLISECONDS);
503 >                    shouldThrow();
504 >                } catch (InterruptedException success) {}
505 >            }});
506 >
507 >        t.start();
508 >        Thread.sleep(SMALL_DELAY_MS);
509 >        assertTrue(q.offer(pdelay, SHORT_DELAY_MS, MILLISECONDS));
510 >        t.interrupt();
511 >        t.join();
512 >    }
513  
514  
515      /**
516 <     *
516 >     * peek returns next element, or null if empty
517       */
518      public void testPeek() {
519          DelayQueue q = populatedQueue(SIZE);
520          for (int i = 0; i < SIZE; ++i) {
521              assertEquals(new PDelay(i), ((PDelay)q.peek()));
522              q.poll();
523 <            assertTrue(q.peek() == null ||
524 <                       i != ((PDelay)q.peek()).intValue());
523 >            if (q.isEmpty())
524 >                assertNull(q.peek());
525 >            else
526 >                assertTrue(i != ((PDelay)q.peek()).intValue());
527          }
528 <        assertNull(q.peek());
528 >        assertNull(q.peek());
529      }
530  
531      /**
532 <     *
532 >     * element returns next element, or throws NSEE if empty
533       */
534      public void testElement() {
535          DelayQueue q = populatedQueue(SIZE);
# Line 580 | Line 540 | public class DelayQueueTest extends JSR1
540          try {
541              q.element();
542              shouldThrow();
543 <        }
584 <        catch (NoSuchElementException success) {}
543 >        } catch (NoSuchElementException success) {}
544      }
545  
546      /**
547 <     *
547 >     * remove removes next element, or throws NSEE if empty
548       */
549      public void testRemove() {
550          DelayQueue q = populatedQueue(SIZE);
# Line 595 | Line 554 | public class DelayQueueTest extends JSR1
554          try {
555              q.remove();
556              shouldThrow();
557 <        } catch (NoSuchElementException success){
599 <        }  
557 >        } catch (NoSuchElementException success) {}
558      }
559  
560      /**
561 <     *
561 >     * remove(x) removes x and returns true if present
562       */
563      public void testRemoveElement() {
564          DelayQueue q = populatedQueue(SIZE);
# Line 613 | Line 571 | public class DelayQueueTest extends JSR1
571          }
572          assertTrue(q.isEmpty());
573      }
574 <        
574 >
575      /**
576 <     *
576 >     * contains(x) reports true when elements added but not yet removed
577       */
578      public void testContains() {
579          DelayQueue q = populatedQueue(SIZE);
# Line 627 | Line 585 | public class DelayQueueTest extends JSR1
585      }
586  
587      /**
588 <     *
588 >     * clear removes all elements
589       */
590      public void testClear() {
591          DelayQueue q = populatedQueue(SIZE);
# Line 635 | Line 593 | public class DelayQueueTest extends JSR1
593          assertTrue(q.isEmpty());
594          assertEquals(0, q.size());
595          assertEquals(NOCAP, q.remainingCapacity());
596 <        q.add(new PDelay(1));
596 >        PDelay x = new PDelay(1);
597 >        q.add(x);
598          assertFalse(q.isEmpty());
599 +        assertTrue(q.contains(x));
600          q.clear();
601          assertTrue(q.isEmpty());
602      }
603  
604      /**
605 <     *
605 >     * containsAll(c) is true when c contains a subset of elements
606       */
607      public void testContainsAll() {
608          DelayQueue q = populatedQueue(SIZE);
# Line 656 | Line 616 | public class DelayQueueTest extends JSR1
616      }
617  
618      /**
619 <     *
619 >     * retainAll(c) retains only those elements of c and reports true if changed
620       */
621      public void testRetainAll() {
622          DelayQueue q = populatedQueue(SIZE);
# Line 675 | Line 635 | public class DelayQueueTest extends JSR1
635      }
636  
637      /**
638 <     *
638 >     * removeAll(c) removes only those elements of c and reports true if changed
639       */
640      public void testRemoveAll() {
641          for (int i = 1; i < SIZE; ++i) {
# Line 691 | Line 651 | public class DelayQueueTest extends JSR1
651      }
652  
653      /**
654 <     *
654 >     * toArray contains all elements
655       */
656 <    public void testToArray() {
656 >    public void testToArray() throws InterruptedException {
657          DelayQueue q = populatedQueue(SIZE);
658 <        Object[] o = q.toArray();
658 >        Object[] o = q.toArray();
659          Arrays.sort(o);
660 <        try {
661 <        for(int i = 0; i < o.length; i++)
702 <            assertEquals(o[i], q.take());
703 <        } catch (InterruptedException e){
704 <            unexpectedException();
705 <        }    
660 >        for (int i = 0; i < o.length; i++)
661 >            assertEquals(o[i], q.take());
662      }
663  
664      /**
665 <     *
665 >     * toArray(a) contains all elements
666       */
667 <    public void testToArray2() {
667 >    public void testToArray2() throws InterruptedException {
668          DelayQueue q = populatedQueue(SIZE);
669 <        PDelay[] ints = new PDelay[SIZE];
670 <        ints = (PDelay[])q.toArray(ints);
669 >        PDelay[] ints = new PDelay[SIZE];
670 >        ints = (PDelay[])q.toArray(ints);
671          Arrays.sort(ints);
672 <        try {
673 <            for(int i = 0; i < ints.length; i++)
718 <                assertEquals(ints[i], q.take());
719 <        } catch (InterruptedException e){
720 <            unexpectedException();
721 <        }    
672 >        for (int i = 0; i < ints.length; i++)
673 >            assertEquals(ints[i], q.take());
674      }
675 <    
675 >
676 >
677 >    /**
678 >     * toArray(null) throws NPE
679 >     */
680 >    public void testToArray_BadArg() {
681 >        try {
682 >            DelayQueue q = populatedQueue(SIZE);
683 >            Object o[] = q.toArray(null);
684 >            shouldThrow();
685 >        } catch (NullPointerException success) {}
686 >    }
687 >
688 >    /**
689 >     * toArray with incompatible array type throws CCE
690 >     */
691 >    public void testToArray1_BadArg() {
692 >        try {
693 >            DelayQueue q = populatedQueue(SIZE);
694 >            Object o[] = q.toArray(new String[10] );
695 >            shouldThrow();
696 >        } catch (ArrayStoreException success) {}
697 >    }
698 >
699      /**
700 <     *
700 >     * iterator iterates through all elements
701       */
702      public void testIterator() {
703          DelayQueue q = populatedQueue(SIZE);
704          int i = 0;
705 <        Iterator it = q.iterator();
706 <        while(it.hasNext()) {
705 >        Iterator it = q.iterator();
706 >        while (it.hasNext()) {
707              assertTrue(q.contains(it.next()));
708              ++i;
709          }
# Line 736 | Line 711 | public class DelayQueueTest extends JSR1
711      }
712  
713      /**
714 <     *
714 >     * iterator.remove removes current element
715       */
716      public void testIteratorRemove () {
742
717          final DelayQueue q = new DelayQueue();
744
718          q.add(new PDelay(2));
719          q.add(new PDelay(1));
720          q.add(new PDelay(3));
748
721          Iterator it = q.iterator();
722          it.next();
723          it.remove();
752
724          it = q.iterator();
725          assertEquals(it.next(), new PDelay(2));
726          assertEquals(it.next(), new PDelay(3));
# Line 758 | Line 729 | public class DelayQueueTest extends JSR1
729  
730  
731      /**
732 <     *
732 >     * toString contains toStrings of elements
733       */
734      public void testToString() {
735          DelayQueue q = populatedQueue(SIZE);
# Line 766 | Line 737 | public class DelayQueueTest extends JSR1
737          for (int i = 0; i < SIZE; ++i) {
738              assertTrue(s.indexOf(String.valueOf(Integer.MIN_VALUE+i)) >= 0);
739          }
740 <    }        
740 >    }
741  
742      /**
743 <     *
743 >     * offer transfers elements across Executor tasks
744       */
745      public void testPollInExecutor() {
775
746          final DelayQueue q = new DelayQueue();
777
747          ExecutorService executor = Executors.newFixedThreadPool(2);
748 <
749 <        executor.execute(new Runnable() {
781 <            public void run() {
748 >        executor.execute(new CheckedRunnable() {
749 >            public void realRun() throws InterruptedException {
750                  threadAssertNull(q.poll());
751 <                try {
752 <                    threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
753 <                    threadAssertTrue(q.isEmpty());
754 <                }
755 <                catch (InterruptedException e) {
756 <                    threadUnexpectedException();
757 <                }
758 <            }
759 <        });
751 >                threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
752 >                threadAssertTrue(q.isEmpty());
753 >            }});
754 >
755 >        executor.execute(new CheckedRunnable() {
756 >            public void realRun() throws InterruptedException {
757 >                Thread.sleep(SHORT_DELAY_MS);
758 >                q.put(new PDelay(1));
759 >            }});
760  
793        executor.execute(new Runnable() {
794            public void run() {
795                try {
796                    Thread.sleep(SHORT_DELAY_MS);
797                    q.put(new PDelay(1));
798                }
799                catch (InterruptedException e) {
800                    threadUnexpectedException();
801                }
802            }
803        });
804        
761          joinPool(executor);
762  
763      }
764  
765  
766      /**
767 <     *
767 >     * Delayed actions do not occur until their delay elapses
768       */
769 <    public void testDelay() {
769 >    public void testDelay() throws InterruptedException {
770          DelayQueue q = new DelayQueue();
771          NanoDelay[] elements = new NanoDelay[SIZE];
772          for (int i = 0; i < SIZE; ++i) {
# Line 820 | Line 776 | public class DelayQueueTest extends JSR1
776              q.add(elements[i]);
777          }
778  
779 +        long last = 0;
780 +        for (int i = 0; i < SIZE; ++i) {
781 +            NanoDelay e = (NanoDelay)(q.take());
782 +            long tt = e.getTriggerTime();
783 +            assertTrue(tt <= System.nanoTime());
784 +            if (i != 0)
785 +                assertTrue(tt >= last);
786 +            last = tt;
787 +        }
788 +    }
789 +
790 +    /**
791 +     * peek of a non-empty queue returns non-null even if not expired
792 +     */
793 +    public void testPeekDelayed() {
794 +        DelayQueue q = new DelayQueue();
795 +        q.add(new NanoDelay(Long.MAX_VALUE));
796 +        assert(q.peek() != null);
797 +    }
798 +
799 +
800 +    /**
801 +     * poll of a non-empty queue returns null if no expired elements.
802 +     */
803 +    public void testPollDelayed() {
804 +        DelayQueue q = new DelayQueue();
805 +        q.add(new NanoDelay(Long.MAX_VALUE));
806 +        assertNull(q.poll());
807 +    }
808 +
809 +    /**
810 +     * timed poll of a non-empty queue returns null if no expired elements.
811 +     */
812 +    public void testTimedPollDelayed() throws InterruptedException {
813 +        DelayQueue q = new DelayQueue();
814 +        q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
815 +        assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
816 +    }
817 +
818 +    /**
819 +     * drainTo(null) throws NPE
820 +     */
821 +    public void testDrainToNull() {
822 +        DelayQueue q = populatedQueue(SIZE);
823          try {
824 <            long last = 0;
825 <            for (int i = 0; i < SIZE; ++i) {
826 <                NanoDelay e = (NanoDelay)(q.take());
827 <                long tt = e.getTriggerTime();
828 <                assertTrue(tt <= System.nanoTime());
829 <                if (i != 0)
830 <                    assertTrue(tt >= last);
831 <                last = tt;
832 <            }
824 >            q.drainTo(null);
825 >            shouldThrow();
826 >        } catch (NullPointerException success) {}
827 >    }
828 >
829 >    /**
830 >     * drainTo(this) throws IAE
831 >     */
832 >    public void testDrainToSelf() {
833 >        DelayQueue q = populatedQueue(SIZE);
834 >        try {
835 >            q.drainTo(q);
836 >            shouldThrow();
837 >        } catch (IllegalArgumentException success) {}
838 >    }
839 >
840 >    /**
841 >     * drainTo(c) empties queue into another collection c
842 >     */
843 >    public void testDrainTo() {
844 >        DelayQueue q = new DelayQueue();
845 >        PDelay[] elems = new PDelay[SIZE];
846 >        for (int i = 0; i < SIZE; ++i) {
847 >            elems[i] = new PDelay(i);
848 >            q.add(elems[i]);
849          }
850 <        catch(InterruptedException ie) {
851 <            unexpectedException();
850 >        ArrayList l = new ArrayList();
851 >        q.drainTo(l);
852 >        assertEquals(q.size(), 0);
853 >        for (int i = 0; i < SIZE; ++i)
854 >            assertEquals(l.get(i), elems[i]);
855 >        q.add(elems[0]);
856 >        q.add(elems[1]);
857 >        assertFalse(q.isEmpty());
858 >        assertTrue(q.contains(elems[0]));
859 >        assertTrue(q.contains(elems[1]));
860 >        l.clear();
861 >        q.drainTo(l);
862 >        assertEquals(q.size(), 0);
863 >        assertEquals(l.size(), 2);
864 >        for (int i = 0; i < 2; ++i)
865 >            assertEquals(l.get(i), elems[i]);
866 >    }
867 >
868 >    /**
869 >     * drainTo empties queue
870 >     */
871 >    public void testDrainToWithActivePut() throws InterruptedException {
872 >        final DelayQueue q = populatedQueue(SIZE);
873 >        Thread t = new Thread(new CheckedRunnable() {
874 >            public void realRun() {
875 >                q.put(new PDelay(SIZE+1));
876 >            }});
877 >
878 >        t.start();
879 >        ArrayList l = new ArrayList();
880 >        q.drainTo(l);
881 >        assertTrue(l.size() >= SIZE);
882 >        t.join();
883 >        assertTrue(q.size() + l.size() >= SIZE);
884 >    }
885 >
886 >    /**
887 >     * drainTo(null, n) throws NPE
888 >     */
889 >    public void testDrainToNullN() {
890 >        DelayQueue q = populatedQueue(SIZE);
891 >        try {
892 >            q.drainTo(null, 0);
893 >            shouldThrow();
894 >        } catch (NullPointerException success) {}
895 >    }
896 >
897 >    /**
898 >     * drainTo(this, n) throws IAE
899 >     */
900 >    public void testDrainToSelfN() {
901 >        DelayQueue q = populatedQueue(SIZE);
902 >        try {
903 >            q.drainTo(q, 0);
904 >            shouldThrow();
905 >        } catch (IllegalArgumentException success) {}
906 >    }
907 >
908 >    /**
909 >     * drainTo(c, n) empties first max {n, size} elements of queue into c
910 >     */
911 >    public void testDrainToN() {
912 >        for (int i = 0; i < SIZE + 2; ++i) {
913 >            DelayQueue q = populatedQueue(SIZE);
914 >            ArrayList l = new ArrayList();
915 >            q.drainTo(l, i);
916 >            int k = (i < SIZE)? i : SIZE;
917 >            assertEquals(q.size(), SIZE-k);
918 >            assertEquals(l.size(), k);
919          }
920      }
921  
922 +
923   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines