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

Comparing jsr166/src/test/tck/ScheduledExecutorSubclassTest.java (file contents):
Revision 1.45 by jsr166, Sun Oct 4 02:15:08 2015 UTC vs.
Revision 1.63 by jsr166, Wed Dec 21 02:14:06 2016 UTC

# Line 5 | Line 5
5   */
6  
7   import static java.util.concurrent.TimeUnit.MILLISECONDS;
8 + import static java.util.concurrent.TimeUnit.NANOSECONDS;
9   import static java.util.concurrent.TimeUnit.SECONDS;
10  
11   import java.util.ArrayList;
# Line 16 | Line 17 | import java.util.concurrent.Cancellation
17   import java.util.concurrent.CountDownLatch;
18   import java.util.concurrent.Delayed;
19   import java.util.concurrent.ExecutionException;
19 import java.util.concurrent.Executors;
20   import java.util.concurrent.ExecutorService;
21   import java.util.concurrent.Future;
22   import java.util.concurrent.RejectedExecutionException;
# Line 28 | Line 28 | import java.util.concurrent.ThreadFactor
28   import java.util.concurrent.ThreadPoolExecutor;
29   import java.util.concurrent.TimeoutException;
30   import java.util.concurrent.TimeUnit;
31 + import java.util.concurrent.atomic.AtomicBoolean;
32   import java.util.concurrent.atomic.AtomicInteger;
33 + import java.util.concurrent.atomic.AtomicLong;
34  
35   import junit.framework.Test;
36   import junit.framework.TestSuite;
# Line 42 | Line 44 | public class ScheduledExecutorSubclassTe
44      }
45  
46      static class CustomTask<V> implements RunnableScheduledFuture<V> {
47 <        RunnableScheduledFuture<V> task;
47 >        private final RunnableScheduledFuture<V> task;
48          volatile boolean ran;
49 <        CustomTask(RunnableScheduledFuture<V> t) { task = t; }
49 >        CustomTask(RunnableScheduledFuture<V> task) { this.task = task; }
50          public boolean isPeriodic() { return task.isPeriodic(); }
51          public void run() {
52              ran = true;
# Line 99 | Line 101 | public class ScheduledExecutorSubclassTe
101       * execute successfully executes a runnable
102       */
103      public void testExecute() throws InterruptedException {
104 <        CustomExecutor p = new CustomExecutor(1);
105 <        final CountDownLatch done = new CountDownLatch(1);
106 <        final Runnable task = new CheckedRunnable() {
107 <            public void realRun() {
108 <                done.countDown();
107 <            }};
108 <        try {
104 >        final CustomExecutor p = new CustomExecutor(1);
105 >        try (PoolCleaner cleaner = cleaner(p)) {
106 >            final CountDownLatch done = new CountDownLatch(1);
107 >            final Runnable task = new CheckedRunnable() {
108 >                public void realRun() { done.countDown(); }};
109              p.execute(task);
110 <            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
111 <        } finally {
112 <            joinPool(p);
110 >            await(done);
111          }
112      }
113  
# Line 117 | Line 115 | public class ScheduledExecutorSubclassTe
115       * delayed schedule of callable successfully executes after delay
116       */
117      public void testSchedule1() throws Exception {
120        CustomExecutor p = new CustomExecutor(1);
121        final long startTime = System.nanoTime();
118          final CountDownLatch done = new CountDownLatch(1);
119 <        try {
119 >        final CustomExecutor p = new CustomExecutor(1);
120 >        try (PoolCleaner cleaner = cleaner(p, done)) {
121 >            final long startTime = System.nanoTime();
122              Callable task = new CheckedCallable<Boolean>() {
123                  public Boolean realCall() {
124                      done.countDown();
# Line 130 | Line 128 | public class ScheduledExecutorSubclassTe
128              Future f = p.schedule(task, timeoutMillis(), MILLISECONDS);
129              assertSame(Boolean.TRUE, f.get());
130              assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
133            assertTrue(done.await(0L, MILLISECONDS));
134        } finally {
135            joinPool(p);
131          }
132      }
133  
# Line 140 | Line 135 | public class ScheduledExecutorSubclassTe
135       * delayed schedule of runnable successfully executes after delay
136       */
137      public void testSchedule3() throws Exception {
138 <        CustomExecutor p = new CustomExecutor(1);
139 <        final long startTime = System.nanoTime();
140 <        final CountDownLatch done = new CountDownLatch(1);
141 <        try {
138 >        final CustomExecutor p = new CustomExecutor(1);
139 >        try (PoolCleaner cleaner = cleaner(p)) {
140 >            final long startTime = System.nanoTime();
141 >            final CountDownLatch done = new CountDownLatch(1);
142              Runnable task = new CheckedRunnable() {
143                  public void realRun() {
144                      done.countDown();
# Line 153 | Line 148 | public class ScheduledExecutorSubclassTe
148              await(done);
149              assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
150              assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
156        } finally {
157            joinPool(p);
151          }
152      }
153  
# Line 162 | Line 155 | public class ScheduledExecutorSubclassTe
155       * scheduleAtFixedRate executes runnable after given initial delay
156       */
157      public void testSchedule4() throws InterruptedException {
158 <        CustomExecutor p = new CustomExecutor(1);
159 <        final long startTime = System.nanoTime();
160 <        final CountDownLatch done = new CountDownLatch(1);
161 <        try {
158 >        final CustomExecutor p = new CustomExecutor(1);
159 >        try (PoolCleaner cleaner = cleaner(p)) {
160 >            final long startTime = System.nanoTime();
161 >            final CountDownLatch done = new CountDownLatch(1);
162              Runnable task = new CheckedRunnable() {
163                  public void realRun() {
164                      done.countDown();
# Line 177 | Line 170 | public class ScheduledExecutorSubclassTe
170              await(done);
171              assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
172              f.cancel(true);
180        } finally {
181            joinPool(p);
173          }
174      }
175  
# Line 186 | Line 177 | public class ScheduledExecutorSubclassTe
177       * scheduleWithFixedDelay executes runnable after given initial delay
178       */
179      public void testSchedule5() throws InterruptedException {
180 <        CustomExecutor p = new CustomExecutor(1);
181 <        final long startTime = System.nanoTime();
182 <        final CountDownLatch done = new CountDownLatch(1);
183 <        try {
180 >        final CustomExecutor p = new CustomExecutor(1);
181 >        try (PoolCleaner cleaner = cleaner(p)) {
182 >            final long startTime = System.nanoTime();
183 >            final CountDownLatch done = new CountDownLatch(1);
184              Runnable task = new CheckedRunnable() {
185                  public void realRun() {
186                      done.countDown();
# Line 201 | Line 192 | public class ScheduledExecutorSubclassTe
192              await(done);
193              assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
194              f.cancel(true);
204        } finally {
205            joinPool(p);
195          }
196      }
197  
# Line 212 | Line 201 | public class ScheduledExecutorSubclassTe
201      }
202  
203      /**
204 <     * scheduleAtFixedRate executes series of tasks at given rate
204 >     * scheduleAtFixedRate executes series of tasks at given rate.
205 >     * Eventually, it must hold that:
206 >     *   cycles - 1 <= elapsedMillis/delay < cycles
207       */
208      public void testFixedRateSequence() throws InterruptedException {
209 <        CustomExecutor p = new CustomExecutor(1);
210 <        try {
209 >        final CustomExecutor p = new CustomExecutor(1);
210 >        try (PoolCleaner cleaner = cleaner(p)) {
211              for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
212 <                long startTime = System.nanoTime();
213 <                int cycles = 10;
212 >                final long startTime = System.nanoTime();
213 >                final int cycles = 8;
214                  final CountDownLatch done = new CountDownLatch(cycles);
215 <                Runnable task = new CheckedRunnable() {
215 >                final Runnable task = new CheckedRunnable() {
216                      public void realRun() { done.countDown(); }};
217 <                ScheduledFuture h =
217 >                final ScheduledFuture periodicTask =
218                      p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS);
219 <                done.await();
220 <                h.cancel(true);
221 <                double normalizedTime =
222 <                    (double) millisElapsedSince(startTime) / delay;
223 <                if (normalizedTime >= cycles - 1 &&
224 <                    normalizedTime <= cycles)
219 >                final int totalDelayMillis = (cycles - 1) * delay;
220 >                await(done, totalDelayMillis + LONG_DELAY_MS);
221 >                periodicTask.cancel(true);
222 >                final long elapsedMillis = millisElapsedSince(startTime);
223 >                assertTrue(elapsedMillis >= totalDelayMillis);
224 >                if (elapsedMillis <= cycles * delay)
225                      return;
226 +                // else retry with longer delay
227              }
228 <            throw new AssertionError("unexpected execution rate");
237 <        } finally {
238 <            joinPool(p);
228 >            fail("unexpected execution rate");
229          }
230      }
231  
232      /**
233 <     * scheduleWithFixedDelay executes series of tasks with given period
233 >     * scheduleWithFixedDelay executes series of tasks with given period.
234 >     * Eventually, it must hold that each task starts at least delay and at
235 >     * most 2 * delay after the termination of the previous task.
236       */
237      public void testFixedDelaySequence() throws InterruptedException {
238 <        CustomExecutor p = new CustomExecutor(1);
239 <        try {
238 >        final CustomExecutor p = new CustomExecutor(1);
239 >        try (PoolCleaner cleaner = cleaner(p)) {
240              for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
241 <                long startTime = System.nanoTime();
242 <                int cycles = 10;
241 >                final long startTime = System.nanoTime();
242 >                final AtomicLong previous = new AtomicLong(startTime);
243 >                final AtomicBoolean tryLongerDelay = new AtomicBoolean(false);
244 >                final int cycles = 8;
245                  final CountDownLatch done = new CountDownLatch(cycles);
246 <                Runnable task = new CheckedRunnable() {
247 <                    public void realRun() { done.countDown(); }};
248 <                ScheduledFuture h =
246 >                final int d = delay;
247 >                final Runnable task = new CheckedRunnable() {
248 >                    public void realRun() {
249 >                        long now = System.nanoTime();
250 >                        long elapsedMillis
251 >                            = NANOSECONDS.toMillis(now - previous.get());
252 >                        if (done.getCount() == cycles) { // first execution
253 >                            if (elapsedMillis >= d)
254 >                                tryLongerDelay.set(true);
255 >                        } else {
256 >                            assertTrue(elapsedMillis >= d);
257 >                            if (elapsedMillis >= 2 * d)
258 >                                tryLongerDelay.set(true);
259 >                        }
260 >                        previous.set(now);
261 >                        done.countDown();
262 >                    }};
263 >                final ScheduledFuture periodicTask =
264                      p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS);
265 <                done.await();
266 <                h.cancel(true);
267 <                double normalizedTime =
268 <                    (double) millisElapsedSince(startTime) / delay;
269 <                if (normalizedTime >= cycles - 1 &&
270 <                    normalizedTime <= cycles)
265 >                final int totalDelayMillis = (cycles - 1) * delay;
266 >                await(done, totalDelayMillis + cycles * LONG_DELAY_MS);
267 >                periodicTask.cancel(true);
268 >                final long elapsedMillis = millisElapsedSince(startTime);
269 >                assertTrue(elapsedMillis >= totalDelayMillis);
270 >                if (!tryLongerDelay.get())
271                      return;
272 +                // else retry with longer delay
273              }
274 <            throw new AssertionError("unexpected execution rate");
265 <        } finally {
266 <            joinPool(p);
274 >            fail("unexpected execution rate");
275          }
276      }
277  
# Line 271 | Line 279 | public class ScheduledExecutorSubclassTe
279       * execute(null) throws NPE
280       */
281      public void testExecuteNull() throws InterruptedException {
282 <        CustomExecutor se = new CustomExecutor(1);
283 <        try {
284 <            se.execute(null);
285 <            shouldThrow();
286 <        } catch (NullPointerException success) {}
287 <        joinPool(se);
282 >        final CustomExecutor p = new CustomExecutor(1);
283 >        try (PoolCleaner cleaner = cleaner(p)) {
284 >            try {
285 >                p.execute(null);
286 >                shouldThrow();
287 >            } catch (NullPointerException success) {}
288 >        }
289      }
290  
291      /**
292       * schedule(null) throws NPE
293       */
294      public void testScheduleNull() throws InterruptedException {
295 <        CustomExecutor se = new CustomExecutor(1);
296 <        try {
297 <            TrackedCallable callable = null;
298 <            Future f = se.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
299 <            shouldThrow();
300 <        } catch (NullPointerException success) {}
301 <        joinPool(se);
295 >        final CustomExecutor p = new CustomExecutor(1);
296 >        try (PoolCleaner cleaner = cleaner(p)) {
297 >            try {
298 >                TrackedCallable callable = null;
299 >                Future f = p.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
300 >                shouldThrow();
301 >            } catch (NullPointerException success) {}
302 >        }
303      }
304  
305      /**
306       * execute throws RejectedExecutionException if shutdown
307       */
308      public void testSchedule1_RejectedExecutionException() {
309 <        CustomExecutor se = new CustomExecutor(1);
310 <        try {
311 <            se.shutdown();
312 <            se.schedule(new NoOpRunnable(),
313 <                        MEDIUM_DELAY_MS, MILLISECONDS);
314 <            shouldThrow();
315 <        } catch (RejectedExecutionException success) {
316 <        } catch (SecurityException ok) {
309 >        final CustomExecutor p = new CustomExecutor(1);
310 >        try (PoolCleaner cleaner = cleaner(p)) {
311 >            try {
312 >                p.shutdown();
313 >                p.schedule(new NoOpRunnable(),
314 >                           MEDIUM_DELAY_MS, MILLISECONDS);
315 >                shouldThrow();
316 >            } catch (RejectedExecutionException success) {
317 >            } catch (SecurityException ok) {}
318          }
308
309        joinPool(se);
319      }
320  
321      /**
322       * schedule throws RejectedExecutionException if shutdown
323       */
324      public void testSchedule2_RejectedExecutionException() {
325 <        CustomExecutor se = new CustomExecutor(1);
326 <        try {
327 <            se.shutdown();
328 <            se.schedule(new NoOpCallable(),
329 <                        MEDIUM_DELAY_MS, MILLISECONDS);
330 <            shouldThrow();
331 <        } catch (RejectedExecutionException success) {
332 <        } catch (SecurityException ok) {
325 >        final CustomExecutor p = new CustomExecutor(1);
326 >        try (PoolCleaner cleaner = cleaner(p)) {
327 >            try {
328 >                p.shutdown();
329 >                p.schedule(new NoOpCallable(),
330 >                           MEDIUM_DELAY_MS, MILLISECONDS);
331 >                shouldThrow();
332 >            } catch (RejectedExecutionException success) {
333 >            } catch (SecurityException ok) {}
334          }
325        joinPool(se);
335      }
336  
337      /**
338       * schedule callable throws RejectedExecutionException if shutdown
339       */
340      public void testSchedule3_RejectedExecutionException() {
341 <        CustomExecutor se = new CustomExecutor(1);
342 <        try {
343 <            se.shutdown();
344 <            se.schedule(new NoOpCallable(),
345 <                        MEDIUM_DELAY_MS, MILLISECONDS);
346 <            shouldThrow();
347 <        } catch (RejectedExecutionException success) {
348 <        } catch (SecurityException ok) {
341 >        final CustomExecutor p = new CustomExecutor(1);
342 >        try (PoolCleaner cleaner = cleaner(p)) {
343 >            try {
344 >                p.shutdown();
345 >                p.schedule(new NoOpCallable(),
346 >                           MEDIUM_DELAY_MS, MILLISECONDS);
347 >                shouldThrow();
348 >            } catch (RejectedExecutionException success) {
349 >            } catch (SecurityException ok) {}
350          }
341        joinPool(se);
351      }
352  
353      /**
354       * scheduleAtFixedRate throws RejectedExecutionException if shutdown
355       */
356      public void testScheduleAtFixedRate1_RejectedExecutionException() {
357 <        CustomExecutor se = new CustomExecutor(1);
358 <        try {
359 <            se.shutdown();
360 <            se.scheduleAtFixedRate(new NoOpRunnable(),
361 <                                   MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
362 <            shouldThrow();
363 <        } catch (RejectedExecutionException success) {
364 <        } catch (SecurityException ok) {
357 >        final CustomExecutor p = new CustomExecutor(1);
358 >        try (PoolCleaner cleaner = cleaner(p)) {
359 >            try {
360 >                p.shutdown();
361 >                p.scheduleAtFixedRate(new NoOpRunnable(),
362 >                                      MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
363 >                shouldThrow();
364 >            } catch (RejectedExecutionException success) {
365 >            } catch (SecurityException ok) {}
366          }
357        joinPool(se);
367      }
368  
369      /**
370       * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
371       */
372      public void testScheduleWithFixedDelay1_RejectedExecutionException() {
373 <        CustomExecutor se = new CustomExecutor(1);
374 <        try {
375 <            se.shutdown();
376 <            se.scheduleWithFixedDelay(new NoOpRunnable(),
377 <                                      MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
378 <            shouldThrow();
379 <        } catch (RejectedExecutionException success) {
380 <        } catch (SecurityException ok) {
373 >        final CustomExecutor p = new CustomExecutor(1);
374 >        try (PoolCleaner cleaner = cleaner(p)) {
375 >            try {
376 >                p.shutdown();
377 >                p.scheduleWithFixedDelay(new NoOpRunnable(),
378 >                                         MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
379 >                shouldThrow();
380 >            } catch (RejectedExecutionException success) {
381 >            } catch (SecurityException ok) {}
382          }
373        joinPool(se);
383      }
384  
385      /**
# Line 378 | Line 387 | public class ScheduledExecutorSubclassTe
387       * thread becomes active
388       */
389      public void testGetActiveCount() throws InterruptedException {
381        final ThreadPoolExecutor p = new CustomExecutor(2);
382        final CountDownLatch threadStarted = new CountDownLatch(1);
390          final CountDownLatch done = new CountDownLatch(1);
391 <        try {
391 >        final ThreadPoolExecutor p = new CustomExecutor(2);
392 >        try (PoolCleaner cleaner = cleaner(p, done)) {
393 >            final CountDownLatch threadStarted = new CountDownLatch(1);
394              assertEquals(0, p.getActiveCount());
395              p.execute(new CheckedRunnable() {
396                  public void realRun() throws InterruptedException {
397                      threadStarted.countDown();
398                      assertEquals(1, p.getActiveCount());
399 <                    done.await();
399 >                    await(done);
400                  }});
401 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
401 >            await(threadStarted);
402              assertEquals(1, p.getActiveCount());
394        } finally {
395            done.countDown();
396            joinPool(p);
403          }
404      }
405  
# Line 403 | Line 409 | public class ScheduledExecutorSubclassTe
409       */
410      public void testGetCompletedTaskCount() throws InterruptedException {
411          final ThreadPoolExecutor p = new CustomExecutor(2);
412 <        final CountDownLatch threadStarted = new CountDownLatch(1);
413 <        final CountDownLatch threadProceed = new CountDownLatch(1);
414 <        final CountDownLatch threadDone = new CountDownLatch(1);
415 <        try {
412 >        try (PoolCleaner cleaner = cleaner(p)) {
413 >            final CountDownLatch threadStarted = new CountDownLatch(1);
414 >            final CountDownLatch threadProceed = new CountDownLatch(1);
415 >            final CountDownLatch threadDone = new CountDownLatch(1);
416              assertEquals(0, p.getCompletedTaskCount());
417              p.execute(new CheckedRunnable() {
418                  public void realRun() throws InterruptedException {
# Line 425 | Line 431 | public class ScheduledExecutorSubclassTe
431                      fail("timed out");
432                  Thread.yield();
433              }
428        } finally {
429            joinPool(p);
434          }
435      }
436  
# Line 434 | Line 438 | public class ScheduledExecutorSubclassTe
438       * getCorePoolSize returns size given in constructor if not otherwise set
439       */
440      public void testGetCorePoolSize() {
441 <        CustomExecutor p = new CustomExecutor(1);
442 <        assertEquals(1, p.getCorePoolSize());
443 <        joinPool(p);
441 >        final CustomExecutor p = new CustomExecutor(1);
442 >        try (PoolCleaner cleaner = cleaner(p)) {
443 >            assertEquals(1, p.getCorePoolSize());
444 >        }
445      }
446  
447      /**
# Line 445 | Line 450 | public class ScheduledExecutorSubclassTe
450       */
451      public void testGetLargestPoolSize() throws InterruptedException {
452          final int THREADS = 3;
448        final ThreadPoolExecutor p = new CustomExecutor(THREADS);
449        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
453          final CountDownLatch done = new CountDownLatch(1);
454 <        try {
454 >        final ThreadPoolExecutor p = new CustomExecutor(THREADS);
455 >        try (PoolCleaner cleaner = cleaner(p, done)) {
456 >            final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
457              assertEquals(0, p.getLargestPoolSize());
458              for (int i = 0; i < THREADS; i++)
459                  p.execute(new CheckedRunnable() {
460                      public void realRun() throws InterruptedException {
461                          threadsStarted.countDown();
462 <                        done.await();
462 >                        await(done);
463                          assertEquals(THREADS, p.getLargestPoolSize());
464                      }});
465 <            assertTrue(threadsStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
461 <            assertEquals(THREADS, p.getLargestPoolSize());
462 <        } finally {
463 <            done.countDown();
464 <            joinPool(p);
465 >            await(threadsStarted);
466              assertEquals(THREADS, p.getLargestPoolSize());
467          }
468 +        assertEquals(THREADS, p.getLargestPoolSize());
469      }
470  
471      /**
# Line 471 | Line 473 | public class ScheduledExecutorSubclassTe
473       * become active
474       */
475      public void testGetPoolSize() throws InterruptedException {
474        final ThreadPoolExecutor p = new CustomExecutor(1);
475        final CountDownLatch threadStarted = new CountDownLatch(1);
476          final CountDownLatch done = new CountDownLatch(1);
477 <        try {
477 >        final ThreadPoolExecutor p = new CustomExecutor(1);
478 >        try (PoolCleaner cleaner = cleaner(p, done)) {
479 >            final CountDownLatch threadStarted = new CountDownLatch(1);
480              assertEquals(0, p.getPoolSize());
481              p.execute(new CheckedRunnable() {
482                  public void realRun() throws InterruptedException {
483                      threadStarted.countDown();
484                      assertEquals(1, p.getPoolSize());
485 <                    done.await();
485 >                    await(done);
486                  }});
487 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
487 >            await(threadStarted);
488              assertEquals(1, p.getPoolSize());
487        } finally {
488            done.countDown();
489            joinPool(p);
489          }
490      }
491  
# Line 495 | Line 494 | public class ScheduledExecutorSubclassTe
494       * submitted
495       */
496      public void testGetTaskCount() throws InterruptedException {
497 <        final ThreadPoolExecutor p = new CustomExecutor(1);
499 <        final CountDownLatch threadStarted = new CountDownLatch(1);
497 >        final int TASKS = 3;
498          final CountDownLatch done = new CountDownLatch(1);
499 <        final int TASKS = 5;
500 <        try {
499 >        final ThreadPoolExecutor p = new CustomExecutor(1);
500 >        try (PoolCleaner cleaner = cleaner(p, done)) {
501 >            final CountDownLatch threadStarted = new CountDownLatch(1);
502              assertEquals(0, p.getTaskCount());
503 <            for (int i = 0; i < TASKS; i++)
503 >            assertEquals(0, p.getCompletedTaskCount());
504 >            p.execute(new CheckedRunnable() {
505 >                public void realRun() throws InterruptedException {
506 >                    threadStarted.countDown();
507 >                    await(done);
508 >                }});
509 >            await(threadStarted);
510 >            assertEquals(1, p.getTaskCount());
511 >            assertEquals(0, p.getCompletedTaskCount());
512 >            for (int i = 0; i < TASKS; i++) {
513 >                assertEquals(1 + i, p.getTaskCount());
514                  p.execute(new CheckedRunnable() {
515                      public void realRun() throws InterruptedException {
516                          threadStarted.countDown();
517 <                        done.await();
517 >                        assertEquals(1 + TASKS, p.getTaskCount());
518 >                        await(done);
519                      }});
520 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
521 <            assertEquals(TASKS, p.getTaskCount());
522 <        } finally {
513 <            done.countDown();
514 <            joinPool(p);
520 >            }
521 >            assertEquals(1 + TASKS, p.getTaskCount());
522 >            assertEquals(0, p.getCompletedTaskCount());
523          }
524 +        assertEquals(1 + TASKS, p.getTaskCount());
525 +        assertEquals(1 + TASKS, p.getCompletedTaskCount());
526      }
527  
528      /**
529       * getThreadFactory returns factory in constructor if not set
530       */
531      public void testGetThreadFactory() {
532 <        ThreadFactory tf = new SimpleThreadFactory();
533 <        CustomExecutor p = new CustomExecutor(1, tf);
534 <        assertSame(tf, p.getThreadFactory());
535 <        joinPool(p);
532 >        final ThreadFactory threadFactory = new SimpleThreadFactory();
533 >        final CustomExecutor p = new CustomExecutor(1, threadFactory);
534 >        try (PoolCleaner cleaner = cleaner(p)) {
535 >            assertSame(threadFactory, p.getThreadFactory());
536 >        }
537      }
538  
539      /**
540       * setThreadFactory sets the thread factory returned by getThreadFactory
541       */
542      public void testSetThreadFactory() {
543 <        ThreadFactory tf = new SimpleThreadFactory();
544 <        CustomExecutor p = new CustomExecutor(1);
545 <        p.setThreadFactory(tf);
546 <        assertSame(tf, p.getThreadFactory());
547 <        joinPool(p);
543 >        final ThreadFactory threadFactory = new SimpleThreadFactory();
544 >        final CustomExecutor p = new CustomExecutor(1);
545 >        try (PoolCleaner cleaner = cleaner(p)) {
546 >            p.setThreadFactory(threadFactory);
547 >            assertSame(threadFactory, p.getThreadFactory());
548 >        }
549      }
550  
551      /**
552       * setThreadFactory(null) throws NPE
553       */
554      public void testSetThreadFactoryNull() {
555 <        CustomExecutor p = new CustomExecutor(1);
556 <        try {
557 <            p.setThreadFactory(null);
558 <            shouldThrow();
559 <        } catch (NullPointerException success) {
560 <        } finally {
549 <            joinPool(p);
555 >        final CustomExecutor p = new CustomExecutor(1);
556 >        try (PoolCleaner cleaner = cleaner(p)) {
557 >            try {
558 >                p.setThreadFactory(null);
559 >                shouldThrow();
560 >            } catch (NullPointerException success) {}
561          }
562      }
563  
# Line 554 | Line 565 | public class ScheduledExecutorSubclassTe
565       * isShutdown is false before shutdown, true after
566       */
567      public void testIsShutdown() {
568 <        CustomExecutor p = new CustomExecutor(1);
569 <        try {
568 >        final CustomExecutor p = new CustomExecutor(1);
569 >        try (PoolCleaner cleaner = cleaner(p)) {
570              assertFalse(p.isShutdown());
560        }
561        finally {
571              try { p.shutdown(); } catch (SecurityException ok) { return; }
572 +            assertTrue(p.isShutdown());
573          }
564        assertTrue(p.isShutdown());
574      }
575  
576      /**
577       * isTerminated is false before termination, true after
578       */
579      public void testIsTerminated() throws InterruptedException {
571        final ThreadPoolExecutor p = new CustomExecutor(1);
572        final CountDownLatch threadStarted = new CountDownLatch(1);
580          final CountDownLatch done = new CountDownLatch(1);
581 <        assertFalse(p.isTerminated());
582 <        try {
581 >        final ThreadPoolExecutor p = new CustomExecutor(1);
582 >        try (PoolCleaner cleaner = cleaner(p)) {
583 >            final CountDownLatch threadStarted = new CountDownLatch(1);
584              p.execute(new CheckedRunnable() {
585                  public void realRun() throws InterruptedException {
586                      assertFalse(p.isTerminated());
587                      threadStarted.countDown();
588 <                    done.await();
588 >                    await(done);
589                  }});
590 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
590 >            await(threadStarted);
591 >            assertFalse(p.isTerminated());
592              assertFalse(p.isTerminating());
593              done.countDown();
585        } finally {
594              try { p.shutdown(); } catch (SecurityException ok) { return; }
595 +            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
596 +            assertTrue(p.isTerminated());
597          }
588        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
589        assertTrue(p.isTerminated());
598      }
599  
600      /**
601       * isTerminating is not true when running or when terminated
602       */
603      public void testIsTerminating() throws InterruptedException {
596        final ThreadPoolExecutor p = new CustomExecutor(1);
597        final CountDownLatch threadStarted = new CountDownLatch(1);
604          final CountDownLatch done = new CountDownLatch(1);
605 <        try {
605 >        final ThreadPoolExecutor p = new CustomExecutor(1);
606 >        try (PoolCleaner cleaner = cleaner(p)) {
607 >            final CountDownLatch threadStarted = new CountDownLatch(1);
608              assertFalse(p.isTerminating());
609              p.execute(new CheckedRunnable() {
610                  public void realRun() throws InterruptedException {
611                      assertFalse(p.isTerminating());
612                      threadStarted.countDown();
613 <                    done.await();
613 >                    await(done);
614                  }});
615 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
615 >            await(threadStarted);
616              assertFalse(p.isTerminating());
617              done.countDown();
610        } finally {
618              try { p.shutdown(); } catch (SecurityException ok) { return; }
619 +            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
620 +            assertTrue(p.isTerminated());
621 +            assertFalse(p.isTerminating());
622          }
613        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
614        assertTrue(p.isTerminated());
615        assertFalse(p.isTerminating());
623      }
624  
625      /**
626       * getQueue returns the work queue, which contains queued tasks
627       */
628      public void testGetQueue() throws InterruptedException {
622        ScheduledThreadPoolExecutor p = new CustomExecutor(1);
623        final CountDownLatch threadStarted = new CountDownLatch(1);
629          final CountDownLatch done = new CountDownLatch(1);
630 <        try {
630 >        final ScheduledThreadPoolExecutor p = new CustomExecutor(1);
631 >        try (PoolCleaner cleaner = cleaner(p, done)) {
632 >            final CountDownLatch threadStarted = new CountDownLatch(1);
633              ScheduledFuture[] tasks = new ScheduledFuture[5];
634              for (int i = 0; i < tasks.length; i++) {
635                  Runnable r = new CheckedRunnable() {
636                      public void realRun() throws InterruptedException {
637                          threadStarted.countDown();
638 <                        done.await();
638 >                        await(done);
639                      }};
640                  tasks[i] = p.schedule(r, 1, MILLISECONDS);
641              }
642 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
642 >            await(threadStarted);
643              BlockingQueue<Runnable> q = p.getQueue();
644              assertTrue(q.contains(tasks[tasks.length - 1]));
645              assertFalse(q.contains(tasks[0]));
639        } finally {
640            done.countDown();
641            joinPool(p);
646          }
647      }
648  
# Line 646 | Line 650 | public class ScheduledExecutorSubclassTe
650       * remove(task) removes queued task, and fails to remove active task
651       */
652      public void testRemove() throws InterruptedException {
649        final ScheduledThreadPoolExecutor p = new CustomExecutor(1);
650        ScheduledFuture[] tasks = new ScheduledFuture[5];
651        final CountDownLatch threadStarted = new CountDownLatch(1);
653          final CountDownLatch done = new CountDownLatch(1);
654 <        try {
654 >        final ScheduledThreadPoolExecutor p = new CustomExecutor(1);
655 >        try (PoolCleaner cleaner = cleaner(p, done)) {
656 >            ScheduledFuture[] tasks = new ScheduledFuture[5];
657 >            final CountDownLatch threadStarted = new CountDownLatch(1);
658              for (int i = 0; i < tasks.length; i++) {
659                  Runnable r = new CheckedRunnable() {
660                      public void realRun() throws InterruptedException {
661                          threadStarted.countDown();
662 <                        done.await();
662 >                        await(done);
663                      }};
664                  tasks[i] = p.schedule(r, 1, MILLISECONDS);
665              }
666 <            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
666 >            await(threadStarted);
667              BlockingQueue<Runnable> q = p.getQueue();
668              assertFalse(p.remove((Runnable)tasks[0]));
669              assertTrue(q.contains((Runnable)tasks[4]));
# Line 670 | Line 674 | public class ScheduledExecutorSubclassTe
674              assertTrue(q.contains((Runnable)tasks[3]));
675              assertTrue(p.remove((Runnable)tasks[3]));
676              assertFalse(q.contains((Runnable)tasks[3]));
673        } finally {
674            done.countDown();
675            joinPool(p);
677          }
678      }
679  
# Line 680 | Line 681 | public class ScheduledExecutorSubclassTe
681       * purge removes cancelled tasks from the queue
682       */
683      public void testPurge() throws InterruptedException {
684 <        CustomExecutor p = new CustomExecutor(1);
685 <        ScheduledFuture[] tasks = new ScheduledFuture[5];
686 <        for (int i = 0; i < tasks.length; i++)
687 <            tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
688 <                                  LONG_DELAY_MS, MILLISECONDS);
689 <        try {
684 >        final ScheduledFuture[] tasks = new ScheduledFuture[5];
685 >        final Runnable releaser = new Runnable() { public void run() {
686 >            for (ScheduledFuture task : tasks)
687 >                if (task != null) task.cancel(true); }};
688 >        final CustomExecutor p = new CustomExecutor(1);
689 >        try (PoolCleaner cleaner = cleaner(p, releaser)) {
690 >            for (int i = 0; i < tasks.length; i++)
691 >                tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
692 >                                      LONG_DELAY_MS, MILLISECONDS);
693              int max = tasks.length;
694              if (tasks[4].cancel(true)) --max;
695              if (tasks[3].cancel(true)) --max;
# Line 697 | Line 701 | public class ScheduledExecutorSubclassTe
701                  long count = p.getTaskCount();
702                  if (count == max)
703                      return;
704 <            } while (millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
704 >            } while (millisElapsedSince(startTime) < LONG_DELAY_MS);
705              fail("Purge failed to remove cancelled tasks");
702        } finally {
703            for (ScheduledFuture task : tasks)
704                task.cancel(true);
705            joinPool(p);
706          }
707      }
708  
# Line 715 | Line 715 | public class ScheduledExecutorSubclassTe
715          final int count = 5;
716          final AtomicInteger ran = new AtomicInteger(0);
717          final CustomExecutor p = new CustomExecutor(poolSize);
718 <        CountDownLatch threadsStarted = new CountDownLatch(poolSize);
718 >        final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
719          Runnable waiter = new CheckedRunnable() { public void realRun() {
720              threadsStarted.countDown();
721              try {
# Line 725 | Line 725 | public class ScheduledExecutorSubclassTe
725          }};
726          for (int i = 0; i < count; i++)
727              p.execute(waiter);
728 <        assertTrue(threadsStarted.await(LONG_DELAY_MS, MILLISECONDS));
728 >        await(threadsStarted);
729          assertEquals(poolSize, p.getActiveCount());
730          assertEquals(0, p.getCompletedTaskCount());
731          final List<Runnable> queuedTasks;
# Line 748 | Line 748 | public class ScheduledExecutorSubclassTe
748       * and those tasks are drained from the queue
749       */
750      public void testShutdownNow_delayedTasks() throws InterruptedException {
751 <        CustomExecutor p = new CustomExecutor(1);
751 >        final CustomExecutor p = new CustomExecutor(1);
752          List<ScheduledFuture> tasks = new ArrayList<>();
753          for (int i = 0; i < 3; i++) {
754              Runnable r = new NoOpRunnable();
# Line 875 | Line 875 | public class ScheduledExecutorSubclassTe
875       * completed submit of callable returns result
876       */
877      public void testSubmitCallable() throws Exception {
878 <        ExecutorService e = new CustomExecutor(2);
879 <        try {
878 >        final ExecutorService e = new CustomExecutor(2);
879 >        try (PoolCleaner cleaner = cleaner(e)) {
880              Future<String> future = e.submit(new StringTask());
881              String result = future.get();
882              assertSame(TEST_STRING, result);
883        } finally {
884            joinPool(e);
883          }
884      }
885  
# Line 889 | Line 887 | public class ScheduledExecutorSubclassTe
887       * completed submit of runnable returns successfully
888       */
889      public void testSubmitRunnable() throws Exception {
890 <        ExecutorService e = new CustomExecutor(2);
891 <        try {
890 >        final ExecutorService e = new CustomExecutor(2);
891 >        try (PoolCleaner cleaner = cleaner(e)) {
892              Future<?> future = e.submit(new NoOpRunnable());
893              future.get();
894              assertTrue(future.isDone());
897        } finally {
898            joinPool(e);
895          }
896      }
897  
# Line 903 | Line 899 | public class ScheduledExecutorSubclassTe
899       * completed submit of (runnable, result) returns result
900       */
901      public void testSubmitRunnable2() throws Exception {
902 <        ExecutorService e = new CustomExecutor(2);
903 <        try {
902 >        final ExecutorService e = new CustomExecutor(2);
903 >        try (PoolCleaner cleaner = cleaner(e)) {
904              Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
905              String result = future.get();
906              assertSame(TEST_STRING, result);
911        } finally {
912            joinPool(e);
907          }
908      }
909  
# Line 917 | Line 911 | public class ScheduledExecutorSubclassTe
911       * invokeAny(null) throws NPE
912       */
913      public void testInvokeAny1() throws Exception {
914 <        ExecutorService e = new CustomExecutor(2);
915 <        try {
916 <            e.invokeAny(null);
917 <            shouldThrow();
918 <        } catch (NullPointerException success) {
919 <        } finally {
926 <            joinPool(e);
914 >        final ExecutorService e = new CustomExecutor(2);
915 >        try (PoolCleaner cleaner = cleaner(e)) {
916 >            try {
917 >                e.invokeAny(null);
918 >                shouldThrow();
919 >            } catch (NullPointerException success) {}
920          }
921      }
922  
# Line 931 | Line 924 | public class ScheduledExecutorSubclassTe
924       * invokeAny(empty collection) throws IAE
925       */
926      public void testInvokeAny2() throws Exception {
927 <        ExecutorService e = new CustomExecutor(2);
928 <        try {
929 <            e.invokeAny(new ArrayList<Callable<String>>());
930 <            shouldThrow();
931 <        } catch (IllegalArgumentException success) {
932 <        } finally {
940 <            joinPool(e);
927 >        final ExecutorService e = new CustomExecutor(2);
928 >        try (PoolCleaner cleaner = cleaner(e)) {
929 >            try {
930 >                e.invokeAny(new ArrayList<Callable<String>>());
931 >                shouldThrow();
932 >            } catch (IllegalArgumentException success) {}
933          }
934      }
935  
# Line 945 | Line 937 | public class ScheduledExecutorSubclassTe
937       * invokeAny(c) throws NPE if c has null elements
938       */
939      public void testInvokeAny3() throws Exception {
940 <        CountDownLatch latch = new CountDownLatch(1);
941 <        ExecutorService e = new CustomExecutor(2);
942 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
943 <        l.add(latchAwaitingStringTask(latch));
944 <        l.add(null);
945 <        try {
946 <            e.invokeAny(l);
947 <            shouldThrow();
948 <        } catch (NullPointerException success) {
949 <        } finally {
940 >        final CountDownLatch latch = new CountDownLatch(1);
941 >        final ExecutorService e = new CustomExecutor(2);
942 >        try (PoolCleaner cleaner = cleaner(e)) {
943 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
944 >            l.add(latchAwaitingStringTask(latch));
945 >            l.add(null);
946 >            try {
947 >                e.invokeAny(l);
948 >                shouldThrow();
949 >            } catch (NullPointerException success) {}
950              latch.countDown();
959            joinPool(e);
951          }
952      }
953  
# Line 964 | Line 955 | public class ScheduledExecutorSubclassTe
955       * invokeAny(c) throws ExecutionException if no task completes
956       */
957      public void testInvokeAny4() throws Exception {
958 <        ExecutorService e = new CustomExecutor(2);
959 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
960 <        l.add(new NPETask());
961 <        try {
962 <            e.invokeAny(l);
963 <            shouldThrow();
964 <        } catch (ExecutionException success) {
965 <            assertTrue(success.getCause() instanceof NullPointerException);
966 <        } finally {
967 <            joinPool(e);
958 >        final ExecutorService e = new CustomExecutor(2);
959 >        try (PoolCleaner cleaner = cleaner(e)) {
960 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
961 >            l.add(new NPETask());
962 >            try {
963 >                e.invokeAny(l);
964 >                shouldThrow();
965 >            } catch (ExecutionException success) {
966 >                assertTrue(success.getCause() instanceof NullPointerException);
967 >            }
968          }
969      }
970  
# Line 981 | Line 972 | public class ScheduledExecutorSubclassTe
972       * invokeAny(c) returns result of some task
973       */
974      public void testInvokeAny5() throws Exception {
975 <        ExecutorService e = new CustomExecutor(2);
976 <        try {
975 >        final ExecutorService e = new CustomExecutor(2);
976 >        try (PoolCleaner cleaner = cleaner(e)) {
977              List<Callable<String>> l = new ArrayList<Callable<String>>();
978              l.add(new StringTask());
979              l.add(new StringTask());
980              String result = e.invokeAny(l);
981              assertSame(TEST_STRING, result);
991        } finally {
992            joinPool(e);
982          }
983      }
984  
# Line 997 | Line 986 | public class ScheduledExecutorSubclassTe
986       * invokeAll(null) throws NPE
987       */
988      public void testInvokeAll1() throws Exception {
989 <        ExecutorService e = new CustomExecutor(2);
990 <        try {
991 <            e.invokeAll(null);
992 <            shouldThrow();
993 <        } catch (NullPointerException success) {
994 <        } finally {
1006 <            joinPool(e);
989 >        final ExecutorService e = new CustomExecutor(2);
990 >        try (PoolCleaner cleaner = cleaner(e)) {
991 >            try {
992 >                e.invokeAll(null);
993 >                shouldThrow();
994 >            } catch (NullPointerException success) {}
995          }
996      }
997  
# Line 1011 | Line 999 | public class ScheduledExecutorSubclassTe
999       * invokeAll(empty collection) returns empty collection
1000       */
1001      public void testInvokeAll2() throws Exception {
1002 <        ExecutorService e = new CustomExecutor(2);
1003 <        try {
1002 >        final ExecutorService e = new CustomExecutor(2);
1003 >        try (PoolCleaner cleaner = cleaner(e)) {
1004              List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1005              assertTrue(r.isEmpty());
1018        } finally {
1019            joinPool(e);
1006          }
1007      }
1008  
# Line 1024 | Line 1010 | public class ScheduledExecutorSubclassTe
1010       * invokeAll(c) throws NPE if c has null elements
1011       */
1012      public void testInvokeAll3() throws Exception {
1013 <        ExecutorService e = new CustomExecutor(2);
1014 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1015 <        l.add(new StringTask());
1016 <        l.add(null);
1017 <        try {
1018 <            e.invokeAll(l);
1019 <            shouldThrow();
1020 <        } catch (NullPointerException success) {
1021 <        } finally {
1036 <            joinPool(e);
1013 >        final ExecutorService e = new CustomExecutor(2);
1014 >        try (PoolCleaner cleaner = cleaner(e)) {
1015 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1016 >            l.add(new StringTask());
1017 >            l.add(null);
1018 >            try {
1019 >                e.invokeAll(l);
1020 >                shouldThrow();
1021 >            } catch (NullPointerException success) {}
1022          }
1023      }
1024  
# Line 1041 | Line 1026 | public class ScheduledExecutorSubclassTe
1026       * get of invokeAll(c) throws exception on failed task
1027       */
1028      public void testInvokeAll4() throws Exception {
1029 <        ExecutorService e = new CustomExecutor(2);
1030 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1031 <        l.add(new NPETask());
1032 <        List<Future<String>> futures = e.invokeAll(l);
1033 <        assertEquals(1, futures.size());
1034 <        try {
1035 <            futures.get(0).get();
1036 <            shouldThrow();
1037 <        } catch (ExecutionException success) {
1038 <            assertTrue(success.getCause() instanceof NullPointerException);
1039 <        } finally {
1040 <            joinPool(e);
1029 >        final ExecutorService e = new CustomExecutor(2);
1030 >        try (PoolCleaner cleaner = cleaner(e)) {
1031 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1032 >            l.add(new NPETask());
1033 >            List<Future<String>> futures = e.invokeAll(l);
1034 >            assertEquals(1, futures.size());
1035 >            try {
1036 >                futures.get(0).get();
1037 >                shouldThrow();
1038 >            } catch (ExecutionException success) {
1039 >                assertTrue(success.getCause() instanceof NullPointerException);
1040 >            }
1041          }
1042      }
1043  
# Line 1060 | Line 1045 | public class ScheduledExecutorSubclassTe
1045       * invokeAll(c) returns results of all completed tasks
1046       */
1047      public void testInvokeAll5() throws Exception {
1048 <        ExecutorService e = new CustomExecutor(2);
1049 <        try {
1048 >        final ExecutorService e = new CustomExecutor(2);
1049 >        try (PoolCleaner cleaner = cleaner(e)) {
1050              List<Callable<String>> l = new ArrayList<Callable<String>>();
1051              l.add(new StringTask());
1052              l.add(new StringTask());
# Line 1069 | Line 1054 | public class ScheduledExecutorSubclassTe
1054              assertEquals(2, futures.size());
1055              for (Future<String> future : futures)
1056                  assertSame(TEST_STRING, future.get());
1072        } finally {
1073            joinPool(e);
1057          }
1058      }
1059  
# Line 1078 | Line 1061 | public class ScheduledExecutorSubclassTe
1061       * timed invokeAny(null) throws NPE
1062       */
1063      public void testTimedInvokeAny1() throws Exception {
1064 <        ExecutorService e = new CustomExecutor(2);
1065 <        try {
1066 <            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1067 <            shouldThrow();
1068 <        } catch (NullPointerException success) {
1069 <        } finally {
1087 <            joinPool(e);
1064 >        final ExecutorService e = new CustomExecutor(2);
1065 >        try (PoolCleaner cleaner = cleaner(e)) {
1066 >            try {
1067 >                e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1068 >                shouldThrow();
1069 >            } catch (NullPointerException success) {}
1070          }
1071      }
1072  
# Line 1092 | Line 1074 | public class ScheduledExecutorSubclassTe
1074       * timed invokeAny(,,null) throws NPE
1075       */
1076      public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1077 <        ExecutorService e = new CustomExecutor(2);
1078 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1079 <        l.add(new StringTask());
1080 <        try {
1081 <            e.invokeAny(l, MEDIUM_DELAY_MS, null);
1082 <            shouldThrow();
1083 <        } catch (NullPointerException success) {
1084 <        } finally {
1103 <            joinPool(e);
1077 >        final ExecutorService e = new CustomExecutor(2);
1078 >        try (PoolCleaner cleaner = cleaner(e)) {
1079 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1080 >            l.add(new StringTask());
1081 >            try {
1082 >                e.invokeAny(l, MEDIUM_DELAY_MS, null);
1083 >                shouldThrow();
1084 >            } catch (NullPointerException success) {}
1085          }
1086      }
1087  
# Line 1108 | Line 1089 | public class ScheduledExecutorSubclassTe
1089       * timed invokeAny(empty collection) throws IAE
1090       */
1091      public void testTimedInvokeAny2() throws Exception {
1092 <        ExecutorService e = new CustomExecutor(2);
1093 <        try {
1094 <            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1095 <            shouldThrow();
1096 <        } catch (IllegalArgumentException success) {
1097 <        } finally {
1117 <            joinPool(e);
1092 >        final ExecutorService e = new CustomExecutor(2);
1093 >        try (PoolCleaner cleaner = cleaner(e)) {
1094 >            try {
1095 >                e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1096 >                shouldThrow();
1097 >            } catch (IllegalArgumentException success) {}
1098          }
1099      }
1100  
# Line 1123 | Line 1103 | public class ScheduledExecutorSubclassTe
1103       */
1104      public void testTimedInvokeAny3() throws Exception {
1105          CountDownLatch latch = new CountDownLatch(1);
1106 <        ExecutorService e = new CustomExecutor(2);
1107 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1108 <        l.add(latchAwaitingStringTask(latch));
1109 <        l.add(null);
1110 <        try {
1111 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1112 <            shouldThrow();
1113 <        } catch (NullPointerException success) {
1114 <        } finally {
1106 >        final ExecutorService e = new CustomExecutor(2);
1107 >        try (PoolCleaner cleaner = cleaner(e)) {
1108 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1109 >            l.add(latchAwaitingStringTask(latch));
1110 >            l.add(null);
1111 >            try {
1112 >                e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1113 >                shouldThrow();
1114 >            } catch (NullPointerException success) {}
1115              latch.countDown();
1136            joinPool(e);
1116          }
1117      }
1118  
# Line 1141 | Line 1120 | public class ScheduledExecutorSubclassTe
1120       * timed invokeAny(c) throws ExecutionException if no task completes
1121       */
1122      public void testTimedInvokeAny4() throws Exception {
1123 <        ExecutorService e = new CustomExecutor(2);
1124 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1125 <        l.add(new NPETask());
1126 <        try {
1127 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1128 <            shouldThrow();
1129 <        } catch (ExecutionException success) {
1130 <            assertTrue(success.getCause() instanceof NullPointerException);
1131 <        } finally {
1132 <            joinPool(e);
1123 >        final ExecutorService e = new CustomExecutor(2);
1124 >        try (PoolCleaner cleaner = cleaner(e)) {
1125 >            long startTime = System.nanoTime();
1126 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1127 >            l.add(new NPETask());
1128 >            try {
1129 >                e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
1130 >                shouldThrow();
1131 >            } catch (ExecutionException success) {
1132 >                assertTrue(success.getCause() instanceof NullPointerException);
1133 >            }
1134 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1135          }
1136      }
1137  
# Line 1158 | Line 1139 | public class ScheduledExecutorSubclassTe
1139       * timed invokeAny(c) returns result of some task
1140       */
1141      public void testTimedInvokeAny5() throws Exception {
1142 <        ExecutorService e = new CustomExecutor(2);
1143 <        try {
1142 >        final ExecutorService e = new CustomExecutor(2);
1143 >        try (PoolCleaner cleaner = cleaner(e)) {
1144 >            long startTime = System.nanoTime();
1145              List<Callable<String>> l = new ArrayList<Callable<String>>();
1146              l.add(new StringTask());
1147              l.add(new StringTask());
1148 <            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1148 >            String result = e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
1149              assertSame(TEST_STRING, result);
1150 <        } finally {
1169 <            joinPool(e);
1150 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1151          }
1152      }
1153  
# Line 1174 | Line 1155 | public class ScheduledExecutorSubclassTe
1155       * timed invokeAll(null) throws NPE
1156       */
1157      public void testTimedInvokeAll1() throws Exception {
1158 <        ExecutorService e = new CustomExecutor(2);
1159 <        try {
1160 <            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1161 <            shouldThrow();
1162 <        } catch (NullPointerException success) {
1163 <        } finally {
1183 <            joinPool(e);
1158 >        final ExecutorService e = new CustomExecutor(2);
1159 >        try (PoolCleaner cleaner = cleaner(e)) {
1160 >            try {
1161 >                e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1162 >                shouldThrow();
1163 >            } catch (NullPointerException success) {}
1164          }
1165      }
1166  
# Line 1188 | Line 1168 | public class ScheduledExecutorSubclassTe
1168       * timed invokeAll(,,null) throws NPE
1169       */
1170      public void testTimedInvokeAllNullTimeUnit() throws Exception {
1171 <        ExecutorService e = new CustomExecutor(2);
1172 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1173 <        l.add(new StringTask());
1174 <        try {
1175 <            e.invokeAll(l, MEDIUM_DELAY_MS, null);
1176 <            shouldThrow();
1177 <        } catch (NullPointerException success) {
1178 <        } finally {
1199 <            joinPool(e);
1171 >        final ExecutorService e = new CustomExecutor(2);
1172 >        try (PoolCleaner cleaner = cleaner(e)) {
1173 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1174 >            l.add(new StringTask());
1175 >            try {
1176 >                e.invokeAll(l, MEDIUM_DELAY_MS, null);
1177 >                shouldThrow();
1178 >            } catch (NullPointerException success) {}
1179          }
1180      }
1181  
# Line 1204 | Line 1183 | public class ScheduledExecutorSubclassTe
1183       * timed invokeAll(empty collection) returns empty collection
1184       */
1185      public void testTimedInvokeAll2() throws Exception {
1186 <        ExecutorService e = new CustomExecutor(2);
1187 <        try {
1186 >        final ExecutorService e = new CustomExecutor(2);
1187 >        try (PoolCleaner cleaner = cleaner(e)) {
1188              List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1189              assertTrue(r.isEmpty());
1211        } finally {
1212            joinPool(e);
1190          }
1191      }
1192  
# Line 1217 | Line 1194 | public class ScheduledExecutorSubclassTe
1194       * timed invokeAll(c) throws NPE if c has null elements
1195       */
1196      public void testTimedInvokeAll3() throws Exception {
1197 <        ExecutorService e = new CustomExecutor(2);
1198 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1199 <        l.add(new StringTask());
1200 <        l.add(null);
1201 <        try {
1202 <            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1203 <            shouldThrow();
1204 <        } catch (NullPointerException success) {
1205 <        } finally {
1229 <            joinPool(e);
1197 >        final ExecutorService e = new CustomExecutor(2);
1198 >        try (PoolCleaner cleaner = cleaner(e)) {
1199 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1200 >            l.add(new StringTask());
1201 >            l.add(null);
1202 >            try {
1203 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1204 >                shouldThrow();
1205 >            } catch (NullPointerException success) {}
1206          }
1207      }
1208  
# Line 1234 | Line 1210 | public class ScheduledExecutorSubclassTe
1210       * get of element of invokeAll(c) throws exception on failed task
1211       */
1212      public void testTimedInvokeAll4() throws Exception {
1213 <        ExecutorService e = new CustomExecutor(2);
1214 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1215 <        l.add(new NPETask());
1216 <        List<Future<String>> futures =
1217 <            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1218 <        assertEquals(1, futures.size());
1219 <        try {
1220 <            futures.get(0).get();
1221 <            shouldThrow();
1222 <        } catch (ExecutionException success) {
1223 <            assertTrue(success.getCause() instanceof NullPointerException);
1224 <        } finally {
1225 <            joinPool(e);
1213 >        final ExecutorService e = new CustomExecutor(2);
1214 >        try (PoolCleaner cleaner = cleaner(e)) {
1215 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1216 >            l.add(new NPETask());
1217 >            List<Future<String>> futures =
1218 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1219 >            assertEquals(1, futures.size());
1220 >            try {
1221 >                futures.get(0).get();
1222 >                shouldThrow();
1223 >            } catch (ExecutionException success) {
1224 >                assertTrue(success.getCause() instanceof NullPointerException);
1225 >            }
1226          }
1227      }
1228  
# Line 1254 | Line 1230 | public class ScheduledExecutorSubclassTe
1230       * timed invokeAll(c) returns results of all completed tasks
1231       */
1232      public void testTimedInvokeAll5() throws Exception {
1233 <        ExecutorService e = new CustomExecutor(2);
1234 <        try {
1233 >        final ExecutorService e = new CustomExecutor(2);
1234 >        try (PoolCleaner cleaner = cleaner(e)) {
1235              List<Callable<String>> l = new ArrayList<Callable<String>>();
1236              l.add(new StringTask());
1237              l.add(new StringTask());
# Line 1264 | Line 1240 | public class ScheduledExecutorSubclassTe
1240              assertEquals(2, futures.size());
1241              for (Future<String> future : futures)
1242                  assertSame(TEST_STRING, future.get());
1267        } finally {
1268            joinPool(e);
1243          }
1244      }
1245  
# Line 1273 | Line 1247 | public class ScheduledExecutorSubclassTe
1247       * timed invokeAll(c) cancels tasks not completed by timeout
1248       */
1249      public void testTimedInvokeAll6() throws Exception {
1250 <        ExecutorService e = new CustomExecutor(2);
1251 <        try {
1252 <            for (long timeout = timeoutMillis();;) {
1250 >        for (long timeout = timeoutMillis();;) {
1251 >            final CountDownLatch done = new CountDownLatch(1);
1252 >            final Callable<String> waiter = new CheckedCallable<String>() {
1253 >                public String realCall() {
1254 >                    try { done.await(LONG_DELAY_MS, MILLISECONDS); }
1255 >                    catch (InterruptedException ok) {}
1256 >                    return "1"; }};
1257 >            final ExecutorService p = new CustomExecutor(2);
1258 >            try (PoolCleaner cleaner = cleaner(p, done)) {
1259                  List<Callable<String>> tasks = new ArrayList<>();
1260                  tasks.add(new StringTask("0"));
1261 <                tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1261 >                tasks.add(waiter);
1262                  tasks.add(new StringTask("2"));
1263                  long startTime = System.nanoTime();
1264                  List<Future<String>> futures =
1265 <                    e.invokeAll(tasks, timeout, MILLISECONDS);
1265 >                    p.invokeAll(tasks, timeout, MILLISECONDS);
1266                  assertEquals(tasks.size(), futures.size());
1267                  assertTrue(millisElapsedSince(startTime) >= timeout);
1268                  for (Future future : futures)
# Line 1298 | Line 1278 | public class ScheduledExecutorSubclassTe
1278                          fail("expected exactly one task to be cancelled");
1279                  }
1280              }
1301        } finally {
1302            joinPool(e);
1281          }
1282      }
1283  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines