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;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.ArrayList;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.List;
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.BlockingQueue;
168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Callable;
178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.CountDownLatch;
188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutionException;
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Executors;
208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutorService;
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Future;
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.RejectedExecutionException;
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledFuture;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledThreadPoolExecutor;
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadFactory;
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadPoolExecutor;
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicInteger;
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ScheduledExecutorTest extends JSR166TestCase {
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     return new TestSuite(...);
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute successfully executes a runnable
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testExecute() throws InterruptedException {
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Runnable task = new CheckedRunnable() {
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                done.countDown();
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(task);
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * delayed schedule of callable successfully executes after delay
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule1() throws Exception {
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final long startTime = System.nanoTime();
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Callable task = new CheckedCallable<Boolean>() {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public Boolean realCall() {
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return Boolean.TRUE;
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = p.schedule(task, timeoutMillis(), MILLISECONDS);
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get());
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(done.await(0L, MILLISECONDS));
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
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 {
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final long startTime = System.nanoTime();
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
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        } finally {
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleAtFixedRate executes runnable after given initial delay
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule4() throws Exception {
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final long startTime = System.nanoTime();
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture f =
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.scheduleAtFixedRate(task, timeoutMillis(),
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                      LONG_DELAY_MS, MILLISECONDS);
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(done);
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.cancel(true);
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleWithFixedDelay executes runnable after given initial delay
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule5() throws Exception {
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final long startTime = System.nanoTime();
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture f =
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.scheduleWithFixedDelay(task, timeoutMillis(),
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                         LONG_DELAY_MS, MILLISECONDS);
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(done);
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.cancel(true);
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class RunnableCounter implements Runnable {
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicInteger count = new AtomicInteger(0);
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void run() { count.getAndIncrement(); }
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleAtFixedRate executes series of tasks at given rate
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFixedRateSequence() throws InterruptedException {
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
1648e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        try {
1658e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
1668e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                long startTime = System.nanoTime();
1678e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                int cycles = 10;
1688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                final CountDownLatch done = new CountDownLatch(cycles);
1698e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                Runnable task = new CheckedRunnable() {
1708e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    public void realRun() { done.countDown(); }};
1718e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                ScheduledFuture h =
1728e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS);
1738e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                done.await();
1748e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                h.cancel(true);
1758e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                double normalizedTime =
1768e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    (double) millisElapsedSince(startTime) / delay;
1778e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                if (normalizedTime >= cycles - 1 &&
1788e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    normalizedTime <= cycles)
1798e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    return;
1808e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            }
1818e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            throw new AssertionError("unexpected execution rate");
1828e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        } finally {
1838e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            joinPool(p);
1848e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleWithFixedDelay executes series of tasks with given period
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFixedDelaySequence() throws InterruptedException {
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
1928e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        try {
1938e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
1948e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                long startTime = System.nanoTime();
1958e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                int cycles = 10;
1968e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                final CountDownLatch done = new CountDownLatch(cycles);
1978e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                Runnable task = new CheckedRunnable() {
1988e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    public void realRun() { done.countDown(); }};
1998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                ScheduledFuture h =
2008e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS);
2018e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                done.await();
2028e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                h.cancel(true);
2038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                double normalizedTime =
2048e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    (double) millisElapsedSince(startTime) / delay;
2058e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                if (normalizedTime >= cycles - 1 &&
2068e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    normalizedTime <= cycles)
2078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    return;
2088e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            }
2098e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            throw new AssertionError("unexpected execution rate");
2108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        } finally {
2118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            joinPool(p);
2128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute(null) throws NPE
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testExecuteNull() throws InterruptedException {
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = null;
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se = new ScheduledThreadPoolExecutor(1);
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.execute(null);
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * schedule(null) throws NPE
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testScheduleNull() throws InterruptedException {
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedCallable callable = null;
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = se.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute throws RejectedExecutionException if shutdown
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule1_RejectedExecutionException() throws InterruptedException {
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.shutdown();
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.schedule(new NoOpRunnable(),
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        MEDIUM_DELAY_MS, MILLISECONDS);
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (RejectedExecutionException success) {
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * schedule throws RejectedExecutionException if shutdown
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule2_RejectedExecutionException() throws InterruptedException {
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.shutdown();
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.schedule(new NoOpCallable(),
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        MEDIUM_DELAY_MS, MILLISECONDS);
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (RejectedExecutionException success) {
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * schedule callable throws RejectedExecutionException if shutdown
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSchedule3_RejectedExecutionException() throws InterruptedException {
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.shutdown();
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.schedule(new NoOpCallable(),
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        MEDIUM_DELAY_MS, MILLISECONDS);
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (RejectedExecutionException success) {
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleAtFixedRate throws RejectedExecutionException if shutdown
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException {
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.shutdown();
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.scheduleAtFixedRate(new NoOpRunnable(),
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (RejectedExecutionException success) {
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testScheduleWithFixedDelay1_RejectedExecutionException() throws InterruptedException {
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.shutdown();
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            se.scheduleWithFixedDelay(new NoOpRunnable(),
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                      MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (RejectedExecutionException success) {
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(se);
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getActiveCount increases but doesn't overestimate, when a
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * thread becomes active
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetActiveCount() throws InterruptedException {
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getActiveCount());
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getActiveCount());
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getActiveCount());
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCompletedTaskCount increases, but doesn't overestimate,
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * when tasks complete
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCompletedTaskCount() throws InterruptedException {
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadProceed = new CountDownLatch(1);
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadDone = new CountDownLatch(1);
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getCompletedTaskCount());
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, p.getCompletedTaskCount());
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadProceed.await();
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadDone.countDown();
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(threadStarted);
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getCompletedTaskCount());
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threadProceed.countDown();
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threadDone.await();
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            while (p.getCompletedTaskCount() != 1) {
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (millisElapsedSince(startTime) > LONG_DELAY_MS)
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    fail("timed out");
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.yield();
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCorePoolSize returns size given in constructor if not otherwise set
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCorePoolSize() throws InterruptedException {
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, p.getCorePoolSize());
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getLargestPoolSize increases, but doesn't overestimate, when
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * multiple threads active
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetLargestPoolSize() throws InterruptedException {
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int THREADS = 3;
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS);
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getLargestPoolSize());
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < THREADS; i++)
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(new CheckedRunnable() {
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadsStarted.countDown();
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertEquals(THREADS, p.getLargestPoolSize());
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }});
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(THREADS, p.getLargestPoolSize());
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(THREADS, p.getLargestPoolSize());
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPoolSize increases, but doesn't overestimate, when threads
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * become active
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPoolSize() throws InterruptedException {
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getPoolSize());
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getPoolSize());
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getPoolSize());
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getTaskCount increases, but doesn't overestimate, when tasks
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * submitted
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetTaskCount() throws InterruptedException {
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int TASKS = 5;
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getTaskCount());
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < TASKS; i++)
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(new CheckedRunnable() {
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }});
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(TASKS, p.getTaskCount());
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getThreadFactory returns factory in constructor if not set
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetThreadFactory() throws InterruptedException {
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadFactory tf = new SimpleThreadFactory();
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1, tf);
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(tf, p.getThreadFactory());
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setThreadFactory sets the thread factory returned by getThreadFactory
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetThreadFactory() throws InterruptedException {
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadFactory tf = new SimpleThreadFactory();
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.setThreadFactory(tf);
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(tf, p.getThreadFactory());
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setThreadFactory(null) throws NPE
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetThreadFactoryNull() throws InterruptedException {
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setThreadFactory(null);
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isShutdown is false before shutdown, true after
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsShutdown() {
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isShutdown());
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        finally {
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isTerminated is false before termination, true after
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsTerminated() throws InterruptedException {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminated());
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFalse(p.isTerminated());
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isTerminating is not true when running or when terminated
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsTerminating() throws InterruptedException {
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFalse(p.isTerminating());
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminating());
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueue returns the work queue, which contains queued tasks
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetQueue() throws InterruptedException {
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture[] tasks = new ScheduledFuture[5];
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Runnable r = new CheckedRunnable() {
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = p.schedule(r, 1, MILLISECONDS);
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            BlockingQueue<Runnable> q = p.getQueue();
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(tasks[tasks.length - 1]));
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(tasks[0]));
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove(task) removes queued task, and fails to remove active task
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() throws InterruptedException {
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledFuture[] tasks = new ScheduledFuture[5];
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Runnable r = new CheckedRunnable() {
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = p.schedule(r, 1, MILLISECONDS);
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            BlockingQueue<Runnable> q = p.getQueue();
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.remove((Runnable)tasks[0]));
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains((Runnable)tasks[4]));
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains((Runnable)tasks[3]));
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.remove((Runnable)tasks[4]));
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.remove((Runnable)tasks[4]));
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains((Runnable)tasks[4]));
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains((Runnable)tasks[3]));
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.remove((Runnable)tasks[3]));
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains((Runnable)tasks[3]));
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * purge eventually removes cancelled tasks from the queue
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPurge() throws InterruptedException {
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledFuture[] tasks = new ScheduledFuture[5];
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < tasks.length; i++)
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  LONG_DELAY_MS, MILLISECONDS);
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int max = tasks.length;
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (tasks[4].cancel(true)) --max;
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (tasks[3].cancel(true)) --max;
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // There must eventually be an interference-free point at
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // which purge will not fail. (At worst, when queue is empty.)
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            do {
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.purge();
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long count = p.getTaskCount();
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (count == max)
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return;
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } while (millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            fail("Purge failed to remove cancelled tasks");
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (ScheduledFuture task : tasks)
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                task.cancel(true);
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * shutdownNow returns a list containing tasks that were not run
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testShutdownNow() {
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 5; i++)
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.schedule(new SmallPossiblyInterruptedRunnable(),
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                       LONG_DELAY_MS, MILLISECONDS);
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Runnable> l = p.shutdownNow();
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.isShutdown());
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(5, l.size());
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (SecurityException ok) {
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // Allowed in case test doesn't have privs
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * In default setting, shutdown cancels periodic but not delayed
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * tasks at shutdown
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testShutdown1() throws InterruptedException {
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledFuture[] tasks = new ScheduledFuture[5];
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < tasks.length; i++)
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            tasks[i] = p.schedule(new NoOpRunnable(),
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  SHORT_DELAY_MS, MILLISECONDS);
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        BlockingQueue<Runnable> q = p.getQueue();
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (ScheduledFuture task : tasks) {
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isDone());
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isCancelled());
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(task));
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (ScheduledFuture task : tasks) {
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(task.isDone());
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isCancelled());
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * delayed tasks are cancelled at shutdown
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testShutdown2() throws InterruptedException {
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledFuture[] tasks = new ScheduledFuture[5];
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < tasks.length; i++)
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            tasks[i] = p.schedule(new NoOpRunnable(),
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  SHORT_DELAY_MS, MILLISECONDS);
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        BlockingQueue q = p.getQueue();
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(tasks.length, q.size());
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (ScheduledFuture task : tasks) {
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(task.isDone());
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(task.isCancelled());
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * periodic tasks are cancelled at shutdown
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testShutdown3() throws InterruptedException {
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long initialDelay = LONG_DELAY_MS;
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledFuture task =
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.scheduleAtFixedRate(new NoOpRunnable(), initialDelay,
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  5, MILLISECONDS);
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.getQueue().isEmpty());
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(task.isDone());
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(task.isCancelled());
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * periodic tasks are not cancelled at shutdown
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testShutdown4() throws InterruptedException {
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch counter = new CountDownLatch(2);
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final Runnable r = new CheckedRunnable() {
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    counter.countDown();
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ScheduledFuture task =
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.scheduleAtFixedRate(r, 1, 1, MILLISECONDS);
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isDone());
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isCancelled());
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isCancelled());
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminated());
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.isShutdown());
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(counter.await(SMALL_DELAY_MS, MILLISECONDS));
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(task.isCancelled());
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(task.cancel(false));
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(task.isDone());
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(task.isCancelled());
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.isTerminated());
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        finally {
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of callable returns result
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitCallable() throws Exception {
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<String> future = e.submit(new StringTask());
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = future.get();
7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of runnable returns successfully
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitRunnable() throws Exception {
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<?> future = e.submit(new NoOpRunnable());
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            future.get();
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(future.isDone());
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of (runnable, result) returns result
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitRunnable2() throws Exception {
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = future.get();
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(null) throws NPE
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny1() throws Exception {
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(null);
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(empty collection) throws IAE
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny2() throws Exception {
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(new ArrayList<Callable<String>>());
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) throws NPE if c has null elements
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny3() throws Exception {
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CountDownLatch latch = new CountDownLatch(1);
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(latchAwaitingStringTask(latch));
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l);
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            latch.countDown();
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) throws ExecutionException if no task completes
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny4() throws Exception {
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l);
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) returns result of some task
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny5() throws Exception {
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = e.invokeAny(l);
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(null) throws NPE
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() throws Exception {
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(null);
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(empty collection) returns empty collection
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() throws Exception {
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(r.isEmpty());
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(c) throws NPE if c has null elements
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() throws Exception {
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l);
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of invokeAll(c) throws exception on failed task
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll4() throws Exception {
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Future<String>> futures = e.invokeAll(l);
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, futures.size());
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            futures.get(0).get();
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(c) returns results of all completed tasks
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll5() throws Exception {
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures = e.invokeAll(l);
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, futures.size());
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future<String> future : futures)
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(TEST_STRING, future.get());
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(null) throws NPE
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny1() throws Exception {
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(,,null) throws NPE
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAnyNullTimeUnit() throws Exception {
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l, MEDIUM_DELAY_MS, null);
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(empty collection) throws IAE
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny2() throws Exception {
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) throws NPE if c has null elements
10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny3() throws Exception {
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CountDownLatch latch = new CountDownLatch(1);
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(latchAwaitingStringTask(latch));
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            latch.countDown();
10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) throws ExecutionException if no task completes
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny4() throws Exception {
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) returns result of some task
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny5() throws Exception {
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(null) throws NPE
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll1() throws Exception {
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(,,null) throws NPE
11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAllNullTimeUnit() throws Exception {
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l, MEDIUM_DELAY_MS, null);
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(empty collection) returns empty collection
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll2() throws Exception {
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(r.isEmpty());
11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) throws NPE if c has null elements
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll3() throws Exception {
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of element of invokeAll(c) throws exception on failed task
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll4() throws Exception {
11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Future<String>> futures =
11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, futures.size());
11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            futures.get(0).get();
11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) returns results of all completed tasks
11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll5() throws Exception {
11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures =
11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, futures.size());
11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future<String> future : futures)
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(TEST_STRING, future.get());
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) cancels tasks not completed by timeout
11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll6() throws Exception {
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = new ScheduledThreadPoolExecutor(2);
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures =
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.size(), futures.size());
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future future : futures)
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(future.isDone());
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(futures.get(0).isCancelled());
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(futures.get(1).isCancelled());
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1211