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

Comparing jsr166/src/test/tck/ScheduledExecutorTest.java (file contents):
Revision 1.26 by jsr166, Sat Nov 21 02:07:27 2009 UTC vs.
Revision 1.43 by jsr166, Fri May 27 19:48:58 2011 UTC

# Line 1 | Line 1
1   /*
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
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
# Line 14 | Line 14 | import java.util.concurrent.atomic.*;
14  
15   public class ScheduledExecutorTest extends JSR166TestCase {
16      public static void main(String[] args) {
17 <        junit.textui.TestRunner.run (suite());
17 >        junit.textui.TestRunner.run(suite());
18      }
19      public static Test suite() {
20          return new TestSuite(ScheduledExecutorTest.class);
21      }
22  
23
23      /**
24       * execute successfully executes a runnable
25       */
26      public void testExecute() throws InterruptedException {
27 <        TrackedShortRunnable runnable =new TrackedShortRunnable();
28 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
29 <        p1.execute(runnable);
30 <        assertFalse(runnable.done);
31 <        Thread.sleep(SHORT_DELAY_MS);
32 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
33 <        Thread.sleep(MEDIUM_DELAY_MS);
34 <        assertTrue(runnable.done);
35 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
36 <        joinPool(p1);
27 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
28 >        final CountDownLatch done = new CountDownLatch(1);
29 >        final Runnable task = new CheckedRunnable() {
30 >            public void realRun() {
31 >                done.countDown();
32 >            }};
33 >        try {
34 >            p.execute(task);
35 >            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
36 >        } finally {
37 >            joinPool(p);
38 >        }
39      }
40  
40
41      /**
42       * delayed schedule of callable successfully executes after delay
43       */
44      public void testSchedule1() throws Exception {
45 <        TrackedCallable callable = new TrackedCallable();
46 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
47 <        Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
48 <        assertFalse(callable.done);
49 <        Thread.sleep(MEDIUM_DELAY_MS);
50 <        assertTrue(callable.done);
51 <        assertEquals(Boolean.TRUE, f.get());
52 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
53 <        joinPool(p1);
45 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
46 >        final long t0 = System.nanoTime();
47 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
48 >        final CountDownLatch done = new CountDownLatch(1);
49 >        try {
50 >            Callable task = new CheckedCallable<Boolean>() {
51 >                public Boolean realCall() {
52 >                    done.countDown();
53 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
54 >                    return Boolean.TRUE;
55 >                }};
56 >            Future f = p.schedule(task, SHORT_DELAY_MS, MILLISECONDS);
57 >            assertEquals(Boolean.TRUE, f.get());
58 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
59 >            assertTrue(done.await(0L, MILLISECONDS));
60 >        } finally {
61 >            joinPool(p);
62 >        }
63      }
64  
65      /**
66 <     *  delayed schedule of runnable successfully executes after delay
67 <     */
68 <    public void testSchedule3() throws InterruptedException {
69 <        TrackedShortRunnable runnable = new TrackedShortRunnable();
70 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
71 <        p1.schedule(runnable, SMALL_DELAY_MS, MILLISECONDS);
72 <        Thread.sleep(SHORT_DELAY_MS);
73 <        assertFalse(runnable.done);
74 <        Thread.sleep(MEDIUM_DELAY_MS);
75 <        assertTrue(runnable.done);
76 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
77 <        joinPool(p1);
66 >     * delayed schedule of runnable successfully executes after delay
67 >     */
68 >    public void testSchedule3() throws Exception {
69 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
70 >        final long t0 = System.nanoTime();
71 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
72 >        final CountDownLatch done = new CountDownLatch(1);
73 >        try {
74 >            Runnable task = new CheckedRunnable() {
75 >                public void realRun() {
76 >                    done.countDown();
77 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
78 >                }};
79 >            Future f = p.schedule(task, SHORT_DELAY_MS, MILLISECONDS);
80 >            assertNull(f.get());
81 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
82 >            assertTrue(done.await(0L, MILLISECONDS));
83 >        } finally {
84 >            joinPool(p);
85 >        }
86      }
87  
88      /**
89       * scheduleAtFixedRate executes runnable after given initial delay
90       */
91 <    public void testSchedule4() throws InterruptedException {
92 <        TrackedShortRunnable runnable = new TrackedShortRunnable();
93 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
94 <        ScheduledFuture h = p1.scheduleAtFixedRate(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, MILLISECONDS);
95 <        assertFalse(runnable.done);
96 <        Thread.sleep(MEDIUM_DELAY_MS);
97 <        assertTrue(runnable.done);
98 <        h.cancel(true);
99 <        joinPool(p1);
100 <    }
101 <
102 <    static class RunnableCounter implements Runnable {
103 <        AtomicInteger count = new AtomicInteger(0);
104 <        public void run() { count.getAndIncrement(); }
91 >    public void testSchedule4() throws Exception {
92 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
93 >        final long t0 = System.nanoTime();
94 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
95 >        final CountDownLatch done = new CountDownLatch(1);
96 >        try {
97 >            Runnable task = new CheckedRunnable() {
98 >                public void realRun() {
99 >                    done.countDown();
100 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
101 >                }};
102 >            ScheduledFuture f =
103 >                p.scheduleAtFixedRate(task, SHORT_DELAY_MS,
104 >                                      SHORT_DELAY_MS, MILLISECONDS);
105 >            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
106 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
107 >            f.cancel(true);
108 >        } finally {
109 >            joinPool(p);
110 >        }
111      }
112  
113      /**
114       * scheduleWithFixedDelay executes runnable after given initial delay
115       */
116      public void testSchedule5() throws InterruptedException {
117 <        TrackedShortRunnable runnable = new TrackedShortRunnable();
118 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
119 <        ScheduledFuture h = p1.scheduleWithFixedDelay(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, MILLISECONDS);
120 <        assertFalse(runnable.done);
121 <        Thread.sleep(MEDIUM_DELAY_MS);
122 <        assertTrue(runnable.done);
123 <        h.cancel(true);
124 <        joinPool(p1);
117 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
118 >        final long t0 = System.nanoTime();
119 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
120 >        final CountDownLatch done = new CountDownLatch(1);
121 >        try {
122 >            Runnable task = new CheckedRunnable() {
123 >                public void realRun() {
124 >                    done.countDown();
125 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
126 >                }};
127 >            ScheduledFuture f =
128 >                p.scheduleWithFixedDelay(task, SHORT_DELAY_MS,
129 >                                         SHORT_DELAY_MS, MILLISECONDS);
130 >            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
131 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
132 >            f.cancel(true);
133 >        } finally {
134 >            joinPool(p);
135 >        }
136 >    }
137 >
138 >    static class RunnableCounter implements Runnable {
139 >        AtomicInteger count = new AtomicInteger(0);
140 >        public void run() { count.getAndIncrement(); }
141      }
142  
143      /**
144       * scheduleAtFixedRate executes series of tasks at given rate
145       */
146      public void testFixedRateSequence() throws InterruptedException {
147 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
147 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
148          RunnableCounter counter = new RunnableCounter();
149          ScheduledFuture h =
150 <            p1.scheduleAtFixedRate(counter, 0, 1, MILLISECONDS);
151 <        Thread.sleep(SMALL_DELAY_MS);
150 >            p.scheduleAtFixedRate(counter, 0, 1, MILLISECONDS);
151 >        delay(SMALL_DELAY_MS);
152          h.cancel(true);
153          int c = counter.count.get();
154          // By time scaling conventions, we must have at least
155          // an execution per SHORT delay, but no more than one SHORT more
156          assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
157          assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
158 <        joinPool(p1);
158 >        joinPool(p);
159      }
160  
161      /**
162       * scheduleWithFixedDelay executes series of tasks with given period
163       */
164      public void testFixedDelaySequence() throws InterruptedException {
165 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
165 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
166          RunnableCounter counter = new RunnableCounter();
167          ScheduledFuture h =
168 <            p1.scheduleWithFixedDelay(counter, 0, 1, MILLISECONDS);
169 <        Thread.sleep(SMALL_DELAY_MS);
168 >            p.scheduleWithFixedDelay(counter, 0, 1, MILLISECONDS);
169 >        delay(SMALL_DELAY_MS);
170          h.cancel(true);
171          int c = counter.count.get();
172          assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
173          assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
174 <        joinPool(p1);
174 >        joinPool(p);
175      }
176  
138
177      /**
178 <     *  execute (null) throws NPE
178 >     * execute(null) throws NPE
179       */
180      public void testExecuteNull() throws InterruptedException {
181          ScheduledThreadPoolExecutor se = null;
# Line 151 | Line 189 | public class ScheduledExecutorTest exten
189      }
190  
191      /**
192 <     * schedule (null) throws NPE
192 >     * schedule(null) throws NPE
193       */
194      public void testScheduleNull() throws InterruptedException {
195          ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
# Line 178 | Line 216 | public class ScheduledExecutorTest exten
216          }
217  
218          joinPool(se);
181
219      }
220  
221      /**
# Line 200 | Line 237 | public class ScheduledExecutorTest exten
237      /**
238       * schedule callable throws RejectedExecutionException if shutdown
239       */
240 <     public void testSchedule3_RejectedExecutionException() throws InterruptedException {
241 <         ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
242 <         try {
240 >    public void testSchedule3_RejectedExecutionException() throws InterruptedException {
241 >        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
242 >        try {
243              se.shutdown();
244              se.schedule(new NoOpCallable(),
245                          MEDIUM_DELAY_MS, MILLISECONDS);
# Line 210 | Line 247 | public class ScheduledExecutorTest exten
247          } catch (RejectedExecutionException success) {
248          } catch (SecurityException ok) {
249          }
250 <         joinPool(se);
250 >        joinPool(se);
251      }
252  
253      /**
254 <     *  scheduleAtFixedRate throws RejectedExecutionException if shutdown
254 >     * scheduleAtFixedRate throws RejectedExecutionException if shutdown
255       */
256      public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException {
257          ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
# Line 246 | Line 283 | public class ScheduledExecutorTest exten
283      }
284  
285      /**
286 <     *  getActiveCount increases but doesn't overestimate, when a
287 <     *  thread becomes active
286 >     * getActiveCount increases but doesn't overestimate, when a
287 >     * thread becomes active
288       */
289      public void testGetActiveCount() throws InterruptedException {
290 <        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
291 <        assertEquals(0, p2.getActiveCount());
292 <        p2.execute(new SmallRunnable());
293 <        Thread.sleep(SHORT_DELAY_MS);
294 <        assertEquals(1, p2.getActiveCount());
295 <        joinPool(p2);
290 >        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
291 >        final CountDownLatch threadStarted = new CountDownLatch(1);
292 >        final CountDownLatch done = new CountDownLatch(1);
293 >        try {
294 >            assertEquals(0, p.getActiveCount());
295 >            p.execute(new CheckedRunnable() {
296 >                public void realRun() throws InterruptedException {
297 >                    threadStarted.countDown();
298 >                    assertEquals(1, p.getActiveCount());
299 >                    done.await();
300 >                }});
301 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
302 >            assertEquals(1, p.getActiveCount());
303 >        } finally {
304 >            done.countDown();
305 >            joinPool(p);
306 >        }
307      }
308  
309      /**
310 <     *    getCompletedTaskCount increases, but doesn't overestimate,
311 <     *   when tasks complete
310 >     * getCompletedTaskCount increases, but doesn't overestimate,
311 >     * when tasks complete
312       */
313      public void testGetCompletedTaskCount() throws InterruptedException {
314 <        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
315 <        assertEquals(0, p2.getCompletedTaskCount());
316 <        p2.execute(new SmallRunnable());
317 <        Thread.sleep(MEDIUM_DELAY_MS);
318 <        assertEquals(1, p2.getCompletedTaskCount());
319 <        joinPool(p2);
314 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
315 >        final CountDownLatch threadStarted = new CountDownLatch(1);
316 >        final CountDownLatch threadProceed = new CountDownLatch(1);
317 >        final CountDownLatch threadDone = new CountDownLatch(1);
318 >        try {
319 >            assertEquals(0, p.getCompletedTaskCount());
320 >            p.execute(new CheckedRunnable() {
321 >                public void realRun() throws InterruptedException {
322 >                    threadStarted.countDown();
323 >                    assertEquals(0, p.getCompletedTaskCount());
324 >                    threadProceed.await();
325 >                    threadDone.countDown();
326 >                }});
327 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
328 >            assertEquals(0, p.getCompletedTaskCount());
329 >            threadProceed.countDown();
330 >            threadDone.await();
331 >            delay(SHORT_DELAY_MS);
332 >            assertEquals(1, p.getCompletedTaskCount());
333 >        } finally {
334 >            joinPool(p);
335 >        }
336      }
337  
338      /**
339 <     *  getCorePoolSize returns size given in constructor if not otherwise set
339 >     * getCorePoolSize returns size given in constructor if not otherwise set
340       */
341      public void testGetCorePoolSize() throws InterruptedException {
342 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
343 <        assertEquals(1, p1.getCorePoolSize());
344 <        joinPool(p1);
342 >        ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
343 >        assertEquals(1, p.getCorePoolSize());
344 >        joinPool(p);
345      }
346  
347      /**
348 <     *    getLargestPoolSize increases, but doesn't overestimate, when
349 <     *   multiple threads active
348 >     * getLargestPoolSize increases, but doesn't overestimate, when
349 >     * multiple threads active
350       */
351      public void testGetLargestPoolSize() throws InterruptedException {
352 <        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
353 <        assertEquals(0, p2.getLargestPoolSize());
354 <        p2.execute(new SmallRunnable());
355 <        p2.execute(new SmallRunnable());
356 <        Thread.sleep(SHORT_DELAY_MS);
357 <        assertEquals(2, p2.getLargestPoolSize());
358 <        joinPool(p2);
352 >        final int THREADS = 3;
353 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS);
354 >        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
355 >        final CountDownLatch done = new CountDownLatch(1);
356 >        try {
357 >            assertEquals(0, p.getLargestPoolSize());
358 >            for (int i = 0; i < THREADS; i++)
359 >                p.execute(new CheckedRunnable() {
360 >                    public void realRun() throws InterruptedException {
361 >                        threadsStarted.countDown();
362 >                        done.await();
363 >                        assertEquals(THREADS, p.getLargestPoolSize());
364 >                    }});
365 >            assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
366 >            assertEquals(THREADS, p.getLargestPoolSize());
367 >        } finally {
368 >            done.countDown();
369 >            joinPool(p);
370 >            assertEquals(THREADS, p.getLargestPoolSize());
371 >        }
372      }
373  
374      /**
375 <     *   getPoolSize increases, but doesn't overestimate, when threads
376 <     *   become active
375 >     * getPoolSize increases, but doesn't overestimate, when threads
376 >     * become active
377       */
378      public void testGetPoolSize() throws InterruptedException {
379 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
380 <        assertEquals(0, p1.getPoolSize());
381 <        p1.execute(new SmallRunnable());
382 <        assertEquals(1, p1.getPoolSize());
383 <        joinPool(p1);
379 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
380 >        final CountDownLatch threadStarted = new CountDownLatch(1);
381 >        final CountDownLatch done = new CountDownLatch(1);
382 >        try {
383 >            assertEquals(0, p.getPoolSize());
384 >            p.execute(new CheckedRunnable() {
385 >                public void realRun() throws InterruptedException {
386 >                    threadStarted.countDown();
387 >                    assertEquals(1, p.getPoolSize());
388 >                    done.await();
389 >                }});
390 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
391 >            assertEquals(1, p.getPoolSize());
392 >        } finally {
393 >            done.countDown();
394 >            joinPool(p);
395 >        }
396      }
397  
398      /**
399 <     *    getTaskCount increases, but doesn't overestimate, when tasks
400 <     *    submitted
399 >     * getTaskCount increases, but doesn't overestimate, when tasks
400 >     * submitted
401       */
402      public void testGetTaskCount() throws InterruptedException {
403 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
404 <        assertEquals(0, p1.getTaskCount());
405 <        for (int i = 0; i < 5; i++)
406 <            p1.execute(new SmallRunnable());
407 <        Thread.sleep(SHORT_DELAY_MS);
408 <        assertEquals(5, p1.getTaskCount());
409 <        joinPool(p1);
403 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
404 >        final CountDownLatch threadStarted = new CountDownLatch(1);
405 >        final CountDownLatch done = new CountDownLatch(1);
406 >        final int TASKS = 5;
407 >        try {
408 >            assertEquals(0, p.getTaskCount());
409 >            for (int i = 0; i < TASKS; i++)
410 >                p.execute(new CheckedRunnable() {
411 >                    public void realRun() throws InterruptedException {
412 >                        threadStarted.countDown();
413 >                        done.await();
414 >                    }});
415 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
416 >            assertEquals(TASKS, p.getTaskCount());
417 >        } finally {
418 >            done.countDown();
419 >            joinPool(p);
420 >        }
421      }
422  
423      /**
# Line 356 | Line 456 | public class ScheduledExecutorTest exten
456      }
457  
458      /**
459 <     *   is isShutDown is false before shutdown, true after
459 >     * isShutdown is false before shutdown, true after
460       */
461      public void testIsShutdown() {
462  
463 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
463 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
464          try {
465 <            assertFalse(p1.isShutdown());
465 >            assertFalse(p.isShutdown());
466          }
467          finally {
468 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
468 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
469          }
470 <        assertTrue(p1.isShutdown());
470 >        assertTrue(p.isShutdown());
471      }
472  
373
473      /**
474 <     *   isTerminated is false before termination, true after
474 >     * isTerminated is false before termination, true after
475       */
476      public void testIsTerminated() throws InterruptedException {
477 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
477 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
478 >        final CountDownLatch threadStarted = new CountDownLatch(1);
479 >        final CountDownLatch done = new CountDownLatch(1);
480 >        assertFalse(p.isTerminated());
481          try {
482 <            p1.execute(new SmallRunnable());
482 >            p.execute(new CheckedRunnable() {
483 >                public void realRun() throws InterruptedException {
484 >                    assertFalse(p.isTerminated());
485 >                    threadStarted.countDown();
486 >                    done.await();
487 >                }});
488 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
489 >            assertFalse(p.isTerminating());
490 >            done.countDown();
491          } finally {
492 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
492 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
493          }
494 <        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
495 <        assertTrue(p1.isTerminated());
494 >        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
495 >        assertTrue(p.isTerminated());
496      }
497  
498      /**
499 <     *  isTerminating is not true when running or when terminated
499 >     * isTerminating is not true when running or when terminated
500       */
501      public void testIsTerminating() throws InterruptedException {
502 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
503 <        assertFalse(p1.isTerminating());
504 <        try {
505 <            p1.execute(new SmallRunnable());
506 <            assertFalse(p1.isTerminating());
507 <        } finally {
508 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
509 <        }
510 <
511 <        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
512 <        assertTrue(p1.isTerminated());
513 <        assertFalse(p1.isTerminating());
502 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
503 >        final CountDownLatch threadStarted = new CountDownLatch(1);
504 >        final CountDownLatch done = new CountDownLatch(1);
505 >        try {
506 >            assertFalse(p.isTerminating());
507 >            p.execute(new CheckedRunnable() {
508 >                public void realRun() throws InterruptedException {
509 >                    assertFalse(p.isTerminating());
510 >                    threadStarted.countDown();
511 >                    done.await();
512 >                }});
513 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
514 >            assertFalse(p.isTerminating());
515 >            done.countDown();
516 >        } finally {
517 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
518 >        }
519 >        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
520 >        assertTrue(p.isTerminated());
521 >        assertFalse(p.isTerminating());
522      }
523  
524      /**
525       * getQueue returns the work queue, which contains queued tasks
526       */
527      public void testGetQueue() throws InterruptedException {
528 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
529 <        ScheduledFuture[] tasks = new ScheduledFuture[5];
530 <        for (int i = 0; i < 5; i++) {
413 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, MILLISECONDS);
414 <        }
528 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
529 >        final CountDownLatch threadStarted = new CountDownLatch(1);
530 >        final CountDownLatch done = new CountDownLatch(1);
531          try {
532 <            Thread.sleep(SHORT_DELAY_MS);
533 <            BlockingQueue<Runnable> q = p1.getQueue();
534 <            assertTrue(q.contains(tasks[4]));
532 >            ScheduledFuture[] tasks = new ScheduledFuture[5];
533 >            for (int i = 0; i < tasks.length; i++) {
534 >                Runnable r = new CheckedRunnable() {
535 >                    public void realRun() throws InterruptedException {
536 >                        threadStarted.countDown();
537 >                        done.await();
538 >                    }};
539 >                tasks[i] = p.schedule(r, 1, MILLISECONDS);
540 >            }
541 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
542 >            BlockingQueue<Runnable> q = p.getQueue();
543 >            assertTrue(q.contains(tasks[tasks.length - 1]));
544              assertFalse(q.contains(tasks[0]));
545          } finally {
546 <            joinPool(p1);
546 >            done.countDown();
547 >            joinPool(p);
548          }
549      }
550  
# Line 426 | Line 552 | public class ScheduledExecutorTest exten
552       * remove(task) removes queued task, and fails to remove active task
553       */
554      public void testRemove() throws InterruptedException {
555 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
555 >        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
556          ScheduledFuture[] tasks = new ScheduledFuture[5];
557 <        for (int i = 0; i < 5; i++) {
558 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, MILLISECONDS);
433 <        }
557 >        final CountDownLatch threadStarted = new CountDownLatch(1);
558 >        final CountDownLatch done = new CountDownLatch(1);
559          try {
560 <            Thread.sleep(SHORT_DELAY_MS);
561 <            BlockingQueue<Runnable> q = p1.getQueue();
562 <            assertFalse(p1.remove((Runnable)tasks[0]));
560 >            for (int i = 0; i < tasks.length; i++) {
561 >                Runnable r = new CheckedRunnable() {
562 >                    public void realRun() throws InterruptedException {
563 >                        threadStarted.countDown();
564 >                        done.await();
565 >                    }};
566 >                tasks[i] = p.schedule(r, 1, MILLISECONDS);
567 >            }
568 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
569 >            BlockingQueue<Runnable> q = p.getQueue();
570 >            assertFalse(p.remove((Runnable)tasks[0]));
571              assertTrue(q.contains((Runnable)tasks[4]));
572              assertTrue(q.contains((Runnable)tasks[3]));
573 <            assertTrue(p1.remove((Runnable)tasks[4]));
574 <            assertFalse(p1.remove((Runnable)tasks[4]));
573 >            assertTrue(p.remove((Runnable)tasks[4]));
574 >            assertFalse(p.remove((Runnable)tasks[4]));
575              assertFalse(q.contains((Runnable)tasks[4]));
576              assertTrue(q.contains((Runnable)tasks[3]));
577 <            assertTrue(p1.remove((Runnable)tasks[3]));
577 >            assertTrue(p.remove((Runnable)tasks[3]));
578              assertFalse(q.contains((Runnable)tasks[3]));
579          } finally {
580 <            joinPool(p1);
580 >            done.countDown();
581 >            joinPool(p);
582          }
583      }
584  
585      /**
586 <     *  purge removes cancelled tasks from the queue
586 >     * purge eventually removes cancelled tasks from the queue
587       */
588      public void testPurge() throws InterruptedException {
589 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
589 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
590          ScheduledFuture[] tasks = new ScheduledFuture[5];
591 <        for (int i = 0; i < 5; i++) {
592 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, MILLISECONDS);
593 <        }
591 >        for (int i = 0; i < tasks.length; i++)
592 >            tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
593 >                                  LONG_DELAY_MS, MILLISECONDS);
594          try {
595 <            int max = 5;
595 >            int max = tasks.length;
596              if (tasks[4].cancel(true)) --max;
597              if (tasks[3].cancel(true)) --max;
598              // There must eventually be an interference-free point at
599              // which purge will not fail. (At worst, when queue is empty.)
600 <            int k;
601 <            for (k = 0; k < SMALL_DELAY_MS; ++k) {
602 <                p1.purge();
603 <                long count = p1.getTaskCount();
604 <                if (count >= 0 && count <= max)
605 <                    break;
606 <                Thread.sleep(1);
607 <            }
474 <            assertTrue(k < SMALL_DELAY_MS);
600 >            long startTime = System.nanoTime();
601 >            do {
602 >                p.purge();
603 >                long count = p.getTaskCount();
604 >                if (count == max)
605 >                    return;
606 >            } while (millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
607 >            fail("Purge failed to remove cancelled tasks");
608          } finally {
609 <            joinPool(p1);
609 >            for (ScheduledFuture task : tasks)
610 >                task.cancel(true);
611 >            joinPool(p);
612          }
613      }
614  
615      /**
616 <     *  shutDownNow returns a list containing tasks that were not run
616 >     * shutdownNow returns a list containing tasks that were not run
617       */
618 <    public void testShutDownNow() throws InterruptedException {
619 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
618 >    public void testShutdownNow() {
619 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
620          for (int i = 0; i < 5; i++)
621 <            p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, MILLISECONDS);
622 <        List l;
621 >            p.schedule(new SmallPossiblyInterruptedRunnable(),
622 >                       LONG_DELAY_MS, MILLISECONDS);
623          try {
624 <            l = p1.shutdownNow();
624 >            List<Runnable> l = p.shutdownNow();
625 >            assertTrue(p.isShutdown());
626 >            assertEquals(5, l.size());
627          } catch (SecurityException ok) {
628 <            return;
628 >            // Allowed in case test doesn't have privs
629 >        } finally {
630 >            joinPool(p);
631          }
493        assertTrue(p1.isShutdown());
494        assertTrue(l.size() > 0 && l.size() <= 5);
495        joinPool(p1);
632      }
633  
634      /**
635       * In default setting, shutdown cancels periodic but not delayed
636       * tasks at shutdown
637       */
638 <    public void testShutDown1() throws InterruptedException {
639 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
640 <        assertTrue(p1.getExecuteExistingDelayedTasksAfterShutdownPolicy());
641 <        assertFalse(p1.getContinueExistingPeriodicTasksAfterShutdownPolicy());
638 >    public void testShutdown1() throws InterruptedException {
639 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
640 >        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
641 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
642  
643          ScheduledFuture[] tasks = new ScheduledFuture[5];
644 <        for (int i = 0; i < 5; i++)
645 <            tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, MILLISECONDS);
646 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
647 <        BlockingQueue q = p1.getQueue();
648 <        for (Iterator it = q.iterator(); it.hasNext();) {
649 <            ScheduledFuture t = (ScheduledFuture)it.next();
650 <            assertFalse(t.isCancelled());
651 <        }
652 <        assertTrue(p1.isShutdown());
653 <        Thread.sleep(SMALL_DELAY_MS);
654 <        for (int i = 0; i < 5; ++i) {
655 <            assertTrue(tasks[i].isDone());
656 <            assertFalse(tasks[i].isCancelled());
644 >        for (int i = 0; i < tasks.length; i++)
645 >            tasks[i] = p.schedule(new NoOpRunnable(),
646 >                                  SHORT_DELAY_MS, MILLISECONDS);
647 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
648 >        BlockingQueue<Runnable> q = p.getQueue();
649 >        for (ScheduledFuture task : tasks) {
650 >            assertFalse(task.isDone());
651 >            assertFalse(task.isCancelled());
652 >            assertTrue(q.contains(task));
653 >        }
654 >        assertTrue(p.isShutdown());
655 >        assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
656 >        assertTrue(p.isTerminated());
657 >        for (ScheduledFuture task : tasks) {
658 >            assertTrue(task.isDone());
659 >            assertFalse(task.isCancelled());
660          }
661      }
662  
524
663      /**
664       * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
665       * delayed tasks are cancelled at shutdown
666       */
667 <    public void testShutDown2() throws InterruptedException {
668 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
669 <        p1.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
667 >    public void testShutdown2() throws InterruptedException {
668 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
669 >        p.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
670 >        assertFalse(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
671 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
672          ScheduledFuture[] tasks = new ScheduledFuture[5];
673 <        for (int i = 0; i < 5; i++)
674 <            tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, MILLISECONDS);
675 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
676 <        assertTrue(p1.isShutdown());
677 <        BlockingQueue q = p1.getQueue();
673 >        for (int i = 0; i < tasks.length; i++)
674 >            tasks[i] = p.schedule(new NoOpRunnable(),
675 >                                  SHORT_DELAY_MS, MILLISECONDS);
676 >        BlockingQueue q = p.getQueue();
677 >        assertEquals(tasks.length, q.size());
678 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
679 >        assertTrue(p.isShutdown());
680          assertTrue(q.isEmpty());
681 <        Thread.sleep(SMALL_DELAY_MS);
682 <        assertTrue(p1.isTerminated());
681 >        assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
682 >        assertTrue(p.isTerminated());
683 >        for (ScheduledFuture task : tasks) {
684 >            assertTrue(task.isDone());
685 >            assertTrue(task.isCancelled());
686 >        }
687      }
688  
543
689      /**
690       * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
691 <     * periodic tasks are not cancelled at shutdown
691 >     * periodic tasks are cancelled at shutdown
692       */
693 <    public void testShutDown3() throws InterruptedException {
694 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
695 <        p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
693 >    public void testShutdown3() throws InterruptedException {
694 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
695 >        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
696 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
697 >        p.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
698 >        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
699 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
700 >        long initialDelay = LONG_DELAY_MS;
701          ScheduledFuture task =
702 <            p1.scheduleAtFixedRate(new NoOpRunnable(), 5, 5, MILLISECONDS);
703 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
704 <        assertTrue(p1.isShutdown());
705 <        BlockingQueue q = p1.getQueue();
706 <        assertTrue(q.isEmpty());
707 <        Thread.sleep(SHORT_DELAY_MS);
708 <        assertTrue(p1.isTerminated());
702 >            p.scheduleAtFixedRate(new NoOpRunnable(), initialDelay,
703 >                                  5, MILLISECONDS);
704 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
705 >        assertTrue(p.isShutdown());
706 >        assertTrue(p.getQueue().isEmpty());
707 >        assertTrue(task.isDone());
708 >        assertTrue(task.isCancelled());
709 >        joinPool(p);
710      }
711  
712      /**
713       * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
714 <     * periodic tasks are cancelled at shutdown
714 >     * periodic tasks are not cancelled at shutdown
715       */
716 <    public void testShutDown4() throws InterruptedException {
717 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
716 >    public void testShutdown4() throws InterruptedException {
717 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
718 >        final CountDownLatch counter = new CountDownLatch(2);
719          try {
720 <            p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
720 >            p.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
721 >            assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
722 >            assertTrue(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
723 >            final Runnable r = new CheckedRunnable() {
724 >                public void realRun() {
725 >                    counter.countDown();
726 >                }};
727              ScheduledFuture task =
728 <                p1.scheduleAtFixedRate(new NoOpRunnable(), 1, 1, MILLISECONDS);
728 >                p.scheduleAtFixedRate(r, 1, 1, MILLISECONDS);
729 >            assertFalse(task.isDone());
730              assertFalse(task.isCancelled());
731 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
731 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
732              assertFalse(task.isCancelled());
733 <            assertFalse(p1.isTerminated());
734 <            assertTrue(p1.isShutdown());
735 <            Thread.sleep(SHORT_DELAY_MS);
733 >            assertFalse(p.isTerminated());
734 >            assertTrue(p.isShutdown());
735 >            assertTrue(counter.await(SMALL_DELAY_MS, MILLISECONDS));
736              assertFalse(task.isCancelled());
737 <            assertTrue(task.cancel(true));
737 >            assertTrue(task.cancel(false));
738              assertTrue(task.isDone());
739 <            Thread.sleep(SHORT_DELAY_MS);
740 <            assertTrue(p1.isTerminated());
739 >            assertTrue(task.isCancelled());
740 >            assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
741 >            assertTrue(p.isTerminated());
742          }
743          finally {
744 <            joinPool(p1);
744 >            joinPool(p);
745          }
746      }
747  
# Line 659 | Line 819 | public class ScheduledExecutorTest exten
819       * invokeAny(c) throws NPE if c has null elements
820       */
821      public void testInvokeAny3() throws Exception {
822 <        final CountDownLatch latch = new CountDownLatch(1);
822 >        CountDownLatch latch = new CountDownLatch(1);
823          ExecutorService e = new ScheduledThreadPoolExecutor(2);
824 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
825 +        l.add(latchAwaitingStringTask(latch));
826 +        l.add(null);
827          try {
665            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
666            l.add(new Callable<String>() {
667                      public String call() {
668                          try {
669                              latch.await();
670                          } catch (InterruptedException ok) {}
671                          return TEST_STRING;
672                      }});
673            l.add(null);
828              e.invokeAny(l);
829              shouldThrow();
830          } catch (NullPointerException success) {
# Line 685 | Line 839 | public class ScheduledExecutorTest exten
839       */
840      public void testInvokeAny4() throws Exception {
841          ExecutorService e = new ScheduledThreadPoolExecutor(2);
842 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
843 +        l.add(new NPETask());
844          try {
689            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
690            l.add(new NPETask());
845              e.invokeAny(l);
846              shouldThrow();
847          } catch (ExecutionException success) {
# Line 703 | Line 857 | public class ScheduledExecutorTest exten
857      public void testInvokeAny5() throws Exception {
858          ExecutorService e = new ScheduledThreadPoolExecutor(2);
859          try {
860 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
860 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
861              l.add(new StringTask());
862              l.add(new StringTask());
863              String result = e.invokeAny(l);
# Line 745 | Line 899 | public class ScheduledExecutorTest exten
899       */
900      public void testInvokeAll3() throws Exception {
901          ExecutorService e = new ScheduledThreadPoolExecutor(2);
902 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
903 +        l.add(new StringTask());
904 +        l.add(null);
905          try {
749            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
750            l.add(new StringTask());
751            l.add(null);
906              e.invokeAll(l);
907              shouldThrow();
908          } catch (NullPointerException success) {
# Line 762 | Line 916 | public class ScheduledExecutorTest exten
916       */
917      public void testInvokeAll4() throws Exception {
918          ExecutorService e = new ScheduledThreadPoolExecutor(2);
919 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
920 +        l.add(new NPETask());
921 +        List<Future<String>> futures = e.invokeAll(l);
922 +        assertEquals(1, futures.size());
923          try {
924 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
767 <            l.add(new NPETask());
768 <            List<Future<String>> result = e.invokeAll(l);
769 <            assertEquals(1, result.size());
770 <            for (Future<String> future : result)
771 <                future.get();
924 >            futures.get(0).get();
925              shouldThrow();
926          } catch (ExecutionException success) {
927              assertTrue(success.getCause() instanceof NullPointerException);
# Line 783 | Line 936 | public class ScheduledExecutorTest exten
936      public void testInvokeAll5() throws Exception {
937          ExecutorService e = new ScheduledThreadPoolExecutor(2);
938          try {
939 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
939 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
940              l.add(new StringTask());
941              l.add(new StringTask());
942 <            List<Future<String>> result = e.invokeAll(l);
943 <            assertEquals(2, result.size());
944 <            for (Future<String> future : result)
942 >            List<Future<String>> futures = e.invokeAll(l);
943 >            assertEquals(2, futures.size());
944 >            for (Future<String> future : futures)
945                  assertSame(TEST_STRING, future.get());
946          } finally {
947              joinPool(e);
# Line 814 | Line 967 | public class ScheduledExecutorTest exten
967       */
968      public void testTimedInvokeAnyNullTimeUnit() throws Exception {
969          ExecutorService e = new ScheduledThreadPoolExecutor(2);
970 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
971 +        l.add(new StringTask());
972          try {
818            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
819            l.add(new StringTask());
973              e.invokeAny(l, MEDIUM_DELAY_MS, null);
974              shouldThrow();
975          } catch (NullPointerException success) {
# Line 843 | Line 996 | public class ScheduledExecutorTest exten
996       * timed invokeAny(c) throws NPE if c has null elements
997       */
998      public void testTimedInvokeAny3() throws Exception {
999 <        final CountDownLatch latch = new CountDownLatch(1);
999 >        CountDownLatch latch = new CountDownLatch(1);
1000          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1001 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
1002 +        l.add(latchAwaitingStringTask(latch));
1003 +        l.add(null);
1004          try {
849            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
850            l.add(new Callable<String>() {
851                      public String call() {
852                          try {
853                              latch.await();
854                          } catch (InterruptedException ok) {}
855                          return TEST_STRING;
856                      }});
857            l.add(null);
1005              e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1006              shouldThrow();
1007          } catch (NullPointerException success) {
# Line 869 | Line 1016 | public class ScheduledExecutorTest exten
1016       */
1017      public void testTimedInvokeAny4() throws Exception {
1018          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1019 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
1020 +        l.add(new NPETask());
1021          try {
873            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
874            l.add(new NPETask());
1022              e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1023              shouldThrow();
1024          } catch (ExecutionException success) {
# Line 887 | Line 1034 | public class ScheduledExecutorTest exten
1034      public void testTimedInvokeAny5() throws Exception {
1035          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1036          try {
1037 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1037 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1038              l.add(new StringTask());
1039              l.add(new StringTask());
1040              String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
# Line 916 | Line 1063 | public class ScheduledExecutorTest exten
1063       */
1064      public void testTimedInvokeAllNullTimeUnit() throws Exception {
1065          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1066 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
1067 +        l.add(new StringTask());
1068          try {
920            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
921            l.add(new StringTask());
1069              e.invokeAll(l, MEDIUM_DELAY_MS, null);
1070              shouldThrow();
1071          } catch (NullPointerException success) {
# Line 945 | Line 1092 | public class ScheduledExecutorTest exten
1092       */
1093      public void testTimedInvokeAll3() throws Exception {
1094          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1095 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
1096 +        l.add(new StringTask());
1097 +        l.add(null);
1098          try {
949            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
950            l.add(new StringTask());
951            l.add(null);
1099              e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1100              shouldThrow();
1101          } catch (NullPointerException success) {
# Line 962 | Line 1109 | public class ScheduledExecutorTest exten
1109       */
1110      public void testTimedInvokeAll4() throws Exception {
1111          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1112 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
1113 +        l.add(new NPETask());
1114 +        List<Future<String>> futures =
1115 +            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1116 +        assertEquals(1, futures.size());
1117          try {
1118 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
967 <            l.add(new NPETask());
968 <            List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
969 <            assertEquals(1, result.size());
970 <            for (Future<String> future : result)
971 <                future.get();
1118 >            futures.get(0).get();
1119              shouldThrow();
1120          } catch (ExecutionException success) {
1121              assertTrue(success.getCause() instanceof NullPointerException);
# Line 983 | Line 1130 | public class ScheduledExecutorTest exten
1130      public void testTimedInvokeAll5() throws Exception {
1131          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1132          try {
1133 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1133 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1134              l.add(new StringTask());
1135              l.add(new StringTask());
1136 <            List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1137 <            assertEquals(2, result.size());
1138 <            for (Future<String> future : result)
1136 >            List<Future<String>> futures =
1137 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1138 >            assertEquals(2, futures.size());
1139 >            for (Future<String> future : futures)
1140                  assertSame(TEST_STRING, future.get());
1141          } finally {
1142              joinPool(e);
# Line 1001 | Line 1149 | public class ScheduledExecutorTest exten
1149      public void testTimedInvokeAll6() throws Exception {
1150          ExecutorService e = new ScheduledThreadPoolExecutor(2);
1151          try {
1152 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1152 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1153              l.add(new StringTask());
1154              l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1155              l.add(new StringTask());
1156 <            List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1157 <            assertEquals(3, result.size());
1158 <            Iterator<Future<String>> it = result.iterator();
1156 >            List<Future<String>> futures =
1157 >                e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1158 >            assertEquals(3, futures.size());
1159 >            Iterator<Future<String>> it = futures.iterator();
1160              Future<String> f1 = it.next();
1161              Future<String> f2 = it.next();
1162              Future<String> f3 = it.next();
# Line 1021 | Line 1170 | public class ScheduledExecutorTest exten
1170          }
1171      }
1172  
1024
1173   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines