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