test/jdk/tools/launcher/SourceMode.java
author jjg
Fri, 21 Sep 2018 15:38:43 -0700
changeset 51841 f191aca8f96d
parent 51213 24c4780f69a5
permissions -rw-r--r--
8210275: Source Launcher should fail if --source is used without a source file Reviewed-by: mchung, alanb, mcimadamore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     1
/*
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     2
 * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     4
 *
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     8
 *
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    13
 * accompanied this code).
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    14
 *
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    18
 *
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    21
 * questions.
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    22
 */
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    23
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
    24
/**
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    25
 * @test
51841
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
    26
 * @bug 8192920 8204588 8210275
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    27
 * @summary Test source mode
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    28
 * @modules jdk.compiler jdk.jlink
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    29
 * @run main SourceMode
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    30
 */
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    31
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    32
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    33
import java.io.IOException;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    34
import java.io.PrintStream;
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    35
import java.nio.file.Files;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    36
import java.nio.file.Path;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    37
import java.nio.file.Paths;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    38
import java.nio.file.attribute.PosixFilePermission;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    39
import java.util.ArrayList;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    40
import java.util.Arrays;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    41
import java.util.HashMap;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    42
import java.util.List;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    43
import java.util.Map;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    44
import java.util.Set;
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    45
import java.util.spi.ToolProvider;
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    46
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    47
public class SourceMode extends TestHelper {
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    48
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    49
    public static void main(String... args) throws Exception {
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    50
        new SourceMode().run(args);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    51
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    52
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    53
    // To reduce the chance of creating shebang lines that are too long,
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    54
    // use a shorter path for a java command if the standard path is too long.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    55
    private final Path shebangJavaCmd;
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    56
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    57
    // Whether or not to automatically skip the shebang tests
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    58
    private final boolean skipShebangTest;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    59
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    60
    private final PrintStream log;
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    61
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    62
    private static final String thisVersion = System.getProperty("java.specification.version");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    63
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    64
    SourceMode() throws Exception {
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    65
        log = System.err;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    66
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    67
        if (isWindows) {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    68
            // Skip shebang tests on Windows, because that requires Cygwin.
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    69
            skipShebangTest = true;
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    70
            shebangJavaCmd = null;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    71
        } else {
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    72
            // Try to ensure the path to the Java launcher is reasonably short,
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    73
            // to work around the mostly undocumented limit of 120 characters
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    74
            // for a shebang line.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    75
            // The value of 120 is the typical kernel compile-time buffer limit.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    76
            // The following limit of 80 allows room for arguments to be placed
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    77
            // after the path to the launcher on the shebang line.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    78
            Path cmd = Paths.get(javaCmd);
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    79
            if (cmd.toString().length() < 80) {
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    80
                shebangJavaCmd = cmd;
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    81
            } else {
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    82
                // Create a small image in the current directory, such that
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    83
                // the path for the launcher is just "tmpJDK/bin/java".
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    84
                Path tmpJDK = Paths.get("tmpJDK");
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    85
                ToolProvider jlink = ToolProvider.findFirst("jlink")
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    86
                    .orElseThrow(() -> new Exception("cannot find jlink"));
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    87
                jlink.run(System.out, System.err,
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    88
                    "--add-modules", "jdk.compiler,jdk.zipfs", "--output", tmpJDK.toString());
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    89
                shebangJavaCmd = tmpJDK.resolve("bin").resolve("java");
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    90
            }
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    91
            log.println("Using java command: " + shebangJavaCmd);
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
    92
            skipShebangTest = false;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    93
        }
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    94
    }
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    95
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    96
    // java Simple.java 1 2 3
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    97
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
    98
    void testSimpleJava() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
    99
        starting("testSimpleJava");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   100
        Path file = getSimpleFile("Simple.java", false);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   101
        TestResult tr = doExec(javaCmd, file.toString(), "1", "2", "3");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   102
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   103
            error(tr, "Bad exit code: " + tr.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   104
        if (!tr.contains("[1, 2, 3]"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   105
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   106
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   107
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   108
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   109
    // java --source N simple 1 2 3
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   110
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   111
    void testSimple() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   112
        starting("testSimple");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   113
        Path file = getSimpleFile("simple", false);
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   114
        TestResult tr = doExec(javaCmd, "--source", thisVersion, file.toString(), "1", "2", "3");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   115
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   116
            error(tr, "Bad exit code: " + tr.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   117
        if (!tr.contains("[1, 2, 3]"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   118
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   119
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   120
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   121
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   122
    // execSimple 1 2 3
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   123
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   124
    void testExecSimple() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   125
        starting("testExecSimple");
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   126
        if (skipShebangTest) {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   127
            log.println("SKIPPED");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   128
            return;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   129
        }
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   130
        Path file = setExecutable(getSimpleFile("execSimple", true));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   131
        TestResult tr = doExec(file.toAbsolutePath().toString(), "1", "2", "3");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   132
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   133
            error(tr, "Bad exit code: " + tr.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   134
        if (!tr.contains("[1, 2, 3]"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   135
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   136
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   137
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   138
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   139
    // java @simpleJava.at  (contains Simple.java 1 2 3)
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   140
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   141
    void testSimpleJavaAtFile() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   142
        starting("testSimpleJavaAtFile");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   143
        Path file = getSimpleFile("Simple.java", false);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   144
        Path atFile = Paths.get("simpleJava.at");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   145
        createFile(atFile, List.of(file + " 1 2 3"));
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   146
        TestResult tr = doExec(javaCmd, "@" + atFile);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   147
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   148
            error(tr, "Bad exit code: " + tr.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   149
        if (!tr.contains("[1, 2, 3]"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   150
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   151
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   152
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   153
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   154
    // java @simple.at  (contains --source N simple 1 2 3)
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   155
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   156
    void testSimpleAtFile() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   157
        starting("testSimpleAtFile");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   158
        Path file = getSimpleFile("simple", false);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   159
        Path atFile = Paths.get("simple.at");
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   160
        createFile(atFile, List.of("--source " + thisVersion + " " + file + " 1 2 3"));
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   161
        TestResult tr = doExec(javaCmd, "@" + atFile);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   162
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   163
            error(tr, "Bad exit code: " + tr.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   164
        if (!tr.contains("[1, 2, 3]"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   165
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   166
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   167
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   168
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   169
    // java -cp classes Main.java 1 2 3
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   170
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   171
    void testClasspath() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   172
        starting("testClasspath");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   173
        Path base = Files.createDirectories(Paths.get("testClasspath"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   174
        Path otherJava = base.resolve("Other.java");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   175
        createFile(otherJava, List.of(
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   176
            "public class Other {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   177
            "  public static String join(String[] args) {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   178
            "    return String.join(\"-\", args);",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   179
            "  }",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   180
            "}"
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   181
        ));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   182
        Path classes = Files.createDirectories(base.resolve("classes"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   183
        Path mainJava = base.resolve("Main.java");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   184
        createFile(mainJava, List.of(
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   185
            "class Main {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   186
            "  public static void main(String[] args) {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   187
            "    System.out.println(Other.join(args));",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   188
            "  }}"
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   189
        ));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   190
        compile("-d", classes.toString(), otherJava.toString());
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   191
        TestResult tr = doExec(javaCmd, "-cp", classes.toString(),
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   192
                mainJava.toString(), "1", "2", "3");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   193
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   194
            error(tr, "Bad exit code: " + tr.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   195
        if (!tr.contains("1-2-3"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   196
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   197
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   198
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   199
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   200
    // java --add-exports=... Export.java --help
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   201
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   202
    void testAddExports() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   203
        starting("testAddExports");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   204
        Path exportJava = Paths.get("Export.java");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   205
        createFile(exportJava, List.of(
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   206
            "public class Export {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   207
            "  public static void main(String[] args) {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   208
            "    new com.sun.tools.javac.main.Main(\"demo\").compile(args);",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   209
            "  }",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   210
            "}"
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   211
        ));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   212
        // verify access fails without --add-exports
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   213
        TestResult tr1 = doExec(javaCmd, exportJava.toString(), "--help");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   214
        if (tr1.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   215
            error(tr1, "Compilation succeeded unexpectedly");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   216
        show(tr1);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   217
        // verify access succeeds with --add-exports
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   218
        TestResult tr2 = doExec(javaCmd,
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   219
            "--add-exports", "jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   220
            exportJava.toString(), "--help");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   221
        if (!tr2.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   222
            error(tr2, "Bad exit code: " + tr2.exitValue);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   223
        if (!(tr2.contains("demo") && tr2.contains("Usage")))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   224
            error(tr2, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   225
        show(tr2);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   226
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   227
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   228
    // java -cp ... HelloWorld.java  (for a class "java" in package "HelloWorld")
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   229
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   230
    void testClassNamedJava() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   231
        starting("testClassNamedJava");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   232
        Path base = Files.createDirectories(Paths.get("testClassNamedJava"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   233
        Path src = Files.createDirectories(base.resolve("src"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   234
        Path srcfile = src.resolve("java.java");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   235
        createFile(srcfile, List.of(
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   236
                "package HelloWorld;",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   237
                "class java {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   238
                "    public static void main(String... args) {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   239
                "        System.out.println(HelloWorld.java.class.getName());",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   240
                "    }",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   241
                "}"
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   242
        ));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   243
        Path classes = base.resolve("classes");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   244
        compile("-d", classes.toString(), srcfile.toString());
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   245
        TestResult tr =
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   246
            doExec(javaCmd, "-cp", classes.toString(), "HelloWorld.java");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   247
        if (!tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   248
            error(tr, "Command failed");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   249
        if (!tr.contains("HelloWorld.java"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   250
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   251
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   252
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   253
51841
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   254
    // java --source N -cp ... HelloWorld
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   255
    @Test
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   256
    void testSourceClasspath() throws IOException {
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   257
        starting("testSourceClasspath");
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   258
        Path base = Files.createDirectories(Paths.get("testSourceClasspath"));
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   259
        Path src = Files.createDirectories(base.resolve("src"));
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   260
        Path srcfile = src.resolve("java.java");
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   261
        createFile(srcfile, List.of(
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   262
                "class HelloWorld {",
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   263
                "    public static void main(String... args) {",
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   264
                "        System.out.println(\"Hello World\");",
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   265
                "    }",
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   266
                "}"
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   267
        ));
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   268
        Path classes = base.resolve("classes");
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   269
        compile("-d", classes.toString(), srcfile.toString());
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   270
        TestResult tr =
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   271
            doExec(javaCmd, "--source", thisVersion, "-cp", classes.toString(), "HelloWorld");
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   272
        if (tr.isOK())
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   273
            error(tr, "Command succeeded unexpectedly");
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   274
        if (!tr.contains("file not found: HelloWorld"))
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   275
            error(tr, "Expected output not found");
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   276
        show(tr);
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   277
    }
f191aca8f96d 8210275: Source Launcher should fail if --source is used without a source file
jjg
parents: 51213
diff changeset
   278
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   279
    // java --source
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   280
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   281
    void testSourceNoArg() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   282
        starting("testSourceNoArg");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   283
        TestResult tr = doExec(javaCmd, "--source");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   284
        if (tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   285
            error(tr, "Command succeeded unexpectedly");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   286
        if (!tr.contains("--source requires source version"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   287
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   288
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   289
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   290
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   291
    // java --source N -jar simple.jar
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   292
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   293
    void testSourceJarConflict() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   294
        starting("testSourceJarConflict");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   295
        Path base = Files.createDirectories(Paths.get("testSourceJarConflict"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   296
        Path file = getSimpleFile("Simple.java", false);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   297
        Path classes = Files.createDirectories(base.resolve("classes"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   298
        compile("-d", classes.toString(), file.toString());
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   299
        Path simpleJar = base.resolve("simple.jar");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   300
        createJar("cf", simpleJar.toString(), "-C", classes.toString(), ".");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   301
        TestResult tr =
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   302
            doExec(javaCmd, "--source", thisVersion, "-jar", simpleJar.toString());
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   303
        if (tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   304
            error(tr, "Command succeeded unexpectedly");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   305
        if (!tr.contains("Option -jar is not allowed with --source"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   306
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   307
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   308
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   309
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   310
    // java --source N -m jdk.compiler
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   311
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   312
    void testSourceModuleConflict() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   313
        starting("testSourceModuleConflict");
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   314
        TestResult tr = doExec(javaCmd, "--source", thisVersion, "-m", "jdk.compiler");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   315
        if (tr.isOK())
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   316
            error(tr, "Command succeeded unexpectedly");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   317
        if (!tr.contains("Option -m is not allowed with --source"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   318
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   319
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   320
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   321
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   322
    // #!.../java --source N -version
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   323
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   324
    void testTerminalOptionInShebang() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   325
        starting("testTerminalOptionInShebang");
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
   326
        if (skipShebangTest || isAIX || isMacOSX || isSolaris) {
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   327
            // On MacOSX, we cannot distinguish between terminal options on the
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   328
            // shebang line and those on the command line.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   329
            // On Solaris, all options after the first on the shebang line are
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
   330
            // ignored. Similar on AIX.
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   331
            log.println("SKIPPED");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   332
            return;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   333
        }
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   334
        Path base = Files.createDirectories(
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   335
            Paths.get("testTerminalOptionInShebang"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   336
        Path bad = base.resolve("bad");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   337
        createFile(bad, List.of(
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   338
            "#!" + shebangJavaCmd + " --source " + thisVersion + " -version"));
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   339
        setExecutable(bad);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   340
        TestResult tr = doExec(bad.toString());
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   341
        if (!tr.contains("Option -version is not allowed in this context"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   342
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   343
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   344
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   345
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   346
    // #!.../java --source N @bad.at  (contains -version)
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   347
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   348
    void testTerminalOptionInShebangAtFile() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   349
        starting("testTerminalOptionInShebangAtFile");
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
   350
        if (skipShebangTest || isAIX || isMacOSX || isSolaris) {
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   351
            // On MacOSX, we cannot distinguish between terminal options in a
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   352
            // shebang @-file and those on the command line.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   353
            // On Solaris, all options after the first on the shebang line are
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
   354
            // ignored. Similar on AIX.
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   355
            log.println("SKIPPED");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   356
            return;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   357
        }
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   358
        // Use a short directory name, to avoid line length limitations
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   359
        Path base = Files.createDirectories(Paths.get("testBadAtFile"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   360
        Path bad_at = base.resolve("bad.at");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   361
        createFile(bad_at, List.of("-version"));
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   362
        Path bad = base.resolve("bad");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   363
        createFile(bad, List.of(
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   364
            "#!" + shebangJavaCmd + " --source " + thisVersion + " @" + bad_at));
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   365
        setExecutable(bad);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   366
        TestResult tr = doExec(bad.toString());
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   367
        if (!tr.contains("Option -version in @testBadAtFile/bad.at is "
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   368
                + "not allowed in this context"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   369
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   370
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   371
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   372
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   373
    // #!.../java --source N HelloWorld
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   374
    @Test
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   375
    void testMainClassInShebang() throws IOException {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   376
        starting("testMainClassInShebang");
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
   377
        if (skipShebangTest || isAIX || isMacOSX || isSolaris) {
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   378
            // On MacOSX, we cannot distinguish between a main class on the
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   379
            // shebang line and one on the command line.
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   380
            // On Solaris, all options after the first on the shebang line are
51213
24c4780f69a5 8207766: [testbug] Adapt tests for Aix.
goetz
parents: 50850
diff changeset
   381
            // ignored. Similar on AIX.
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   382
            log.println("SKIPPED");
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   383
            return;
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   384
        }
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   385
        Path base = Files.createDirectories(Paths.get("testMainClassInShebang"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   386
        Path bad = base.resolve("bad");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   387
        createFile(bad, List.of(
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   388
            "#!" + shebangJavaCmd + " --source " + thisVersion + " HelloWorld"));
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   389
        setExecutable(bad);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   390
        TestResult tr = doExec(bad.toString());
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   391
        if (!tr.contains("Cannot specify main class in this context"))
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   392
            error(tr, "Expected output not found");
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   393
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   394
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   395
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   396
    //--------------------------------------------------------------------------
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   397
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   398
    private void starting(String label) {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   399
        System.out.println();
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   400
        System.out.println("*** Starting: " + label + " (stdout)");
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   401
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   402
        System.err.println();
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   403
        System.err.println("*** Starting: " + label + " (stderr)");
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   404
    }
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   405
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   406
    private void show(TestResult tr) {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   407
        log.println("*** Test Output:");
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   408
        for (String line: tr.testOutput) {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   409
            log.println(line);
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   410
        }
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   411
        log.println("*** End Of Test Output:");
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   412
    }
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   413
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   414
    private Map<String,String> getLauncherDebugEnv() {
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   415
        return Map.of("_JAVA_LAUNCHER_DEBUG", "1");
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   416
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   417
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   418
    private Path getSimpleFile(String name, boolean shebang) throws IOException {
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   419
        Path file = Paths.get(name);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   420
        if (!Files.exists(file)) {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   421
            createFile(file, List.of(
50850
208eff1d03e0 8205438: Re-enable shebang tests in test/jdk/tools/launchers/SourceMode.java
jjg
parents: 50498
diff changeset
   422
                (shebang ? "#!" + shebangJavaCmd + " --source=" + thisVersion: ""),
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   423
                "public class Simple {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   424
                "  public static void main(String[] args) {",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   425
                "    System.out.println(java.util.Arrays.toString(args));",
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   426
                "  }}"));
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   427
        }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   428
        return file;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   429
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   430
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   431
    private void createFile(Path file, List<String> lines) throws IOException {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   432
        lines.stream()
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   433
            .filter(line -> line.length() > 128)
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   434
            .forEach(line -> {
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   435
                    log.println("*** Warning: long line ("
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   436
                                        + line.length()
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   437
                                        + " chars) in file " + file);
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   438
                    log.println("*** " + line);
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   439
                });
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   440
        log.println("*** File: " + file);
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   441
        lines.stream().forEach(log::println);
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   442
        log.println("*** End Of File");
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   443
        createFile(file.toFile(), lines);
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   444
    }
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   445
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   446
    private Path setExecutable(Path file) throws IOException {
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   447
        Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   448
        perms.add(PosixFilePermission.OWNER_EXECUTE);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   449
        Files.setPosixFilePermissions(file, perms);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   450
        return file;
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   451
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   452
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   453
    private void error(TestResult tr, String message) {
50497
ee8524126794 8204588: Test failures after "Launch Single-File Source-Code Programs"
jjg
parents: 50453
diff changeset
   454
        show(tr);
50453
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   455
        throw new RuntimeException(message);
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   456
    }
f91927a2c8d3 8201274: Launch Single-File Source-Code Programs
jjg
parents:
diff changeset
   457
}