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