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.concurrent.*;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS;
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.NANOSECONDS;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.*;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ThreadPoolExecutorTest extends JSR166TestCase {
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class ExtendedTPE extends ThreadPoolExecutor {
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch beforeCalled = new CountDownLatch(1);
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch afterCalled = new CountDownLatch(1);
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch terminatedCalled = new CountDownLatch(1);
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public ExtendedTPE() {
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(1, 1, LONG_DELAY_MS, MILLISECONDS, new SynchronousQueue<Runnable>());
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void beforeExecute(Thread t, Runnable r) {
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            beforeCalled.countDown();
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void afterExecute(Runnable r, Throwable t) {
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            afterCalled.countDown();
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void terminated() {
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            terminatedCalled.countDown();
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean beforeCalled() {
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return beforeCalled.getCount() == 0;
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean afterCalled() {
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return afterCalled.getCount() == 0;
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean terminatedCalled() {
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return terminatedCalled.getCount() == 0;
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class FailingThreadFactory implements ThreadFactory {
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int calls = 0;
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public Thread newThread(Runnable r) {
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (++calls > 1) return null;
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return new Thread(r);
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute successfully executes a runnable
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testExecute() throws InterruptedException {
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Runnable task = new CheckedRunnable() {
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                done.countDown();
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(task);
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getActiveCount increases but doesn't overestimate, when a
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * thread becomes active
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetActiveCount() throws InterruptedException {
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getActiveCount());
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getActiveCount());
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getActiveCount());
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * prestartCoreThread starts a thread if under corePoolSize, else doesn't
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPrestartCoreThread() {
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, p.getPoolSize());
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.prestartCoreThread());
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, p.getPoolSize());
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.prestartCoreThread());
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, p.getPoolSize());
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.prestartCoreThread());
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, p.getPoolSize());
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * prestartAllCoreThreads starts all corePoolSize threads
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPrestartAllCoreThreads() {
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, p.getPoolSize());
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.prestartAllCoreThreads();
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, p.getPoolSize());
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.prestartAllCoreThreads();
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, p.getPoolSize());
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCompletedTaskCount increases, but doesn't overestimate,
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * when tasks complete
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCompletedTaskCount() throws InterruptedException {
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadProceed = new CountDownLatch(1);
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadDone = new CountDownLatch(1);
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getCompletedTaskCount());
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, p.getCompletedTaskCount());
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadProceed.await();
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadDone.countDown();
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(threadStarted);
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getCompletedTaskCount());
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threadProceed.countDown();
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threadDone.await();
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            while (p.getCompletedTaskCount() != 1) {
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    fail("timed out");
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.yield();
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCorePoolSize returns size given in constructor if not otherwise set
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCorePoolSize() {
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, p.getCorePoolSize());
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getKeepAliveTime returns value given in constructor if not otherwise set
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetKeepAliveTime() {
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   1000, MILLISECONDS,
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, p.getKeepAliveTime(TimeUnit.SECONDS));
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getThreadFactory returns factory in constructor if not set
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetThreadFactory() {
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadFactory tf = new SimpleThreadFactory();
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   tf,
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(tf, p.getThreadFactory());
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setThreadFactory sets the thread factory returned by getThreadFactory
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetThreadFactory() {
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadFactory tf = new SimpleThreadFactory();
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.setThreadFactory(tf);
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(tf, p.getThreadFactory());
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setThreadFactory(null) throws NPE
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetThreadFactoryNull() {
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setThreadFactory(null);
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getRejectedExecutionHandler returns handler in constructor if not set
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetRejectedExecutionHandler() {
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final RejectedExecutionHandler h = new NoOpREHandler();
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   h);
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(h, p.getRejectedExecutionHandler());
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setRejectedExecutionHandler sets the handler returned by
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getRejectedExecutionHandler
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetRejectedExecutionHandler() {
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new NoOpREHandler();
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.setRejectedExecutionHandler(h);
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(h, p.getRejectedExecutionHandler());
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setRejectedExecutionHandler(null) throws NPE
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetRejectedExecutionHandlerNull() {
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setRejectedExecutionHandler(null);
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getLargestPoolSize increases, but doesn't overestimate, when
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * multiple threads active
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetLargestPoolSize() throws InterruptedException {
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int THREADS = 3;
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(THREADS, THREADS,
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getLargestPoolSize());
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < THREADS; i++)
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(new CheckedRunnable() {
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadsStarted.countDown();
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertEquals(THREADS, p.getLargestPoolSize());
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }});
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(THREADS, p.getLargestPoolSize());
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(THREADS, p.getLargestPoolSize());
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getMaximumPoolSize returns value given in constructor if not
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * otherwise set
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetMaximumPoolSize() {
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 3,
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(3, p.getMaximumPoolSize());
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPoolSize increases, but doesn't overestimate, when threads
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * become active
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPoolSize() throws InterruptedException {
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getPoolSize());
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getPoolSize());
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getPoolSize());
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getTaskCount increases, but doesn't overestimate, when tasks submitted
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetTaskCount() throws InterruptedException {
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getTaskCount());
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getTaskCount());
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, p.getTaskCount());
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isShutdown is false before shutdown, true after
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsShutdown() {
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isShutdown());
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitTermination on a non-shutdown pool times out
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitTermination_timesOut() throws InterruptedException {
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminated());
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(Long.MIN_VALUE, NANOSECONDS));
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(Long.MIN_VALUE, MILLISECONDS));
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(-1L, NANOSECONDS));
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(-1L, MILLISECONDS));
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(0L, NANOSECONDS));
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(0L, MILLISECONDS));
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long timeoutNanos = 999999L;
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(timeoutNanos, NANOSECONDS));
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(System.nanoTime() - startTime >= timeoutNanos);
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminated());
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        startTime = System.nanoTime();
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long timeoutMillis = timeoutMillis();
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.awaitTermination(timeoutMillis, MILLISECONDS));
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminated());
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        p.shutdown();
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isTerminated is false before termination, true after
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsTerminated() throws InterruptedException {
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminated());
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFalse(p.isTerminated());
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isTerminating is not true when running or when terminated
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIsTerminating() throws InterruptedException {
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFalse(p.isTerminating());
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.isTerminating());
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isTerminated());
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.isTerminating());
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueue returns the work queue, which contains queued tasks
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetQueue() throws InterruptedException {
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   q);
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            FutureTask[] tasks = new FutureTask[5];
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Callable task = new CheckedCallable<Boolean>() {
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public Boolean realCall() throws InterruptedException {
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertSame(q, p.getQueue());
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        return Boolean.TRUE;
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = new FutureTask(task);
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(tasks[i]);
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(q, p.getQueue());
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(tasks[0]));
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(tasks[tasks.length - 1]));
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length - 1, q.size());
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove(task) removes queued task, and fails to remove active task
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() throws InterruptedException {
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   q);
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable[] tasks = new Runnable[5];
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = new CheckedRunnable() {
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() throws InterruptedException {
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(tasks[i]);
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.remove(tasks[0]));
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(tasks[4]));
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(tasks[3]));
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.remove(tasks[4]));
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.remove(tasks[4]));
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(tasks[4]));
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(tasks[3]));
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.remove(tasks[3]));
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(tasks[3]));
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * purge removes cancelled tasks from the queue
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPurge() throws InterruptedException {
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   q);
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FutureTask[] tasks = new FutureTask[5];
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; i++) {
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Callable task = new CheckedCallable<Boolean>() {
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public Boolean realCall() throws InterruptedException {
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        threadStarted.countDown();
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.await();
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        return Boolean.TRUE;
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = new FutureTask(task);
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(tasks[i]);
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length, p.getTaskCount());
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length - 1, q.size());
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1L, p.getActiveCount());
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0L, p.getCompletedTaskCount());
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            tasks[4].cancel(true);
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            tasks[3].cancel(false);
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.purge();
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length - 3, q.size());
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length - 2, p.getTaskCount());
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.purge();         // Nothing to do
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length - 3, q.size());
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(tasks.length - 2, p.getTaskCount());
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * shutdownNow returns a list containing tasks that were not run
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testShutdownNow() {
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List l;
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 5; i++)
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(new MediumPossiblyInterruptedRunnable());
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        finally {
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                l = p.shutdownNow();
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (SecurityException ok) { return; }
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.isShutdown());
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() <= 4);
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Exception Tests
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize argument is less than zero
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor1() {
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(-1, 1,
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is less than zero
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, -1,
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is equal to zero
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor3() {
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 0,
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if keepAliveTime is less than zero
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor4() {
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   -1L, MILLISECONDS,
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize is greater than the maximumPoolSize
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor5() {
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 1,
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if workQueue is set to null
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException() {
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (BlockingQueue) null);
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize argument is less than zero
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor6() {
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(-1, 1,
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory());
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is less than zero
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor7() {
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, -1,
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory());
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is equal to zero
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor8() {
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 0,
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory());
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if keepAliveTime is less than zero
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor9() {
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   -1L, MILLISECONDS,
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory());
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize is greater than the maximumPoolSize
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor10() {
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 1,
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory());
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if workQueue is set to null
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException2() {
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (BlockingQueue) null,
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory());
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if threadFactory is set to null
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException3() {
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (ThreadFactory) null);
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize argument is less than zero
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor11() {
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(-1, 1,
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is less than zero
8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor12() {
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, -1,
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is equal to zero
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor13() {
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 0,
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if keepAliveTime is less than zero
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor14() {
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   -1L, MILLISECONDS,
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize is greater than the maximumPoolSize
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor15() {
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 1,
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if workQueue is set to null
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException4() {
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (BlockingQueue) null,
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if handler is set to null
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException5() {
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (RejectedExecutionHandler) null);
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize argument is less than zero
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor16() {
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(-1, 1,
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is less than zero
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor17() {
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, -1,
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if maximumPoolSize is equal to zero
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor18() {
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 0,
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if keepAliveTime is less than zero
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor19() {
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   -1L, MILLISECONDS,
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if corePoolSize is greater than the maximumPoolSize
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor20() {
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 1,
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if workQueue is null
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException6() {
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (BlockingQueue) null,
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if handler is null
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException7() {
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new SimpleThreadFactory(),
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (RejectedExecutionHandler) null);
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws if ThreadFactory is null
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNullPointerException8() {
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10),
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   (ThreadFactory) null,
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new NoOpREHandler());
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of submitted callable throws InterruptedException if interrupted
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedSubmit() throws InterruptedException {
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   60, TimeUnit.SECONDS,
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t = newStartedThread(new CheckedInterruptedRunnable() {
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Callable task = new CheckedCallable<Boolean>() {
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        public Boolean realCall() throws InterruptedException {
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                            threadStarted.countDown();
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                            done.await();
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                            return Boolean.TRUE;
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        }};
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    p.submit(task).get();
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t.interrupt();
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t, MEDIUM_DELAY_MS);
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute throws RejectedExecutionException if saturated.
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSaturatedExecute() {
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1));
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 2; ++i)
10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(task);
10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 2; ++i) {
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    p.execute(task);
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (RejectedExecutionException success) {}
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(p.getTaskCount() <= 2);
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * submit(runnable) throws RejectedExecutionException if saturated.
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSaturatedSubmitRunnable() {
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1));
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 2; ++i)
10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.submit(task);
10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 2; ++i) {
10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    p.execute(task);
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (RejectedExecutionException success) {}
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(p.getTaskCount() <= 2);
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * submit(callable) throws RejectedExecutionException if saturated.
10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSaturatedSubmitCallable() {
10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1));
10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable task = new CheckedRunnable() {
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.await();
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 2; ++i)
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.submit(Executors.callable(task));
10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < 2; ++i) {
10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    p.execute(task);
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (RejectedExecutionException success) {}
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(p.getTaskCount() <= 2);
11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            done.countDown();
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executor using CallerRunsPolicy runs task if saturated.
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSaturatedExecute2() {
11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS,
11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   MILLISECONDS,
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1),
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   h);
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; ++i)
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = new TrackedNoOpRunnable();
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedLongRunnable mr = new TrackedLongRunnable();
11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(mr);
11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; ++i)
11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(tasks[i]);
11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 1; i < tasks.length; ++i)
11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(tasks[i].done);
11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executor using DiscardPolicy drops task if saturated.
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSaturatedExecute3() {
11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1),
11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   h);
11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < tasks.length; ++i)
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                tasks[i] = new TrackedNoOpRunnable();
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new TrackedLongRunnable());
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (TrackedNoOpRunnable task : tasks)
11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.execute(task);
11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (TrackedNoOpRunnable task : tasks)
11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(task.done);
11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executor using DiscardOldestPolicy drops oldest task if saturated.
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSaturatedExecute4() {
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1),
11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   h);
11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new TrackedLongRunnable());
11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedLongRunnable r2 = new TrackedLongRunnable();
11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(r2);
11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.getQueue().contains(r2));
11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(r3);
11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.getQueue().contains(r2));
11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.getQueue().contains(r3));
11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute throws RejectedExecutionException if shutdown
11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRejectedExecutionExceptionOnShutdown() {
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1));
11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new NoOpRunnable());
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (RejectedExecutionException success) {}
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute using CallerRunsPolicy drops task on shutdown
12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallerRunsOnShutdown() {
12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1), h);
12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(r);
12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(r.done);
12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute using DiscardPolicy drops task on shutdown
12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDiscardOnShutdown() {
12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1),
12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   h);
12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(r);
12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(r.done);
12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute using DiscardOldestPolicy drops task on shutdown
12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDiscardOldestOnShutdown() {
12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
12508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
12518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 1,
12528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
12538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(1),
12548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   h);
12558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
12578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
12588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
12598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(r);
12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(r.done);
12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute(null) throws NPE
12688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testExecuteNull() {
12708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
12718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
12728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
12738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
12748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
12758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(null);
12768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
12778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
12788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
12808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setCorePoolSize of negative value throws IllegalArgumentException
12848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCorePoolSizeIllegalArgumentException() {
12868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
12878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 2,
12888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
12898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
12908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
12918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setCorePoolSize(-1);
12928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
12938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
12948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
12958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
12968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
12988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setMaximumPoolSize(int) throws IllegalArgumentException if
13028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * given a value less the core pool size
13038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testMaximumPoolSizeIllegalArgumentException() {
13058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
13068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 3,
13078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
13088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
13098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
13108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setMaximumPoolSize(1);
13118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
13128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
13138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
13148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
13158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
13168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
13178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setMaximumPoolSize throws IllegalArgumentException
13218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * if given a negative value
13228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testMaximumPoolSizeIllegalArgumentException2() {
13248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
13258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 3,
13268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
13278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
13288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
13298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setMaximumPoolSize(-1);
13308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
13318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
13328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
13338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
13348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
13358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
13368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setKeepAliveTime throws IllegalArgumentException
13408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * when given a negative value
13418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testKeepAliveTimeIllegalArgumentException() {
13438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadPoolExecutor p =
13448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 3,
13458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
13468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
13478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
13488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.setKeepAliveTime(-1,MILLISECONDS);
13498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
13508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
13518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
13528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
13538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
13548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
13558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * terminated() is called on termination
13598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTerminated() {
13618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExtendedTPE p = new ExtendedTPE();
13628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { p.shutdown(); } catch (SecurityException ok) { return; }
13638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.terminatedCalled());
13648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
13658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * beforeExecute and afterExecute are called when executing task
13698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBeforeAfter() throws InterruptedException {
13718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExtendedTPE p = new ExtendedTPE();
13728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
13738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CountDownLatch done = new CountDownLatch(1);
13748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CheckedRunnable task = new CheckedRunnable() {
13758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
13768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    done.countDown();
13778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
13788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(task);
13798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(p.afterCalled);
13808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, done.getCount());
13818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.afterCalled());
13828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.beforeCalled());
13838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try { p.shutdown(); } catch (SecurityException ok) { return; }
13848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
13858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
13868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
13878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of callable returns result
13918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitCallable() throws Exception {
13938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
13948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
13958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
13968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
13978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
13988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<String> future = e.submit(new StringTask());
13998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = future.get();
14008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
14018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
14028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
14038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of runnable returns successfully
14088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitRunnable() throws Exception {
14108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
14118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
14128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
14138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
14148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
14158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<?> future = e.submit(new NoOpRunnable());
14168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            future.get();
14178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(future.isDone());
14188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
14198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
14208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed submit of (runnable, result) returns result
14258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSubmitRunnable2() throws Exception {
14278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
14288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
14298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
14308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
14318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
14328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
14338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = future.get();
14348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
14358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
14368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
14378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(null) throws NPE
14428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny1() throws Exception {
14448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
14458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
14468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
14478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
14488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
14498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(null);
14508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
14518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
14528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
14538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
14548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(empty collection) throws IAE
14598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny2() throws Exception {
14618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
14628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
14638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
14648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
14658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
14668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(new ArrayList<Callable<String>>());
14678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
14688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
14698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
14708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
14718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) throws NPE if c has null elements
14768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny3() throws Exception {
14788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch latch = new CountDownLatch(1);
14798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ExecutorService e =
14808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
14818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
14828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
14838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
14848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(latchAwaitingStringTask(latch));
14858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
14868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
14878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l);
14888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
14898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
14908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
14918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            latch.countDown();
14928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
14938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) throws ExecutionException if no task completes
14988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny4() throws Exception {
15008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
15018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
15028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
15038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
15048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
15058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
15068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l);
15088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
15098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
15108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
15118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
15128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
15138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAny(c) returns result of some task
15188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAny5() throws Exception {
15208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
15218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
15228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
15238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
15248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
15268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
15278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
15288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = e.invokeAny(l);
15298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
15308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
15318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
15328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(null) throws NPE
15378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() throws Exception {
15398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
15408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
15418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
15428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
15438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(null);
15458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
15468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
15478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
15488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
15498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(empty collection) returns empty collection
15548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() throws InterruptedException {
15568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
15578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
15588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
15598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
15608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
15628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(r.isEmpty());
15638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
15648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
15658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(c) throws NPE if c has null elements
15708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() throws Exception {
15728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
15738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
15748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
15758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
15768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
15778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
15788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
15798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l);
15818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
15828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
15838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
15848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
15858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of element of invokeAll(c) throws exception on failed task
15908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll4() throws Exception {
15928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
15938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
15948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
15958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
15968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
15988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new NPETask());
15998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures = e.invokeAll(l);
16008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, futures.size());
16018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
16028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                futures.get(0).get();
16038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                shouldThrow();
16048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (ExecutionException success) {
16058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(success.getCause() instanceof NullPointerException);
16068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
16078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
16088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
16098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(c) returns results of all completed tasks
16148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll5() throws Exception {
16168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
16178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
16188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
16198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
16208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
16218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
16228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
16238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
16248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures = e.invokeAll(l);
16258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, futures.size());
16268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future<String> future : futures)
16278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(TEST_STRING, future.get());
16288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
16298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
16308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(null) throws NPE
16358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny1() throws Exception {
16378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
16388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
16398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
16408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
16418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
16428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
16438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
16448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
16458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
16468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
16478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(,,null) throws NPE
16528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAnyNullTimeUnit() throws Exception {
16548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
16558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
16568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
16578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
16588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
16598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
16608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
16618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l, MEDIUM_DELAY_MS, null);
16628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
16638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
16648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
16658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
16668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(empty collection) throws IAE
16718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny2() throws Exception {
16738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
16748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
16758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
16768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
16778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
16788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
16798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
16808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {
16818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
16828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
16838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) throws NPE if c has null elements
16888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny3() throws Exception {
16908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch latch = new CountDownLatch(1);
16918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ExecutorService e =
16928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
16938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
16948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
16958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
16968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(latchAwaitingStringTask(latch));
16978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
16988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
16998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
17008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
17018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
17028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
17038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            latch.countDown();
17048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
17058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) throws ExecutionException if no task completes
17108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny4() throws Exception {
17128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
17138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
17148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
17158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
17168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
17178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
17188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
17198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
17208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
17218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
17228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
17238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
17248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
17258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAny(c) returns result of some task
17308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAny5() throws Exception {
17328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
17338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
17348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
17358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
17368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
17378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
17388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
17398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
17408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
17418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(TEST_STRING, result);
17428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
17438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
17448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(null) throws NPE
17498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll1() throws Exception {
17518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
17528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
17538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
17548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
17558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
17568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
17578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
17588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
17598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
17608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
17618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(,,null) throws NPE
17668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAllNullTimeUnit() throws Exception {
17688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
17698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
17708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
17718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
17728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
17738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
17748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
17758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l, MEDIUM_DELAY_MS, null);
17768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
17778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
17788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
17798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
17808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(empty collection) returns empty collection
17858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll2() throws InterruptedException {
17878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
17888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
17898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
17908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
17918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
17928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
17938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(r.isEmpty());
17948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
17958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
17968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) throws NPE if c has null elements
18018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll3() throws Exception {
18038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
18048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
18058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
18068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
18078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
18088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new StringTask());
18098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(null);
18108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
18118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
18128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
18138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {
18148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
18158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
18168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
18178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of element of invokeAll(c) throws exception on failed task
18218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll4() throws Exception {
18238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
18248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
18258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
18268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
18278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Callable<String>> l = new ArrayList<Callable<String>>();
18288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.add(new NPETask());
18298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Future<String>> futures =
18308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
18318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, futures.size());
18328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
18338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            futures.get(0).get();
18348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
18358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
18368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(success.getCause() instanceof NullPointerException);
18378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
18388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
18398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
18408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) returns results of all completed tasks
18448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll5() throws Exception {
18468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
18478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
18488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
18498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
18508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
18518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
18528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
18538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
18548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures =
18558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
18568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, futures.size());
18578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future<String> future : futures)
18588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(TEST_STRING, future.get());
18598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
18608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
18618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
18628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed invokeAll(c) cancels tasks not completed by timeout
18668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedInvokeAll6() throws Exception {
18688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e =
18698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
18708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
18718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
18728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
18738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Callable<String>> l = new ArrayList<Callable<String>>();
18748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
18758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
18768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            l.add(new StringTask());
18778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            List<Future<String>> futures =
18788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
18798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.size(), futures.size());
18808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Future future : futures)
18818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(future.isDone());
18828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(futures.get(0).isCancelled());
18838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(futures.get(1).isCancelled());
18848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
18858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
18868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
18878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Execution continues if there is at least one thread even if
18918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * thread factory fails to create more
18928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFailingThreadFactory() throws InterruptedException {
18948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ExecutorService e =
18958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(100, 100,
18968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   LONG_DELAY_MS, MILLISECONDS,
18978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new LinkedBlockingQueue<Runnable>(),
18988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new FailingThreadFactory());
18998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
19008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final int TASKS = 100;
19018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CountDownLatch done = new CountDownLatch(TASKS);
19028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int k = 0; k < TASKS; ++k)
19038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                e.execute(new CheckedRunnable() {
19048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() {
19058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.countDown();
19068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }});
19078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
19088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
19098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(e);
19108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
19118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
19128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
19138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
19148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * allowsCoreThreadTimeOut is by default false.
19158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
19168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAllowsCoreThreadTimeOut() {
19178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
19188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 2,
19198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   1000, MILLISECONDS,
19208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
19218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(p.allowsCoreThreadTimeOut());
19228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(p);
19238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
19248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
19258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
19268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * allowCoreThreadTimeOut(true) causes idle threads to time out
19278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
19288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAllowCoreThreadTimeOut_true() throws Exception {
19298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long coreThreadTimeOut = SHORT_DELAY_MS;
19308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
19318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 10,
19328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   coreThreadTimeOut, MILLISECONDS,
19338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
19348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
19358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
19368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.allowCoreThreadTimeOut(true);
19378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
19388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
19398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
19408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, p.getPoolSize());
19418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
19428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            await(threadStarted);
19438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            delay(coreThreadTimeOut);
19448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
19458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            while (p.getPoolSize() > 0
19468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                   && millisElapsedSince(startTime) < LONG_DELAY_MS)
19478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.yield();
19488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
19498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, p.getPoolSize());
19508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
19518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
19528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
19538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
19548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
19558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
19568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * allowCoreThreadTimeOut(false) causes idle threads not to time out
19578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
19588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAllowCoreThreadTimeOut_false() throws Exception {
19598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long coreThreadTimeOut = SHORT_DELAY_MS;
19608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
19618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(2, 10,
19628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   coreThreadTimeOut, MILLISECONDS,
19638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue<Runnable>(10));
19648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
19658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
19668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.allowCoreThreadTimeOut(false);
19678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.execute(new CheckedRunnable() {
19688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws InterruptedException {
19698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    threadStarted.countDown();
19708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(p.getPoolSize() >= 1);
19718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
19728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            delay(2 * coreThreadTimeOut);
19738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(p.getPoolSize() >= 1);
19748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
19758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
19768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
19778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
19788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
19798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
19808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * execute allows the same task to be submitted multiple times, even
19818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * if rejected
19828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
19838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRejectedRecycledTask() throws InterruptedException {
19848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int nTasks = 1000;
19858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(nTasks);
19868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Runnable recycledTask = new Runnable() {
19878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void run() {
19888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                done.countDown();
19898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
19908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadPoolExecutor p =
19918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
19928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                   new ArrayBlockingQueue(30));
19938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
19948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < nTasks; ++i) {
19958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (;;) {
19968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    try {
19978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        p.execute(recycledTask);
19988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        break;
19998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }
20008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    catch (RejectedExecutionException ignore) {}
20018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
20028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
20038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // enough time to run all tasks
20048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(done.await(nTasks * SHORT_DELAY_MS, MILLISECONDS));
20058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } finally {
20068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(p);
20078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
20088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
20098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
20108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
2011