8176551: testCommonPoolThreadContextClassLoader fails with "Should throw SecurityException"
Reviewed-by: martin, chegar, dholmes, amlu
--- 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());
}
}