OpenJDK / jdk / hs
changeset 42837:03ee805ba348
8169005: tools/javac/T8132562/ClassPathWithDoubleQuotesTest.java fails after fix to JDK-8132562
Reviewed-by: jjg
author | vromero |
---|---|
date | Sat, 17 Dec 2016 16:57:14 -0500 |
parents | 1d55dcc9a118 |
children | 3f9144d15025 |
files | langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties langtools/test/ProblemList.txt langtools/test/tools/javac/T8132562/ClassPathWithDoubleQuotesTest.java langtools/test/tools/javac/diags/examples.not-yet.txt langtools/test/tools/lib/toolbox/TestRunner.java |
diffstat | 6 files changed, 84 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Fri Dec 16 11:58:18 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Sat Dec 17 16:57:14 2016 -0500 @@ -73,6 +73,7 @@ import javax.tools.StandardLocation; import com.sun.tools.javac.code.Lint; +import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.main.Option; import com.sun.tools.javac.resources.CompilerProperties.Errors; import com.sun.tools.javac.resources.CompilerProperties.Warnings; @@ -207,7 +208,13 @@ entries.add(emptyPathDefault); } } else { - entries.add(getPath(s)); + try { + entries.add(getPath(s)); + } catch (IllegalArgumentException e) { + if (warn) { + log.warning(LintCategory.PATH, "invalid.path", s); + } + } } } return entries;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Dec 16 11:58:18 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Sat Dec 17 16:57:14 2016 -0500 @@ -1697,6 +1697,9 @@ compiler.warn.deprecated.annotation.has.no.effect=\ @Deprecated annotation has no effect on this {0} declaration +compiler.warn.invalid.path=\ + Invalid filename: {0} + compiler.warn.invalid.archive.file=\ Unexpected file on path: {0}
--- a/langtools/test/ProblemList.txt Fri Dec 16 11:58:18 2016 -0800 +++ b/langtools/test/ProblemList.txt Sat Dec 17 16:57:14 2016 -0500 @@ -58,7 +58,6 @@ tools/javac/annotations/typeAnnotations/referenceinfos/NestedTypes.java 8057687 generic-all emit correct byte code an attributes for type annotations tools/javac/warnings/suppress/TypeAnnotations.java 8057683 generic-all improve ordering of errors with type annotations tools/javac/modules/T8159439/NPEForModuleInfoWithNonZeroSuperClassTest.java 8160396 generic-all current version of jtreg needs a new promotion to include lastes version of ASM -tools/javac/T8132562/ClassPathWithDoubleQuotesTest.java 8169005 windows-all ########################################################################### #
--- a/langtools/test/tools/javac/T8132562/ClassPathWithDoubleQuotesTest.java Fri Dec 16 11:58:18 2016 -0800 +++ b/langtools/test/tools/javac/T8132562/ClassPathWithDoubleQuotesTest.java Sat Dec 17 16:57:14 2016 -0500 @@ -28,6 +28,7 @@ * @library /tools/lib * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main + * jdk.compiler/com.sun.tools.javac.util * @build toolbox.ToolBox toolbox.JavacTask * @run main ClassPathWithDoubleQuotesTest */ @@ -36,6 +37,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import com.sun.tools.javac.util.Assert; import toolbox.TestRunner; import toolbox.JarTask; import toolbox.JavacTask; @@ -46,9 +48,29 @@ ToolBox tb; - private static final String ASrc = "public class A {}"; + private static final String ASrc = "public class A { J j; B b;}"; + private static final String BSrc = "public class B {}"; private static final String JarSrc = "public class J {}"; - private static final String[] jarArgs = {"cf", "test/J.jar", "-C", "test", "J.java"}; + private static final String[] jarArgs = {"cf", "test/jarOut/J.jar", "-C", "test/jarSrc", "J.java"}; + public static final String NEW_LINE = System.getProperty("line.separator"); + private static final String expectedFailureOutput1 = + "A.java:1:18: compiler.err.cant.resolve.location: kindname.class, J, , , (compiler.misc.location: kindname.class, A, null)" + NEW_LINE + + "A.java:1:23: compiler.err.cant.resolve.location: kindname.class, B, , , (compiler.misc.location: kindname.class, A, null)" + NEW_LINE + + "2 errors" + NEW_LINE; + private static final String expectedFailureOutput2A = + "- compiler.warn.invalid.path: \"test/jarOut/J.jar" + NEW_LINE + + "- compiler.warn.invalid.path: test/src\"" + NEW_LINE + + "A.java:1:18: compiler.err.cant.resolve.location: kindname.class, J, , , (compiler.misc.location: kindname.class, A, null)" + NEW_LINE + + "A.java:1:23: compiler.err.cant.resolve.location: kindname.class, B, , , (compiler.misc.location: kindname.class, A, null)" + NEW_LINE + + "2 errors" + NEW_LINE + + "2 warnings" + NEW_LINE; + private static final String expectedFailureOutput2B = + "- compiler.warn.path.element.not.found: \"test/jarOut/J.jar" + NEW_LINE + + "- compiler.warn.path.element.not.found: test/src\"" + NEW_LINE + + "A.java:1:18: compiler.err.cant.resolve.location: kindname.class, J, , , (compiler.misc.location: kindname.class, A, null)" + NEW_LINE + + "A.java:1:23: compiler.err.cant.resolve.location: kindname.class, B, , , (compiler.misc.location: kindname.class, A, null)" + NEW_LINE + + "2 errors" + NEW_LINE + + "2 warnings" + NEW_LINE; public static void main(String... args) throws Exception { new ClassPathWithDoubleQuotesTest().runTests(); @@ -66,32 +88,56 @@ @Test public void test(Path base) throws Exception { Path current = base.resolve("."); - tb.writeJavaFiles(current, ASrc, JarSrc); + Path jarSrc = current.resolve("jarSrc"); + tb.writeJavaFiles(jarSrc, JarSrc); + Path jarOut = current.resolve("jarOut"); + tb.createDirectories(jarOut); new JarTask(tb).run(jarArgs).writeAll(); - executeTask(new JavacTask(tb, Task.Mode.EXEC) - .envVar("CLASSPATH", "\"test/J.jar" + File.pathSeparator + "test\"") - .files("test/A.java")); + Path src = current.resolve("src"); + tb.writeJavaFiles(src, ASrc, BSrc); - executeTask(new JavacTask(tb) - .classpath("\"test/J.jar" + File.pathSeparator + "test\"") - .files("test/A.java")); - } + /** In any system there can be three possible scenarios: + * 1 - The system swallows the problem character (the quote in this case) + * and the test case compiles + * 2 - The problem character gets into javac, but it's not bad enough to trigger + * InvalidPathException, but it does mean you can't find the file you're looking for + * 3 - The problem character gets into javac and is bad enough to trigger + * InvalidPathException, in which case javac needs to handle the exception in a reasonable way. + */ + + // testing scenario 1 + System.err.println("invoking javac EXEC mode without double quotes in the CLASSPATH env variable"); + new JavacTask(tb, Task.Mode.EXEC) + .envVar("CLASSPATH", "test/jarOut/J.jar" + File.pathSeparator + "test/src") + .files("test/src/A.java").run(Task.Expect.SUCCESS); + System.err.println("successful compilation"); + System.err.println(); - void executeTask(JavacTask task) { - boolean isWindows = System.getProperty("os.name").startsWith("Windows"); - Task.Expect whatToExpect = isWindows ? Task.Expect.FAIL : Task.Expect.SUCCESS; - try { - task.run(whatToExpect); - if (isWindows) { - throw new AssertionError("exception must be thrown"); - } - } catch (IllegalArgumentException iae) { - if (!isWindows) { - throw new AssertionError("exception unexpectedly thrown"); - } - } catch (Throwable t) { - throw new AssertionError("unexpected exception thrown"); - } + // testing scenario 2 + System.err.println("Simulate a system in which double quotes are preserved in the environment variable," + + "and for which they are a legal filename character"); + String log = new JavacTask(tb, Task.Mode.EXEC) + .envVar("CLASSPATH", "Ztest/jarOut/J.jar" + File.pathSeparator + "test/srcZ") + .options("-XDrawDiagnostics") + .files("test/src/A.java").run(Task.Expect.FAIL) + .writeAll() + .getOutput(Task.OutputKind.STDERR); + Assert.check(log.equals(expectedFailureOutput1), "unexpected output"); + System.err.println("compilation is expected to fail"); + System.err.println(); + + // testing scenario 3 + System.err.println("invoking javac EXEC mode with double quotes in the CLASSPATH env variable"); + String log2 = new JavacTask(tb, Task.Mode.EXEC) + .envVar("CLASSPATH", "\"test/jarOut/J.jar" + File.pathSeparator + "test/src\"") + .options("-Xlint:path", "-XDrawDiagnostics") + .files("test/src/A.java").run(Task.Expect.FAIL) + .writeAll() + .getOutput(Task.OutputKind.STDERR); + System.err.println(); + System.err.println("the log:" + log2); + Assert.check(log2.equals(expectedFailureOutput2A) || log2.equals(expectedFailureOutput2B), + "unexpected output"); } }
--- a/langtools/test/tools/javac/diags/examples.not-yet.txt Fri Dec 16 11:58:18 2016 -0800 +++ b/langtools/test/tools/javac/diags/examples.not-yet.txt Sat Dec 17 16:57:14 2016 -0500 @@ -114,6 +114,7 @@ compiler.misc.bad.class.file # class file is malformed compiler.misc.bad.const.pool.entry # constant pool entry has wrong type compiler.warn.access.to.member.from.serializable.lambda # in order to generate it we need to modify a restricted package +compiler.warn.invalid.path # this warning is generated only in Windows systems # The following module-related messages will have to stay on the not-yet list for various reasons: compiler.warn.locn.unknown.file.on.module.path # Never issued ATM (short circuited with an if (false))
--- a/langtools/test/tools/lib/toolbox/TestRunner.java Fri Dec 16 11:58:18 2016 -0800 +++ b/langtools/test/tools/lib/toolbox/TestRunner.java Sat Dec 17 16:57:14 2016 -0500 @@ -90,7 +90,7 @@ } catch (InvocationTargetException e) { errorCount++; Throwable cause = e.getCause(); - out.println("Exception: " + e.getCause()); + out.println("Exception running test " + testName + ": " + e.getCause()); cause.printStackTrace(out); } out.println();