From 5a7ecc5b784bb34fac9a4c0f64da0aacd953333b Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Wed, 4 Jan 2017 09:50:21 -0800 Subject: [PATCH] 8172215: java launcher no longer accepts -cp "" empty string Reviewed-by: alanb, dholmes, psandoz --- jdk/src/java.base/share/native/libjli/java.c | 3 +- ...ourceBuilder.java => ModuleInfoMaker.java} | 4 +- .../AddExportsTestWarningError.java | 4 +- .../addreads/AddReadsTestWarningError.java | 4 +- .../modules/classpath/JavaClassPathTest.java | 39 +++++++++++++------ 5 files changed, 36 insertions(+), 18 deletions(-) rename jdk/test/lib/testlibrary/{ModuleSourceBuilder.java => ModuleInfoMaker.java} (98%) diff --git a/jdk/src/java.base/share/native/libjli/java.c b/jdk/src/java.base/share/native/libjli/java.c index 645d7321093..ff533f70edc 100644 --- a/jdk/src/java.base/share/native/libjli/java.c +++ b/jdk/src/java.base/share/native/libjli/java.c @@ -1248,6 +1248,7 @@ ParseArguments(int *pargc, char ***pargv, char *value = NULL; int kind = GetOpt(&argc, &argv, &option, &value); jboolean has_arg = value != NULL && JLI_StrLen(value) > 0; + jboolean has_arg_any_len = value != NULL; /* * Option to set main entry point @@ -1269,7 +1270,7 @@ ParseArguments(int *pargc, char ***pargv, JLI_StrCCmp(arg, "--class-path=") == 0 || JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) { - REPORT_ERROR (has_arg, ARG_ERROR1, arg); + REPORT_ERROR (has_arg_any_len, ARG_ERROR1, arg); SetClassPath(value); mode = LM_CLASS; } else if (JLI_StrCmp(arg, "--list-modules") == 0 || diff --git a/jdk/test/lib/testlibrary/ModuleSourceBuilder.java b/jdk/test/lib/testlibrary/ModuleInfoMaker.java similarity index 98% rename from jdk/test/lib/testlibrary/ModuleSourceBuilder.java rename to jdk/test/lib/testlibrary/ModuleInfoMaker.java index 3d116495c6e..5e4f15a6774 100644 --- a/jdk/test/lib/testlibrary/ModuleSourceBuilder.java +++ b/jdk/test/lib/testlibrary/ModuleInfoMaker.java @@ -35,7 +35,7 @@ import static org.testng.Assert.assertTrue; /** * Utility class for creating test modules. */ -public class ModuleSourceBuilder { +public class ModuleInfoMaker { private static String MODULE_INFO_JAVA = "module-info.java"; private static Pattern MODULE_PATTERN = Pattern.compile("module\\s+((?:\\w+\\.)*)"); @@ -45,7 +45,7 @@ public class ModuleSourceBuilder { Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); private final Path dir; - public ModuleSourceBuilder(Path dir) { + public ModuleInfoMaker(Path dir) { this.dir = dir; } diff --git a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java index 5df7f0d50aa..ed2f7c0d7a8 100644 --- a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java +++ b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java @@ -27,7 +27,7 @@ * @summary Basic argument validation for --add-exports * @library /lib/testlibrary * @modules jdk.compiler - * @build AddExportsTestWarningError CompilerUtils ModuleSourceBuilder + * @build AddExportsTestWarningError CompilerUtils ModuleInfoMaker * @build jdk.testlibrary.* * @run testng AddExportsTestWarningError */ @@ -59,7 +59,7 @@ public class AddExportsTestWarningError { @BeforeTest public void setup() throws Exception { - ModuleSourceBuilder builder = new ModuleSourceBuilder(SRC_DIR); + ModuleInfoMaker builder = new ModuleInfoMaker(SRC_DIR); builder.writeJavaFiles("m1", "module m1 { }", "package p1; public class C1 { " + diff --git a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java index 325ca322522..5b8558350ef 100644 --- a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java +++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java @@ -27,7 +27,7 @@ * @summary Basic argument validation for --add-reads * @library /lib/testlibrary * @modules jdk.compiler - * @build AddReadsTestWarningError CompilerUtils ModuleSourceBuilder + * @build AddReadsTestWarningError CompilerUtils ModuleInfoMaker * @build jdk.testlibrary.* * @run testng AddReadsTestWarningError */ @@ -59,7 +59,7 @@ public class AddReadsTestWarningError { @BeforeTest public void setup() throws Exception { - ModuleSourceBuilder builder = new ModuleSourceBuilder(SRC_DIR); + ModuleInfoMaker builder = new ModuleInfoMaker(SRC_DIR); builder.writeJavaFiles("m1", "module m1 { requires m4; }", "package p1; public class C1 { " + diff --git a/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java b/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java index 634a27fa95c..afac4220b13 100644 --- a/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java +++ b/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java @@ -95,19 +95,20 @@ public class JavaClassPathTest { public Object[][] classpath() { return new Object[][]{ // true indicates that class path default to current working directory - { "", "." }, - { "-Djava.class.path", "." }, - { "-Djava.class.path=", "" }, - { "-Djava.class.path=.", "." }, + { List.of(), "." }, + { List.of("-cp", ""), "" }, + { List.of("-cp", "."), "." }, + { List.of("-Djava.class.path"), "." }, + { List.of("-Djava.class.path="), "" }, + { List.of("-Djava.class.path=."), "." }, }; } @Test(dataProvider = "classpath") - public void testUnnamedModule(String option, String expected) throws Throwable { - List args = new ArrayList<>(); - if (!option.isEmpty()) { - args.add(option); - } + public void testUnnamedModule(List options, String expected) + throws Throwable + { + List args = new ArrayList<>(options); args.add(TEST_MAIN); args.add(Boolean.toString(true)); args.add(expected); @@ -195,8 +196,12 @@ public class JavaClassPathTest { } private OutputAnalyzer execute(List options) throws Throwable { - ProcessBuilder pb = - createJavaProcessBuilder(options.toArray(new String[0])); + ProcessBuilder pb = createJavaProcessBuilder( + options.stream() + .map(this::autoQuote) + .toArray(String[]::new) + ); + Map env = pb.environment(); // remove CLASSPATH environment variable String value = env.remove("CLASSPATH"); @@ -205,4 +210,16 @@ public class JavaClassPathTest { .errorTo(System.out); } + private static final boolean IS_WINDOWS + = System.getProperty("os.name").startsWith("Windows"); + + /* + * Autoquote empty string argument on Windows + */ + private String autoQuote(String arg) { + if (IS_WINDOWS && arg.isEmpty()) { + return "\"\""; + } + return arg; + } }