# HG changeset patch # User jjg # Date 1528496691 25200 # Node ID ee85241267942385bbe67f6baf55fa45830bd1b1 # Parent 6d021f0a2bf83d7d8bbea2d45166d511aba999f0 8204588: Test failures after "Launch Single-File Source-Code Programs" Reviewed-by: mchung diff -r 6d021f0a2bf8 -r ee8524126794 test/jdk/ProblemList.txt --- a/test/jdk/ProblemList.txt Mon Jun 04 15:11:17 2018 +0200 +++ b/test/jdk/ProblemList.txt Fri Jun 08 15:24:51 2018 -0700 @@ -822,8 +822,6 @@ # core_tools -tools/launcher/SourceMode.java 8204588 linux-all,macosx-all - tools/pack200/CommandLineTests.java 8059906 generic-all tools/jimage/JImageExtractTest.java 8198405,8198819 generic-all diff -r 6d021f0a2bf8 -r ee8524126794 test/jdk/tools/launcher/SourceMode.java --- a/test/jdk/tools/launcher/SourceMode.java Mon Jun 04 15:11:17 2018 +0200 +++ b/test/jdk/tools/launcher/SourceMode.java Fri Jun 08 15:24:51 2018 -0700 @@ -23,7 +23,7 @@ /* * @test - * @bug 8192920 + * @bug 8192920 8204588 * @summary Test source mode * @modules jdk.compiler * @run main SourceMode @@ -31,6 +31,7 @@ import java.io.IOException; +import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -48,78 +49,114 @@ new SourceMode().run(args); } + // to reduce the chance of creating shebang lines that are too long, + // we use a relative path to the java command if that is shorter + private final Path shortJavaCmd; + + private final PrintStream log; + + private final boolean skipShebangTest; + + SourceMode() { + Path cwd = Paths.get(System.getProperty("user.dir")); + Path cmd = Paths.get(javaCmd); + + if (isWindows) { + // Skip shebang tests on Windows, because that requires Cygwin. + shortJavaCmd = cmd; + skipShebangTest = true; + } else { + // Skip shebang tests if the path to the Java launcher is too long, + // because that will cause tests to overflow the mostly undocumented + // limit of 120 characters for a shebang line. + Path p = cwd.relativize(cmd); + shortJavaCmd = (p.toString().length() < cmd.toString().length()) ? p : cmd; + skipShebangTest = shortJavaCmd.toString().length() > 100; + } + + log = System.err; + } + // java Simple.java 1 2 3 @Test void testSimpleJava() throws IOException { + starting("testSimpleJava"); Path file = getSimpleFile("Simple.java", false); TestResult tr = doExec(javaCmd, file.toString(), "1", "2", "3"); if (!tr.isOK()) error(tr, "Bad exit code: " + tr.exitValue); if (!tr.contains("[1, 2, 3]")) error(tr, "Expected output not found"); - System.out.println(tr.testOutput); + show(tr); } // java --source 10 simple 1 2 3 @Test void testSimple() throws IOException { + starting("testSimple"); Path file = getSimpleFile("simple", false); TestResult tr = doExec(javaCmd, "--source", "10", file.toString(), "1", "2", "3"); if (!tr.isOK()) error(tr, "Bad exit code: " + tr.exitValue); if (!tr.contains("[1, 2, 3]")) error(tr, "Expected output not found"); - System.out.println(tr.testOutput); + show(tr); } // execSimple 1 2 3 @Test void testExecSimple() throws IOException { - if (isWindows) // Will not work without cygwin, pass silently + starting("testExecSimple"); + if (skipShebangTest) { + log.println("SKIPPED"); return; + } Path file = setExecutable(getSimpleFile("execSimple", true)); TestResult tr = doExec(file.toAbsolutePath().toString(), "1", "2", "3"); if (!tr.isOK()) error(tr, "Bad exit code: " + tr.exitValue); if (!tr.contains("[1, 2, 3]")) error(tr, "Expected output not found"); - System.out.println(tr.testOutput); + show(tr); } // java @simpleJava.at (contains Simple.java 1 2 3) @Test void testSimpleJavaAtFile() throws IOException { + starting("testSimpleJavaAtFile"); Path file = getSimpleFile("Simple.java", false); Path atFile = Paths.get("simpleJava.at"); - createFile(atFile.toFile(), List.of(file + " 1 2 3")); + createFile(atFile, List.of(file + " 1 2 3")); TestResult tr = doExec(javaCmd, "@" + atFile); if (!tr.isOK()) error(tr, "Bad exit code: " + tr.exitValue); if (!tr.contains("[1, 2, 3]")) error(tr, "Expected output not found"); - System.out.println(tr.testOutput); + show(tr); } // java @simple.at (contains --source 10 simple 1 2 3) @Test void testSimpleAtFile() throws IOException { + starting("testSimpleAtFile"); Path file = getSimpleFile("simple", false); Path atFile = Paths.get("simple.at"); - createFile(atFile.toFile(), List.of("--source 10 " + file + " 1 2 3")); + createFile(atFile, List.of("--source 10 " + file + " 1 2 3")); TestResult tr = doExec(javaCmd, "@" + atFile); if (!tr.isOK()) error(tr, "Bad exit code: " + tr.exitValue); if (!tr.contains("[1, 2, 3]")) error(tr, "Expected output not found"); - System.out.println(tr.testOutput); + show(tr); } // java -cp classes Main.java 1 2 3 @Test void testClasspath() throws IOException { + starting("testClasspath"); Path base = Files.createDirectories(Paths.get("testClasspath")); Path otherJava = base.resolve("Other.java"); - createFile(otherJava.toFile(), List.of( + createFile(otherJava, List.of( "public class Other {", " public static String join(String[] args) {", " return String.join(\"-\", args);", @@ -128,7 +165,7 @@ )); Path classes = Files.createDirectories(base.resolve("classes")); Path mainJava = base.resolve("Main.java"); - createFile(mainJava.toFile(), List.of( + createFile(mainJava, List.of( "class Main {", " public static void main(String[] args) {", " System.out.println(Other.join(args));", @@ -141,14 +178,15 @@ error(tr, "Bad exit code: " + tr.exitValue); if (!tr.contains("1-2-3")) error(tr, "Expected output not found"); - System.out.println(tr.testOutput); + show(tr); } // java --add-exports=... Export.java --help @Test void testAddExports() throws IOException { + starting("testAddExports"); Path exportJava = Paths.get("Export.java"); - createFile(exportJava.toFile(), List.of( + createFile(exportJava, List.of( "public class Export {", " public static void main(String[] args) {", " new com.sun.tools.javac.main.Main(\"demo\").compile(args);", @@ -159,6 +197,7 @@ TestResult tr1 = doExec(javaCmd, exportJava.toString(), "--help"); if (tr1.isOK()) error(tr1, "Compilation succeeded unexpectedly"); + show(tr1); // verify access succeeds with --add-exports TestResult tr2 = doExec(javaCmd, "--add-exports", "jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", @@ -167,15 +206,17 @@ error(tr2, "Bad exit code: " + tr2.exitValue); if (!(tr2.contains("demo") && tr2.contains("Usage"))) error(tr2, "Expected output not found"); + show(tr2); } // java -cp ... HelloWorld.java (for a class "java" in package "HelloWorld") @Test void testClassNamedJava() throws IOException { + starting("testClassNamedJava"); Path base = Files.createDirectories(Paths.get("testClassNamedJava")); Path src = Files.createDirectories(base.resolve("src")); Path srcfile = src.resolve("java.java"); - createFile(srcfile.toFile(), List.of( + createFile(srcfile, List.of( "package HelloWorld;", "class java {", " public static void main(String... args) {", @@ -191,22 +232,25 @@ error(tr, "Command failed"); if (!tr.contains("HelloWorld.java")) error(tr, "Expected output not found"); + show(tr); } // java --source @Test void testSourceNoArg() throws IOException { + starting("testSourceNoArg"); TestResult tr = doExec(javaCmd, "--source"); if (tr.isOK()) error(tr, "Command succeeded unexpectedly"); - System.err.println(tr); if (!tr.contains("--source requires source version")) error(tr, "Expected output not found"); + show(tr); } // java --source 10 -jar simple.jar @Test void testSourceJarConflict() throws IOException { + starting("testSourceJarConflict"); Path base = Files.createDirectories(Paths.get("testSourceJarConflict")); Path file = getSimpleFile("Simple.java", false); Path classes = Files.createDirectories(base.resolve("classes")); @@ -219,71 +263,101 @@ error(tr, "Command succeeded unexpectedly"); if (!tr.contains("Option -jar is not allowed with --source")) error(tr, "Expected output not found"); + show(tr); } // java --source 10 -m jdk.compiler @Test void testSourceModuleConflict() throws IOException { + starting("testSourceModuleConflict"); TestResult tr = doExec(javaCmd, "--source", "10", "-m", "jdk.compiler"); if (tr.isOK()) error(tr, "Command succeeded unexpectedly"); if (!tr.contains("Option -m is not allowed with --source")) error(tr, "Expected output not found"); + show(tr); } // #!.../java --source 10 -version @Test void testTerminalOptionInShebang() throws IOException { - if (isWindows) // Will not work without cygwin, pass silently + starting("testTerminalOptionInShebang"); + if (skipShebangTest) { + log.println("SKIPPED"); return; + } Path base = Files.createDirectories( Paths.get("testTerminalOptionInShebang")); Path bad = base.resolve("bad"); - createFile(bad.toFile(), List.of( - "#!" + javaCmd + " --source 10 -version")); + createFile(bad, List.of( + "#!" + shortJavaCmd + " --source 10 -version")); setExecutable(bad); TestResult tr = doExec(bad.toString()); if (!tr.contains("Option -version is not allowed in this context")) error(tr, "Expected output not found"); + show(tr); } // #!.../java --source 10 @bad.at (contains -version) @Test void testTerminalOptionInShebangAtFile() throws IOException { - if (isWindows) // Will not work without cygwin, pass silently + starting("testTerminalOptionInShebangAtFile"); + if (skipShebangTest) { + log.println("SKIPPED"); return; + } // Use a short directory name, to avoid line length limitations Path base = Files.createDirectories(Paths.get("testBadAtFile")); Path bad_at = base.resolve("bad.at"); - createFile(bad_at.toFile(), List.of("-version")); + createFile(bad_at, List.of("-version")); Path bad = base.resolve("bad"); - createFile(bad.toFile(), List.of( - "#!" + javaCmd + " --source 10 @" + bad_at)); + createFile(bad, List.of( + "#!" + shortJavaCmd + " --source 10 @" + bad_at)); setExecutable(bad); TestResult tr = doExec(bad.toString()); - System.err.println("JJG JJG " + tr); if (!tr.contains("Option -version in @testBadAtFile/bad.at is " + "not allowed in this context")) error(tr, "Expected output not found"); + show(tr); } // #!.../java --source 10 HelloWorld @Test void testMainClassInShebang() throws IOException { - if (isWindows) // Will not work without cygwin, pass silently + starting("testMainClassInShebang"); + if (skipShebangTest) { + log.println("SKIPPED"); return; + } Path base = Files.createDirectories(Paths.get("testMainClassInShebang")); Path bad = base.resolve("bad"); - createFile(bad.toFile(), List.of( - "#!" + javaCmd + " --source 10 HelloWorld")); + createFile(bad, List.of( + "#!" + shortJavaCmd + " --source 10 HelloWorld")); setExecutable(bad); TestResult tr = doExec(bad.toString()); if (!tr.contains("Cannot specify main class in this context")) error(tr, "Expected output not found"); + show(tr); } //-------------------------------------------------------------------------- + private void starting(String label) { + System.out.println(); + System.out.println("*** Starting: " + label + " (stdout)"); + + System.err.println(); + System.err.println("*** Starting: " + label + " (stderr)"); + } + + private void show(TestResult tr) { + log.println("*** Test Output:"); + for (String line: tr.testOutput) { + log.println(line); + } + log.println("*** End Of Test Output:"); + } + private Map getLauncherDebugEnv() { return Map.of("_JAVA_LAUNCHER_DEBUG", "1"); } @@ -291,8 +365,8 @@ private Path getSimpleFile(String name, boolean shebang) throws IOException { Path file = Paths.get(name); if (!Files.exists(file)) { - createFile(file.toFile(), List.of( - (shebang ? "#!" + javaCmd + " --source 10" : ""), + createFile(file, List.of( + (shebang ? "#!" + shortJavaCmd + " --source 10" : ""), "public class Simple {", " public static void main(String[] args) {", " System.out.println(java.util.Arrays.toString(args));", @@ -301,6 +375,21 @@ return file; } + private void createFile(Path file, List lines) throws IOException { + lines.stream() + .filter(line -> line.length() > 128) + .forEach(line -> { + log.println("*** Warning: long line (" + + line.length() + + " chars) in file " + file); + log.println("*** " + line); + }); + log.println("*** File: " + file); + lines.stream().forEach(log::println); + log.println("*** End Of File"); + createFile(file.toFile(), lines); + } + private Path setExecutable(Path file) throws IOException { Set perms = Files.getPosixFilePermissions(file); perms.add(PosixFilePermission.OWNER_EXECUTE); @@ -309,7 +398,7 @@ } private void error(TestResult tr, String message) { - System.err.println(tr); + show(tr); throw new RuntimeException(message); } } diff -r 6d021f0a2bf8 -r ee8524126794 test/langtools/ProblemList.txt --- a/test/langtools/ProblemList.txt Mon Jun 04 15:11:17 2018 +0200 +++ b/test/langtools/ProblemList.txt Fri Jun 08 15:24:51 2018 -0700 @@ -57,7 +57,6 @@ tools/javac/modules/SourceInSymlinkTest.java 8180263 windows-all fails when run on a subst drive tools/javac/options/release/ReleaseOptionUnsupported.java 8193784 generic-all temporary until support for --release 11 is worked out tools/javac/importscope/T8193717.java 8203925 generic-all the test requires too much memory -tools/javac/launcher/SourceLauncherTest.java 8204588 windows-all New test needs adjusting for Windows ########################################################################### # diff -r 6d021f0a2bf8 -r ee8524126794 test/langtools/tools/javac/launcher/SourceLauncherTest.java --- a/test/langtools/tools/javac/launcher/SourceLauncherTest.java Mon Jun 04 15:11:17 2018 +0200 +++ b/test/langtools/tools/javac/launcher/SourceLauncherTest.java Fri Jun 08 15:24:51 2018 -0700 @@ -23,7 +23,7 @@ /* * @test - * @bug 8192920 + * @bug 8192920 8204588 * @summary Test source launcher * @library /tools/lib * @modules jdk.compiler/com.sun.tools.javac.api @@ -34,6 +34,7 @@ */ import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; @@ -281,8 +282,9 @@ List javacArgs = List.of("-classpath", auxSrc.toString()); List classArgs = List.of("1", "2", "3"); + String FS = File.separator; String expectStdErr = - "testNoSourceOnClassPath/mainSrc/HelloWorld.java:4: error: cannot find symbol\n" + + "testNoSourceOnClassPath" + FS + "mainSrc" + FS + "HelloWorld.java:4: error: cannot find symbol\n" + " System.out.println(Aux.MESSAGE + Arrays.toString(args));\n" + " ^\n" + " symbol: variable Aux\n" +