18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.AccessControlContext;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.AccessControlException;
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.AccessController;
168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.PrivilegedAction;
178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.PrivilegedExceptionAction;
188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.ArrayList;
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.List;
208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Callable;
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.CountDownLatch;
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Executors;
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutorService;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Future;
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledExecutorService;
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadPoolExecutor;
278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ExecutorsTest extends JSR166TestCase {
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
39e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    //     return new TestSuite(ExecutorsTest.class);
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A newCachedThreadPool can execute runnables
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewCachedThreadPool1() {
46e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newCachedThreadPool();
47e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
48e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
49e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
50e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
51e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A newCachedThreadPool with given ThreadFactory can execute runnables
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewCachedThreadPool2() {
58e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
59e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
60e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
61e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
62e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
63e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A newCachedThreadPool with null ThreadFactory throws NPE
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewCachedThreadPool3() {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ExecutorService e = Executors.newCachedThreadPool(null);
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new SingleThreadExecutor can execute runnables
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewSingleThreadExecutor1() {
80e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newSingleThreadExecutor();
81e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
82e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
83e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
84e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
85e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewSingleThreadExecutor2() {
92e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
93e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
94e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
95e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
96e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
97e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new SingleThreadExecutor with null ThreadFactory throws NPE
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewSingleThreadExecutor3() {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ExecutorService e = Executors.newSingleThreadExecutor(null);
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new SingleThreadExecutor cannot be casted to concrete implementation
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCastNewSingleThreadExecutor() {
114e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newSingleThreadExecutor();
115e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
116e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            try {
117e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
118e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                shouldThrow();
119e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            } catch (ClassCastException success) {}
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new newFixedThreadPool can execute runnables
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewFixedThreadPool1() {
127e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newFixedThreadPool(2);
128e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
129e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
130e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
131e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
132e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new newFixedThreadPool with given ThreadFactory can execute runnables
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewFixedThreadPool2() {
139e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
140e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
141e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
142e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
143e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
144e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new newFixedThreadPool with null ThreadFactory throws NPE
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewFixedThreadPool3() {
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ExecutorService e = Executors.newFixedThreadPool(2, null);
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new newFixedThreadPool with 0 threads throws IAE
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewFixedThreadPool4() {
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ExecutorService e = Executors.newFixedThreadPool(0);
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * An unconfigurable newFixedThreadPool can execute runnables
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testUnconfigurableExecutorService() {
171e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
172e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
173e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
174e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
175e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(new NoOpRunnable());
176e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * unconfigurableExecutorService(null) throws NPE
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testUnconfigurableExecutorServiceNPE() {
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ExecutorService e = Executors.unconfigurableExecutorService(null);
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * unconfigurableScheduledExecutorService(null) throws NPE
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testUnconfigurableScheduledExecutorServiceNPE() {
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a newSingleThreadScheduledExecutor successfully runs delayed task
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewSingleThreadScheduledExecutor() throws Exception {
203e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ScheduledExecutorService p = Executors.newSingleThreadScheduledExecutor();
204e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CountDownLatch proceed = new CountDownLatch(1);
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final Runnable task = new CheckedRunnable() {
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    await(proceed);
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  timeoutMillis(), MILLISECONDS);
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(f.isDone());
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            proceed.countDown();
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get());
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(f.isDone());
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(f.isCancelled());
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a newScheduledThreadPool successfully runs delayed task
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNewScheduledThreadPool() throws Exception {
227e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ScheduledExecutorService p = Executors.newScheduledThreadPool(2);
228e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CountDownLatch proceed = new CountDownLatch(1);
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final Runnable task = new CheckedRunnable() {
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    await(proceed);
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  timeoutMillis(), MILLISECONDS);
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(f.isDone());
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            proceed.countDown();
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get());
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(f.isDone());
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(f.isCancelled());
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * an unconfigurable newScheduledThreadPool successfully runs delayed task
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testUnconfigurableScheduledExecutorService() throws Exception {
251e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ScheduledExecutorService p =
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Executors.unconfigurableScheduledExecutorService
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            (Executors.newScheduledThreadPool(2));
254e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(p)) {
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CountDownLatch proceed = new CountDownLatch(1);
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final Runnable task = new CheckedRunnable() {
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    await(proceed);
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                  timeoutMillis(), MILLISECONDS);
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(f.isDone());
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            proceed.countDown();
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(Boolean.TRUE, f.get());
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(f.isDone());
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(f.isCancelled());
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Future.get on submitted tasks will time out if they compute too long.
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedCallable() throws Exception {
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ExecutorService[] executors = {
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Executors.newSingleThreadExecutor(),
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Executors.newCachedThreadPool(),
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Executors.newFixedThreadPool(2),
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Executors.newScheduledThreadPool(2),
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        };
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Runnable sleeper = new CheckedInterruptedRunnable() {
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                delay(LONG_DELAY_MS);
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Thread> threads = new ArrayList<Thread>();
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (final ExecutorService executor : executors) {
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threads.add(newStartedThread(new CheckedRunnable() {
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Future future = executor.submit(sleeper);
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertFutureTimesOut(future);
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }}));
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(thread);
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (ExecutorService executor : executors)
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            joinPool(executor);
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * ThreadPoolExecutor using defaultThreadFactory has
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * specified group, priority, daemon status, and name
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDefaultThreadFactory() throws Exception {
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Thread current = Thread.currentThread();
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(!current.isDaemon());
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    ThreadGroup g = current.getThreadGroup();
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    SecurityManager s = System.getSecurityManager();
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    if (s != null)
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertTrue(g == s.getThreadGroup());
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    else
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertTrue(g == egroup);
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    String name = current.getName();
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(name.endsWith("thread-1"));
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (SecurityException ok) {
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    // Also pass if not allowed to change setting
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                done.countDown();
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
330e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(e)) {
331e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            e.execute(r);
332e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            await(done);
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * ThreadPoolExecutor using privilegedThreadFactory has
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * specified group, priority, daemon status, name,
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * access control context and context class loader
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPrivilegedThreadFactory() throws Exception {
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch done = new CountDownLatch(1);
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
34705fd64ae4c92b1787a4cfa632ea1e6b3ceeeff91Narayan Kamath                // android-note: Removed unsupported access controller check.
34805fd64ae4c92b1787a4cfa632ea1e6b3ceeeff91Narayan Kamath                // final AccessControlContext thisacc = AccessController.getContext();
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Runnable r = new CheckedRunnable() {
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void realRun() {
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        Thread current = Thread.currentThread();
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertTrue(!current.isDaemon());
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        ThreadGroup g = current.getThreadGroup();
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        SecurityManager s = System.getSecurityManager();
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        if (s != null)
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                            assertTrue(g == s.getThreadGroup());
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        else
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                            assertTrue(g == egroup);
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        String name = current.getName();
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertTrue(name.endsWith("thread-1"));
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        assertSame(thisccl, current.getContextClassLoader());
363e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                        //assertEquals(thisacc, AccessController.getContext());
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        done.countDown();
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }};
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
367e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                try (PoolCleaner cleaner = cleaner(e)) {
368e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    e.execute(r);
369e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    await(done);
370e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        runWithPermissions(r,
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("getClassLoader"),
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("setContextClassLoader"),
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("modifyThread"));
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    boolean haveCCLPermissions() {
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SecurityManager sm = System.getSecurityManager();
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (sm != null) {
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                sm.checkPermission(new RuntimePermission("setContextClassLoader"));
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                sm.checkPermission(new RuntimePermission("getClassLoader"));
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (AccessControlException e) {
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return false;
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return true;
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCCL() {
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SecurityManager sm = System.getSecurityManager();
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (sm != null) {
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            sm.checkPermission(new RuntimePermission("setContextClassLoader"));
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            sm.checkPermission(new RuntimePermission("getClassLoader"));
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    class CheckCCL implements Callable<Object> {
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public Object call() {
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkCCL();
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return null;
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Without class loader permissions, creating
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * privilegedCallableUsingCurrentClassLoader throws ACE
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (System.getSecurityManager() == null)
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return;
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (AccessControlException success) {}
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        runWithoutPermissions(r);
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * With class loader permissions, calling
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * privilegedCallableUsingCurrentClassLoader does not throw ACE
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPrivilegedCallableUsingCCLWithPrivs() throws Exception {
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Executors.privilegedCallableUsingCurrentClassLoader
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    (new NoOpCallable())
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    .call();
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        runWithPermissions(r,
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("getClassLoader"),
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("setContextClassLoader"));
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Without permissions, calling privilegedCallable throws ACE
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPrivilegedCallableWithNoPrivs() throws Exception {
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // Avoid classloader-related SecurityExceptions in swingui.TestRunner
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Executors.privilegedCallable(new CheckCCL());
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (System.getSecurityManager() == null)
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return;
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Callable task = Executors.privilegedCallable(new CheckCCL());
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    task.call();
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (AccessControlException success) {}
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        runWithoutPermissions(r);
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // It seems rather difficult to test that the
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // AccessControlContext of the privilegedCallable is used
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // instead of its caller.  Below is a failed attempt to do
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // that, which does not work because the AccessController
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // cannot capture the internal state of the current Policy.
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // It would be much more work to differentiate based on,
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // e.g. CodeSource.
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//         final AccessControlContext[] noprivAcc = new AccessControlContext[1];
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//         final Callable[] task = new Callable[1];
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//         runWithPermissions
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//             (new CheckedRunnable() {
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                 public void realRun() {
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     if (System.getSecurityManager() == null)
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         return;
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     noprivAcc[0] = AccessController.getContext();
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     task[0] = Executors.privilegedCallable(new CheckCCL());
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     try {
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         AccessController.doPrivileged(new PrivilegedAction<Void>() {
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                           public Void run() {
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                               checkCCL();
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                               return null;
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                           }}, noprivAcc[0]);
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         shouldThrow();
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     } catch (AccessControlException success) {}
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                 }});
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//         runWithPermissions
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//             (new CheckedRunnable() {
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                 public void realRun() throws Exception {
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     if (System.getSecurityManager() == null)
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         return;
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     // Verify that we have an underprivileged ACC
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     try {
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         AccessController.doPrivileged(new PrivilegedAction<Void>() {
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                           public Void run() {
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                               checkCCL();
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                               return null;
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                                                           }}, noprivAcc[0]);
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         shouldThrow();
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     } catch (AccessControlException success) {}
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     try {
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         task[0].call();
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                         shouldThrow();
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                     } catch (AccessControlException success) {}
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//                 }},
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//              new RuntimePermission("getClassLoader"),
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//              new RuntimePermission("setContextClassLoader"));
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * With permissions, calling privilegedCallable succeeds
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPrivilegedCallableWithPrivs() throws Exception {
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Executors.privilegedCallable(new CheckCCL()).call();
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        runWithPermissions(r,
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("getClassLoader"),
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                           new RuntimePermission("setContextClassLoader"));
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(Runnable) returns null when called
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallable1() throws Exception {
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Callable c = Executors.callable(new NoOpRunnable());
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(c.call());
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(Runnable, result) returns result when called
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallable2() throws Exception {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Callable c = Executors.callable(new NoOpRunnable(), one);
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(one, c.call());
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(PrivilegedAction) returns its result when called
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallable3() throws Exception {
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Callable c = Executors.callable(new PrivilegedAction() {
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public Object run() { return one; }});
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(one, c.call());
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(PrivilegedExceptionAction) returns its result when called
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallable4() throws Exception {
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Callable c = Executors.callable(new PrivilegedExceptionAction() {
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public Object run() { return one; }});
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(one, c.call());
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(null Runnable) throws NPE
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallableNPE1() {
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Callable c = Executors.callable((Runnable) null);
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(null, result) throws NPE
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallableNPE2() {
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Callable c = Executors.callable((Runnable) null, one);
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(null PrivilegedAction) throws NPE
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallableNPE3() {
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Callable c = Executors.callable((PrivilegedAction) null);
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * callable(null PrivilegedExceptionAction) throws NPE
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCallableNPE4() {
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Callable c = Executors.callable((PrivilegedExceptionAction) null);
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
603