18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS;
12b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport static java.util.concurrent.TimeUnit.NANOSECONDS;
13b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport static java.util.concurrent.TimeUnit.SECONDS;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.ArrayList;
16b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.HashSet;
178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.List;
188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.BlockingQueue;
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Callable;
20b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.CancellationException;
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.CountDownLatch;
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutionException;
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Executors;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutorService;
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Future;
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.RejectedExecutionException;
278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledFuture;
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledThreadPoolExecutor;
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadFactory;
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadPoolExecutor;
31b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicBoolean;
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicInteger;
33b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicLong;
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ScheduledExecutorTest extends JSR166TestCase {
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
46b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     return new TestSuite(ScheduledExecutorTest.class);
478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute successfully executes a runnable
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testExecute() throws InterruptedException {
53b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
54b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
55b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
56b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final Runnable task = new CheckedRunnable() {
57b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() { done.countDown(); }};
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(task);
59b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * delayed schedule of callable successfully executes after delay
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule1() throws Exception {
67b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
68b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
69b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final long startTime = System.nanoTime();
70b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Callable task = new CheckedCallable<Boolean>() {
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public Boolean realCall() {
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return Boolean.TRUE;
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = p.schedule(task, timeoutMillis(), MILLISECONDS);
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get());
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(done.await(0L, MILLISECONDS));
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * delayed schedule of runnable successfully executes after delay
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule3() throws Exception {
88b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
89b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
90b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final long startTime = System.nanoTime();
91b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = p.schedule(task, timeoutMillis(), MILLISECONDS);
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(done);
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleAtFixedRate executes runnable after given initial delay
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule4() throws Exception {
108b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
109b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
110b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final long startTime = System.nanoTime();
111b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture f =
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.scheduleAtFixedRate(task, timeoutMillis(),
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                      LONG_DELAY_MS, MILLISECONDS);
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(done);
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.cancel(true);
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleWithFixedDelay executes runnable after given initial delay
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule5() throws Exception {
130b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
131b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
132b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final long startTime = System.nanoTime();
133b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture f =
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.scheduleWithFixedDelay(task, timeoutMillis(),
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                         LONG_DELAY_MS, MILLISECONDS);
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(done);
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.cancel(true);
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class RunnableCounter implements Runnable {
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicInteger count = new AtomicInteger(0);
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void run() { count.getAndIncrement(); }
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
154b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * scheduleAtFixedRate executes series of tasks at given rate.
155b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Eventually, it must hold that:
156b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     *   cycles - 1 <= elapsedMillis/delay < cycles
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFixedRateSequence() throws InterruptedException {
159b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
160b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
1618e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
162b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final long startTime = System.nanoTime();
163b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final int cycles = 8;
1648e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                final CountDownLatch done = new CountDownLatch(cycles);
165b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final Runnable task = new CheckedRunnable() {
1668e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    public void realRun() { done.countDown(); }};
167b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final ScheduledFuture periodicTask =
1688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS);
169b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final int totalDelayMillis = (cycles - 1) * delay;
170b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                await(done, totalDelayMillis + LONG_DELAY_MS);
171b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                periodicTask.cancel(true);
172b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final long elapsedMillis = millisElapsedSince(startTime);
173b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(elapsedMillis >= totalDelayMillis);
174b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                if (elapsedMillis <= cycles * delay)
1758e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    return;
176b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                // else retry with longer delay
1778e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            }
178b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            fail("unexpected execution rate");
1798e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
183b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * scheduleWithFixedDelay executes series of tasks with given period.
184b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Eventually, it must hold that each task starts at least delay and at
185b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * most 2 * delay after the termination of the previous task.
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFixedDelaySequence() throws InterruptedException {
188b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
1908e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
191b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final long startTime = System.nanoTime();
192b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final AtomicLong previous = new AtomicLong(startTime);
193b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final AtomicBoolean tryLongerDelay = new AtomicBoolean(false);
194b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final int cycles = 8;
1958e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                final CountDownLatch done = new CountDownLatch(cycles);
196b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final int d = delay;
197b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final Runnable task = new CheckedRunnable() {
198b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    public void realRun() {
199b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        long now = System.nanoTime();
200b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        long elapsedMillis
201b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                            = NANOSECONDS.toMillis(now - previous.get());
202b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        if (done.getCount() == cycles) { // first execution
203b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                            if (elapsedMillis >= d)
204b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                tryLongerDelay.set(true);
205b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        } else {
206b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                            assertTrue(elapsedMillis >= d);
207b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                            if (elapsedMillis >= 2 * d)
208b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                tryLongerDelay.set(true);
209b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        }
210b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        previous.set(now);
211b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        done.countDown();
212b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    }};
213b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final ScheduledFuture periodicTask =
2148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS);
215b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final int totalDelayMillis = (cycles - 1) * delay;
216b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                await(done, totalDelayMillis + cycles * LONG_DELAY_MS);
217b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                periodicTask.cancel(true);
218b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                final long elapsedMillis = millisElapsedSince(startTime);
219b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(elapsedMillis >= totalDelayMillis);
220b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                if (!tryLongerDelay.get())
2218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    return;
222b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                // else retry with longer delay
2238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            }
224b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            fail("unexpected execution rate");
2258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute(null) throws NPE
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testExecuteNull() throws InterruptedException {
232b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
233b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
234b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
235b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.execute(null);
236b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
237b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
238b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * schedule(null) throws NPE
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testScheduleNull() throws InterruptedException {
245b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
246b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
247b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
248b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                TrackedCallable callable = null;
249b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Future f = p.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
250b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
251b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
252b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute throws RejectedExecutionException if shutdown
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule1_RejectedExecutionException() throws InterruptedException {
259b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
260b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
261b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
262b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.shutdown();
263b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.schedule(new NoOpRunnable(),
264b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                           MEDIUM_DELAY_MS, MILLISECONDS);
265b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
266b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (RejectedExecutionException success) {
267b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (SecurityException ok) {}
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * schedule throws RejectedExecutionException if shutdown
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule2_RejectedExecutionException() throws InterruptedException {
275b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
276b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
277b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
278b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.shutdown();
279b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.schedule(new NoOpCallable(),
280b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                           MEDIUM_DELAY_MS, MILLISECONDS);
281b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
282b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (RejectedExecutionException success) {
283b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (SecurityException ok) {}
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * schedule callable throws RejectedExecutionException if shutdown
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule3_RejectedExecutionException() throws InterruptedException {
291b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
292b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
293b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
294b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.shutdown();
295b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.schedule(new NoOpCallable(),
296b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                           MEDIUM_DELAY_MS, MILLISECONDS);
297b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
298b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (RejectedExecutionException success) {
299b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (SecurityException ok) {}
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleAtFixedRate throws RejectedExecutionException if shutdown
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException {
307b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
308b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
309b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
310b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.shutdown();
311b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.scheduleAtFixedRate(new NoOpRunnable(),
312b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                      MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
313b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
314b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (RejectedExecutionException success) {
315b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (SecurityException ok) {}
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testScheduleWithFixedDelay1_RejectedExecutionException() throws InterruptedException {
323b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
324b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
325b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
326b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.shutdown();
327b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.scheduleWithFixedDelay(new NoOpRunnable(),
328b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                         MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
329b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
330b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (RejectedExecutionException success) {
331b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (SecurityException ok) {}
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getActiveCount increases but doesn't overestimate, when a
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * thread becomes active
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetActiveCount() throws InterruptedException {
340ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        final CountDownLatch done = new CountDownLatch(1);
341b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
342b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, done)) {
343b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadStarted = new CountDownLatch(1);
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getActiveCount());
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getActiveCount());
349b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    await(done);
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
351b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getActiveCount());
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCompletedTaskCount increases, but doesn't overestimate,
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * when tasks complete
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCompletedTaskCount() throws InterruptedException {
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
362b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
363b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadStarted = new CountDownLatch(1);
364b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadProceed = new CountDownLatch(1);
365b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadDone = new CountDownLatch(1);
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getCompletedTaskCount());
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, p.getCompletedTaskCount());
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadProceed.await();
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadDone.countDown();
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(threadStarted);
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getCompletedTaskCount());
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threadProceed.countDown();
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threadDone.await();
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            while (p.getCompletedTaskCount() != 1) {
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (millisElapsedSince(startTime) > LONG_DELAY_MS)
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    fail("timed out");
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.yield();
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCorePoolSize returns size given in constructor if not otherwise set
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCorePoolSize() throws InterruptedException {
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
392b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
393b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(1, p.getCorePoolSize());
394b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getLargestPoolSize increases, but doesn't overestimate, when
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * multiple threads active
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetLargestPoolSize() throws InterruptedException {
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int THREADS = 3;
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS);
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
406b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, done)) {
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getLargestPoolSize());
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < THREADS; i++)
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(new CheckedRunnable() {
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadsStarted.countDown();
412b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        await(done);
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertEquals(THREADS, p.getLargestPoolSize());
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }});
415b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadsStarted);
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(THREADS, p.getLargestPoolSize());
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
418b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(THREADS, p.getLargestPoolSize());
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPoolSize increases, but doesn't overestimate, when threads
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * become active
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPoolSize() throws InterruptedException {
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
429b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, done)) {
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getPoolSize());
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getPoolSize());
435b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    await(done);
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
437b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getPoolSize());
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getTaskCount increases, but doesn't overestimate, when tasks
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * submitted
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetTaskCount() throws InterruptedException {
447b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final int TASKS = 3;
448ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        final CountDownLatch done = new CountDownLatch(1);
449b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
450b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, done)) {
451b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadStarted = new CountDownLatch(1);
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getTaskCount());
453b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(0, p.getCompletedTaskCount());
454b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.execute(new CheckedRunnable() {
455b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
456b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadStarted.countDown();
457b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    await(done);
458b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
459b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
460b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(1, p.getTaskCount());
461b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(0, p.getCompletedTaskCount());
462b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            for (int i = 0; i < TASKS; i++) {
463b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertEquals(1 + i, p.getTaskCount());
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(new CheckedRunnable() {
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
467b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        assertEquals(1 + TASKS, p.getTaskCount());
468b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        await(done);
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }});
470b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
471b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(1 + TASKS, p.getTaskCount());
472b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(0, p.getCompletedTaskCount());
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
474b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(1 + TASKS, p.getTaskCount());
475b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(1 + TASKS, p.getCompletedTaskCount());
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getThreadFactory returns factory in constructor if not set
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetThreadFactory() throws InterruptedException {
482b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ThreadFactory threadFactory = new SimpleThreadFactory();
483b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p =
484b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            new ScheduledThreadPoolExecutor(1, threadFactory);
485b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
486b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertSame(threadFactory, p.getThreadFactory());
487b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setThreadFactory sets the thread factory returned by getThreadFactory
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetThreadFactory() throws InterruptedException {
494b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        ThreadFactory threadFactory = new SimpleThreadFactory();
495b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
496b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
497b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.setThreadFactory(threadFactory);
498b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertSame(threadFactory, p.getThreadFactory());
499b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setThreadFactory(null) throws NPE
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetThreadFactoryNull() throws InterruptedException {
506b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
507b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
508b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
509b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.setThreadFactory(null);
510b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
511b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isShutdown is false before shutdown, true after
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsShutdown() {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
520b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isShutdown());
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        finally {
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isTerminated is false before termination, true after
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsTerminated() throws InterruptedException {
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
535b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
536b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadStarted = new CountDownLatch(1);
537b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
538b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertFalse(p.isTerminated());
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFalse(p.isTerminated());
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
543b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    await(done);
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
545b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
549b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
550b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(p.isTerminated());
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isTerminating is not true when running or when terminated
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsTerminating() throws InterruptedException {
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
561b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFalse(p.isTerminating());
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
567b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    await(done);
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
569b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
573b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
574b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(p.isTerminated());
575b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertFalse(p.isTerminating());
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueue returns the work queue, which contains queued tasks
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetQueue() throws InterruptedException {
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
584b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
585b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, done)) {
586b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadStarted = new CountDownLatch(1);
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture[] tasks = new ScheduledFuture[5];
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Runnable r = new CheckedRunnable() {
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
592b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        await(done);
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = p.schedule(r, 1, MILLISECONDS);
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
596b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            BlockingQueue<Runnable> q = p.getQueue();
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(tasks[tasks.length - 1]));
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(tasks[0]));
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove(task) removes queued task, and fails to remove active task
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() throws InterruptedException {
607ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        final CountDownLatch done = new CountDownLatch(1);
608b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
609b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, done)) {
610b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            ScheduledFuture[] tasks = new ScheduledFuture[5];
611b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch threadStarted = new CountDownLatch(1);
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Runnable r = new CheckedRunnable() {
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
616b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        await(done);
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = p.schedule(r, 1, MILLISECONDS);
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
620b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(threadStarted);
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            BlockingQueue<Runnable> q = p.getQueue();
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.remove((Runnable)tasks[0]));
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains((Runnable)tasks[4]));
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains((Runnable)tasks[3]));
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.remove((Runnable)tasks[4]));
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.remove((Runnable)tasks[4]));
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains((Runnable)tasks[4]));
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains((Runnable)tasks[3]));
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.remove((Runnable)tasks[3]));
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains((Runnable)tasks[3]));
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * purge eventually removes cancelled tasks from the queue
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPurge() throws InterruptedException {
638b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledFuture[] tasks = new ScheduledFuture[5];
639b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final Runnable releaser = new Runnable() { public void run() {
640b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            for (ScheduledFuture task : tasks)
641b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                if (task != null) task.cancel(true); }};
642b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
643b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p, releaser)) {
644b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            for (int i = 0; i < tasks.length; i++)
645b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
646b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                      LONG_DELAY_MS, MILLISECONDS);
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int max = tasks.length;
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (tasks[4].cancel(true)) --max;
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (tasks[3].cancel(true)) --max;
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // There must eventually be an interference-free point at
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // which purge will not fail. (At worst, when queue is empty.)
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            do {
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.purge();
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long count = p.getTaskCount();
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (count == max)
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return;
658b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } while (millisElapsedSince(startTime) < LONG_DELAY_MS);
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            fail("Purge failed to remove cancelled tasks");
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
664b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * shutdownNow returns a list containing tasks that were not run,
665b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * and those tasks are drained from the queue
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
667b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public void testShutdownNow() throws InterruptedException {
668b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final int poolSize = 2;
669b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final int count = 5;
670b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final AtomicInteger ran = new AtomicInteger(0);
671b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p =
672b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            new ScheduledThreadPoolExecutor(poolSize);
673b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
674b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        Runnable waiter = new CheckedRunnable() { public void realRun() {
675b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            threadsStarted.countDown();
676b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
677b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                MILLISECONDS.sleep(2 * LONG_DELAY_MS);
678b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (InterruptedException success) {}
679b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            ran.getAndIncrement();
680b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }};
681b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = 0; i < count; i++)
682b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.execute(waiter);
683b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        await(threadsStarted);
684b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(poolSize, p.getActiveCount());
685b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(0, p.getCompletedTaskCount());
686b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final List<Runnable> queuedTasks;
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
688b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            queuedTasks = p.shutdownNow();
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
690b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return; // Allowed in case test doesn't have privs
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
692b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.isShutdown());
693b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.getQueue().isEmpty());
694b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(count - poolSize, queuedTasks.size());
695b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
696b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.isTerminated());
697b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(poolSize, ran.get());
698b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(poolSize, p.getCompletedTaskCount());
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
702b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * shutdownNow returns a list containing tasks that were not run,
703b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * and those tasks are drained from the queue
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
705b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public void testShutdownNow_delayedTasks() throws InterruptedException {
706b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
707b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        List<ScheduledFuture> tasks = new ArrayList<>();
708b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = 0; i < 3; i++) {
709b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            Runnable r = new NoOpRunnable();
710b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            tasks.add(p.schedule(r, 9, SECONDS));
711b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            tasks.add(p.scheduleAtFixedRate(r, 9, 9, SECONDS));
712b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            tasks.add(p.scheduleWithFixedDelay(r, 9, 9, SECONDS));
713b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
714b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        if (testImplementationDetails)
715b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(new HashSet(tasks), new HashSet(p.getQueue()));
716b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final List<Runnable> queuedTasks;
717b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try {
718b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            queuedTasks = p.shutdownNow();
719b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } catch (SecurityException ok) {
720b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return; // Allowed in case test doesn't have privs
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
722ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        assertTrue(p.isShutdown());
723b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.getQueue().isEmpty());
724b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        if (testImplementationDetails)
725b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(new HashSet(tasks), new HashSet(queuedTasks));
726b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(tasks.size(), queuedTasks.size());
727ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        for (ScheduledFuture task : tasks) {
728b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertFalse(task.isDone());
729ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak            assertFalse(task.isCancelled());
730ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        }
731b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
732ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        assertTrue(p.isTerminated());
733ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak    }
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
735ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak    /**
736b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * By default, periodic tasks are cancelled at shutdown.
737b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * By default, delayed tasks keep running after shutdown.
738b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Check that changing the default values work:
739b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * - setExecuteExistingDelayedTasksAfterShutdownPolicy
740b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * - setContinueExistingPeriodicTasksAfterShutdownPolicy
741ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak     */
742b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public void testShutdown_cancellation() throws Exception {
743b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        Boolean[] allBooleans = { null, Boolean.FALSE, Boolean.TRUE };
744b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (Boolean policy : allBooleans)
745b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    {
746b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final int poolSize = 2;
747b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p
748b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            = new ScheduledThreadPoolExecutor(poolSize);
749b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final boolean effectiveDelayedPolicy = (policy != Boolean.FALSE);
750b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final boolean effectivePeriodicPolicy = (policy == Boolean.TRUE);
751b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final boolean effectiveRemovePolicy = (policy == Boolean.TRUE);
752b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        if (policy != null) {
753b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.setExecuteExistingDelayedTasksAfterShutdownPolicy(policy);
754b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.setContinueExistingPeriodicTasksAfterShutdownPolicy(policy);
755b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.setRemoveOnCancelPolicy(policy);
756b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
757b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(effectiveDelayedPolicy,
758b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                     p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
759b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(effectivePeriodicPolicy,
760b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                     p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
761b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(effectiveRemovePolicy,
762b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                     p.getRemoveOnCancelPolicy());
763b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        // Strategy: Wedge the pool with poolSize "blocker" threads
764b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final AtomicInteger ran = new AtomicInteger(0);
765b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch poolBlocked = new CountDownLatch(poolSize);
766b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch unblock = new CountDownLatch(1);
767b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch periodicLatch1 = new CountDownLatch(2);
768b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch periodicLatch2 = new CountDownLatch(2);
769b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        Runnable task = new CheckedRunnable() { public void realRun()
770b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                                    throws InterruptedException {
771b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            poolBlocked.countDown();
772b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(unblock.await(LONG_DELAY_MS, MILLISECONDS));
773b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            ran.getAndIncrement();
774b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }};
775b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        List<Future<?>> blockers = new ArrayList<>();
776b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        List<Future<?>> periodics = new ArrayList<>();
777b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        List<Future<?>> delayeds = new ArrayList<>();
778b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = 0; i < poolSize; i++)
779b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            blockers.add(p.submit(task));
780b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(poolBlocked.await(LONG_DELAY_MS, MILLISECONDS));
781b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
782b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        periodics.add(p.scheduleAtFixedRate(countDowner(periodicLatch1),
783b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                            1, 1, MILLISECONDS));
784b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        periodics.add(p.scheduleWithFixedDelay(countDowner(periodicLatch2),
785b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                               1, 1, MILLISECONDS));
786b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        delayeds.add(p.schedule(task, 1, MILLISECONDS));
787b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
788b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.getQueue().containsAll(periodics));
789b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.getQueue().containsAll(delayeds));
790ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        try { p.shutdown(); } catch (SecurityException ok) { return; }
791ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        assertTrue(p.isShutdown());
792b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertFalse(p.isTerminated());
793b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (Future<?> periodic : periodics) {
794b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(effectivePeriodicPolicy ^ periodic.isCancelled());
795b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(effectivePeriodicPolicy ^ periodic.isDone());
796b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
797b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (Future<?> delayed : delayeds) {
798b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(effectiveDelayedPolicy ^ delayed.isCancelled());
799b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(effectiveDelayedPolicy ^ delayed.isDone());
800b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
801b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        if (testImplementationDetails) {
802b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(effectivePeriodicPolicy,
803b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                         p.getQueue().containsAll(periodics));
804b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(effectiveDelayedPolicy,
805b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                         p.getQueue().containsAll(delayeds));
806b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
807b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        // Release all pool threads
808b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        unblock.countDown();
809ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak
810b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (Future<?> delayed : delayeds) {
811b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            if (effectiveDelayedPolicy) {
812b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertNull(delayed.get());
813b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
815b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        if (effectivePeriodicPolicy) {
816b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(periodicLatch1.await(LONG_DELAY_MS, MILLISECONDS));
817b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(periodicLatch2.await(LONG_DELAY_MS, MILLISECONDS));
818b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            for (Future<?> periodic : periodics) {
819b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(periodic.cancel(false));
820b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(periodic.isCancelled());
821b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(periodic.isDone());
822b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
824b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
825b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(p.isTerminated());
826b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(2 + (effectiveDelayedPolicy ? 1 : 0), ran.get());
827b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }}
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of callable returns result
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitCallable() throws Exception {
833b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
834b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<String> future = e.submit(new StringTask());
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = future.get();
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of runnable returns successfully
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitRunnable() throws Exception {
845b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
846b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<?> future = e.submit(new NoOpRunnable());
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            future.get();
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(future.isDone());
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of (runnable, result) returns result
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitRunnable2() throws Exception {
857b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
858b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = future.get();
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(null) throws NPE
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny1() throws Exception {
869b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
870b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
871b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
872b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(null);
873b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
874b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(empty collection) throws IAE
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny2() throws Exception {
882b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
883b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
884b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
885b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(new ArrayList<Callable<String>>());
886b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
887b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (IllegalArgumentException success) {}
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) throws NPE if c has null elements
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny3() throws Exception {
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CountDownLatch latch = new CountDownLatch(1);
896b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
897b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
898b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
899b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(latchAwaitingStringTask(latch));
900b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(null);
901b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
902b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(l);
903b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
904b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            latch.countDown();
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) throws ExecutionException if no task completes
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny4() throws Exception {
913b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
914b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
915b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
916b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new NPETask());
917b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
918b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(l);
919b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
920b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (ExecutionException success) {
921b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(success.getCause() instanceof NullPointerException);
922b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) returns result of some task
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny5() throws Exception {
930b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
931b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = e.invokeAny(l);
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(null) throws NPE
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() throws Exception {
944b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
945b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
946b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
947b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(null);
948b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
949b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(empty collection) returns empty collection
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() throws Exception {
957b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
958b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(r.isEmpty());
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(c) throws NPE if c has null elements
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() throws Exception {
968b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
969b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
970b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
971b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new StringTask());
972b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(null);
973b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
974b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(l);
975b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
976b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of invokeAll(c) throws exception on failed task
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll4() throws Exception {
984b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
985b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
986b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
987b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new NPETask());
988b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Future<String>> futures = e.invokeAll(l);
989b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(1, futures.size());
990b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
991b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                futures.get(0).get();
992b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
993b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (ExecutionException success) {
994b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(success.getCause() instanceof NullPointerException);
995b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(c) returns results of all completed tasks
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll5() throws Exception {
1003b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1004b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures = e.invokeAll(l);
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, futures.size());
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future<String> future : futures)
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(TEST_STRING, future.get());
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(null) throws NPE
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny1() throws Exception {
1019b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1020b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1021b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1022b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1023b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1024b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(,,null) throws NPE
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1032b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1033b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1034b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
1035b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new StringTask());
1036b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1037b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(l, MEDIUM_DELAY_MS, null);
1038b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1039b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(empty collection) throws IAE
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny2() throws Exception {
1047b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1048b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1049b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1050b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1051b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1052b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (IllegalArgumentException success) {}
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) throws NPE if c has null elements
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny3() throws Exception {
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CountDownLatch latch = new CountDownLatch(1);
1061b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1062b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1063b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
1064b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(latchAwaitingStringTask(latch));
1065b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(null);
1066b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1067b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1068b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1069b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            latch.countDown();
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) throws ExecutionException if no task completes
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny4() throws Exception {
1078b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1079b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1080b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1081b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
1082b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new NPETask());
1083b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1084b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
1085b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1086b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (ExecutionException success) {
1087b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(success.getCause() instanceof NullPointerException);
1088b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
1089b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) returns result of some task
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny5() throws Exception {
1097b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1098b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1099b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
1103b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            String result = e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
1105b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(null) throws NPE
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll1() throws Exception {
1113b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1114b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1115b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1116b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1117b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1118b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(,,null) throws NPE
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAllNullTimeUnit() throws Exception {
1126b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1127b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1128b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
1129b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new StringTask());
1130b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1131b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(l, MEDIUM_DELAY_MS, null);
1132b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1133b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(empty collection) returns empty collection
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll2() throws Exception {
1141b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1142b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1143b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(),
1144b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                                 MEDIUM_DELAY_MS, MILLISECONDS);
11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(r.isEmpty());
11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) throws NPE if c has null elements
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll3() throws Exception {
1153b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1154b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1155b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
1156b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new StringTask());
1157b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(null);
1158b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1159b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1160b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1161b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (NullPointerException success) {}
11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of element of invokeAll(c) throws exception on failed task
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll4() throws Exception {
1169b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1170b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
1171b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Callable<String>> l = new ArrayList<Callable<String>>();
1172b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            l.add(new NPETask());
1173b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            List<Future<String>> futures =
1174b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1175b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(1, futures.size());
1176b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try {
1177b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                futures.get(0).get();
1178b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                shouldThrow();
1179b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            } catch (ExecutionException success) {
1180b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(success.getCause() instanceof NullPointerException);
1181b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) returns results of all completed tasks
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll5() throws Exception {
1189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1190b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures =
1195b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, futures.size());
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future<String> future : futures)
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(TEST_STRING, future.get());
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) cancels tasks not completed by timeout
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll6() throws Exception {
1206b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (long timeout = timeoutMillis();;) {
1207b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final CountDownLatch done = new CountDownLatch(1);
1208b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final Callable<String> waiter = new CheckedCallable<String>() {
1209b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public String realCall() {
1210b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    try { done.await(LONG_DELAY_MS, MILLISECONDS); }
1211b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    catch (InterruptedException ok) {}
1212b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    return "1"; }};
1213b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final ExecutorService p = new ScheduledThreadPoolExecutor(2);
1214b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            try (PoolCleaner cleaner = cleaner(p, done)) {
1215b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                List<Callable<String>> tasks = new ArrayList<>();
1216b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                tasks.add(new StringTask("0"));
1217b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                tasks.add(waiter);
1218b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                tasks.add(new StringTask("2"));
1219b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                long startTime = System.nanoTime();
1220b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                List<Future<String>> futures =
1221b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    p.invokeAll(tasks, timeout, MILLISECONDS);
1222b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertEquals(tasks.size(), futures.size());
1223b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(millisElapsedSince(startTime) >= timeout);
1224b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                for (Future future : futures)
1225b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertTrue(future.isDone());
1226b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(futures.get(1).isCancelled());
1227b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                try {
1228b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertEquals("0", futures.get(0).get());
1229b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertEquals("2", futures.get(2).get());
1230b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    break;
1231b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                } catch (CancellationException retryWithLongerTimeout) {
1232b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    timeout *= 2;
1233b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    if (timeout >= LONG_DELAY_MS / 2)
1234b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        fail("expected exactly one task to be cancelled");
1235b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }
1236b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
1237b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
1238b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
1239b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
1240b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /**
1241b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * A fixed delay task with overflowing period should not prevent a
1242b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * one-shot task from executing.
1243b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * https://bugs.openjdk.java.net/browse/JDK-8051859
1244b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     */
1245b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public void testScheduleWithFixedDelay_overflow() throws Exception {
1246b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch delayedDone = new CountDownLatch(1);
1247b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final CountDownLatch immediateDone = new CountDownLatch(1);
1248b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
1249b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
1250b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final Runnable immediate = new Runnable() { public void run() {
1251b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                immediateDone.countDown();
1252b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }};
1253b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            final Runnable delayed = new Runnable() { public void run() {
1254b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                delayedDone.countDown();
1255b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.submit(immediate);
1256b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }};
1257b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            p.scheduleWithFixedDelay(delayed, 0L, Long.MAX_VALUE, SECONDS);
1258b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(delayedDone);
1259b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            await(immediateDone);
12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1264