# HG changeset patch # User dl # Date 1489500290 25200 # Node ID 321026ad5f1afdf4cf252a85cdffea0fd2aea904 # Parent af577b8d7b2fc4421691432345e7224e85960f77 8176551: testCommonPoolThreadContextClassLoader fails with "Should throw SecurityException" Reviewed-by: martin, chegar, dholmes, amlu diff -r af577b8d7b2f -r 321026ad5f1a jdk/test/java/util/concurrent/tck/ForkJoinPool9Test.java --- a/jdk/test/java/util/concurrent/tck/ForkJoinPool9Test.java Tue Mar 14 08:35:52 2017 -0400 +++ b/jdk/test/java/util/concurrent/tck/ForkJoinPool9Test.java Tue Mar 14 07:04:50 2017 -0700 @@ -32,9 +32,14 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; -import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.Future; import junit.framework.Test; import junit.framework.TestSuite; @@ -53,29 +58,43 @@ */ public void testCommonPoolThreadContextClassLoader() throws Throwable { if (!testImplementationDetails) return; + + // Ensure common pool has at least one real thread + String prop = System.getProperty( + "java.util.concurrent.ForkJoinPool.common.parallelism"); + if ("0".equals(prop)) return; + VarHandle CCL = MethodHandles.privateLookupIn(Thread.class, MethodHandles.lookup()) .findVarHandle(Thread.class, "contextClassLoader", ClassLoader.class); ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); boolean haveSecurityManager = (System.getSecurityManager() != null); - CompletableFuture.runAsync( - () -> { - assertSame(systemClassLoader, - Thread.currentThread().getContextClassLoader()); - assertSame(systemClassLoader, - CCL.get(Thread.currentThread())); - if (haveSecurityManager) - assertThrows( - SecurityException.class, - () -> System.getProperty("foo"), - () -> Thread.currentThread().setContextClassLoader(null)); - - // TODO ? -// if (haveSecurityManager -// && Thread.currentThread().getClass().getSimpleName() -// .equals("InnocuousForkJoinWorkerThread")) -// assertThrows(SecurityException.class, /* ?? */); - }).join(); + CountDownLatch taskStarted = new CountDownLatch(1); + Runnable runInCommonPool = () -> { + taskStarted.countDown(); + assertTrue(ForkJoinTask.inForkJoinPool()); + assertSame(ForkJoinPool.commonPool(), + ForkJoinTask.getPool()); + assertSame(systemClassLoader, + Thread.currentThread().getContextClassLoader()); + assertSame(systemClassLoader, + CCL.get(Thread.currentThread())); + if (haveSecurityManager) + assertThrows( + SecurityException.class, + () -> System.getProperty("foo"), + () -> Thread.currentThread().setContextClassLoader(null)); + // TODO ? +// if (haveSecurityManager +// && Thread.currentThread().getClass().getSimpleName() +// .equals("InnocuousForkJoinWorkerThread")) +// assertThrows(SecurityException.class, /* ?? */); + }; + Future f = ForkJoinPool.commonPool().submit(runInCommonPool); + // Ensure runInCommonPool is truly running in the common pool, + // by giving this thread no opportunity to "help" on get(). + assertTrue(taskStarted.await(LONG_DELAY_MS, MILLISECONDS)); + assertNull(f.get()); } }