/* * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /** * @test * @bug 8027634 * @summary Argument parsing from file * @build TestHelper * @run main ArgsFileTest */ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ArgsFileTest extends TestHelper { private static File testJar = null; private static Map<String, String> env = new HashMap<>(); static void init() throws IOException { if (testJar != null) { return; } testJar = new File("test.jar"); StringBuilder tsrc = new StringBuilder(); tsrc.append("public static void main(String... args) {\n"); tsrc.append(" for (String x : args) {\n"); tsrc.append(" System.out.println(x);\n"); tsrc.append(" }\n"); tsrc.append("}\n"); createJar(testJar, new File("Foo"), tsrc.toString()); env.put(JLDEBUG_KEY, "true"); } private File createArgFile(String fname, List<String> lines) throws IOException { File argFile = new File(fname); argFile.delete(); createAFile(argFile, lines); return argFile; } private void verifyOptions(List<String> args, TestResult tr) { if (args.isEmpty()) { return; } int i = 1; for (String x : args) { tr.matches(".*argv\\[" + i + "\\] = " + Pattern.quote(x) + ".*"); i++; } if (! tr.testStatus) { System.out.println(tr); throw new RuntimeException("test fails"); } } private void verifyUserArgs(List<String> args, TestResult tr, int index) { if (javaCmd != TestHelper.javaCmd) { tr.contains("\tFirst application arg index: 1"); } else { tr.contains("\tFirst application arg index: " + index); for (String arg: args) { tr.matches("^" + Pattern.quote(arg) + "$"); } } if (! tr.testStatus) { System.out.println(tr); throw new RuntimeException("test fails"); } } @Test public void expandAll() throws IOException { List<String> lines = new ArrayList<>(); lines.add("-Xmx32m"); lines.add("-Xint"); File argFile1 = createArgFile("argFile1", lines); lines = new ArrayList<>(); lines.add("-jar"); lines.add("test.jar"); lines.add("uarg1 @uarg2 @@uarg3 -uarg4 uarg5"); File argFile2 = createArgFile("argFile2", lines); TestResult tr = doExec(env, javaCmd, "@argFile1", "@argFile2"); List<String> appArgs = new ArrayList<>(); appArgs.add("uarg1"); appArgs.add("@uarg2"); appArgs.add("@@uarg3"); appArgs.add("-uarg4"); appArgs.add("uarg5"); List<String> options = new ArrayList<>(); options.add("-Xmx32m"); options.add("-Xint"); options.add("-jar"); options.add("test.jar"); options.addAll(appArgs); verifyOptions(options, tr); verifyUserArgs(appArgs, tr, 5); argFile1.delete(); argFile2.delete(); File cpFile = createArgFile("cpFile", Arrays.asList("-cp", "test.jar")); List<String> appCmd = new ArrayList<>(); appCmd.add("Foo"); appCmd.addAll(appArgs); File appFile = createArgFile("appFile", appCmd); tr = doExec(env, javaCmd, "@cpFile", "@appFile"); verifyOptions(Arrays.asList("-cp", "test.jar", "Foo", "uarg1", "@uarg2", "@@uarg3", "-uarg4", "uarg5"), tr); verifyUserArgs(appArgs, tr, 4); cpFile.delete(); appFile.delete(); } @Test public void escapeArg() throws IOException { List<String> lines = new ArrayList<>(); lines.add("-Xmx32m"); lines.add("-Xint"); File argFile1 = createArgFile("argFile1", lines); TestResult tr = doExec(env, javaCmd, "-cp", "@@arg", "-cp", "@", "-cp", "@@@cp", "@argFile1", "@@@@Main@@@@", "-version"); List<String> options = new ArrayList<>(); options.add("-cp"); options.add("@arg"); options.add("-cp"); options.add("@"); options.add("-cp"); options.add("@@cp"); options.add("-Xmx32m"); options.add("-Xint"); options.add("@@@Main@@@@"); options.add("-version"); verifyOptions(options, tr); verifyUserArgs(Collections.emptyList(), tr, options.size()); argFile1.delete(); } @Test public void killSwitch() throws IOException { List<String> lines = new ArrayList<>(); lines.add("-Xmx32m"); lines.add("-Xint"); File argFile1 = createArgFile("argFile1", lines); lines = new ArrayList<>(); lines.add("-jar"); lines.add("test.jar"); lines.add("uarg1 @uarg2 @@uarg3 -uarg4 uarg5"); File argFile2 = createArgFile("argFile2", lines); File argKill = createArgFile("argKill", Collections.singletonList("-Xdisable-@files")); TestResult tr = doExec(env, javaCmd, "@argFile1", "-Xdisable-@files", "@argFile2"); List<String> options = new ArrayList<>(); options.add("-Xmx32m"); options.add("-Xint"); options.add("-Xdisable-@files"); options.add("@argFile2"); verifyOptions(options, tr); // Main class is @argFile2 verifyUserArgs(Collections.emptyList(), tr, 5); // Specify in file is same as specify inline tr = doExec(env, javaCmd, "@argFile1", "@argKill", "@argFile2"); verifyOptions(options, tr); // Main class is @argFile2 verifyUserArgs(Collections.emptyList(), tr, 5); // multiple is fine, once on is on. tr = doExec(env, javaCmd, "@argKill", "@argFile1", "-Xdisable-@files", "@argFile2"); options = Arrays.asList("-Xdisable-@files", "@argFile1", "-Xdisable-@files", "@argFile2"); verifyOptions(options, tr); verifyUserArgs(Collections.emptyList(), tr, 3); // after main class, becoming an user application argument tr = doExec(env, javaCmd, "@argFile2", "@argKill"); options = Arrays.asList("-jar", "test.jar", "uarg1", "@uarg2", "@@uarg3", "-uarg4", "uarg5", "@argKill"); verifyOptions(options, tr); verifyUserArgs(Arrays.asList("uarg1", "@uarg2", "@@uarg3", "-uarg4", "uarg5", "@argKill"), tr, 3); argFile1.delete(); argFile2.delete(); argKill.delete(); } @Test public void userApplication() throws IOException { List<String> lines = new ArrayList<>(); lines.add("-Xmx32m"); lines.add("-Xint"); File vmArgs = createArgFile("vmArgs", lines); File jarOpt = createArgFile("jarOpt", Arrays.asList("-jar")); File cpOpt = createArgFile("cpOpt", Arrays.asList("-cp")); File jarArg = createArgFile("jarArg", Arrays.asList("test.jar")); File userArgs = createArgFile("userArgs", Arrays.asList("-opt", "arg", "--longopt")); TestResult tr = doExec(env, javaCmd, "@vmArgs", "@jarOpt", "test.jar", "-opt", "arg", "--longopt"); verifyOptions(Arrays.asList( "-Xmx32m", "-Xint", "-jar", "test.jar", "-opt", "arg", "--longopt"), tr); verifyUserArgs(Arrays.asList("-opt", "arg", "--longopt"), tr, 5); tr = doExec(env, javaCmd, "@jarOpt", "@jarArg", "@vmArgs"); verifyOptions(Arrays.asList("-jar", "test.jar", "@vmArgs"), tr); verifyUserArgs(Arrays.asList("@vmArgs"), tr, 3); tr = doExec(env, javaCmd, "-cp", "@jarArg", "@vmArgs", "Foo", "@userArgs"); verifyOptions(Arrays.asList("-cp", "test.jar", "-Xmx32m", "-Xint", "Foo", "@userArgs"), tr); verifyUserArgs(Arrays.asList("@userArgs"), tr, 6); tr = doExec(env, javaCmd, "@cpOpt", "@jarArg", "@vmArgs", "Foo", "@userArgs"); verifyOptions(Arrays.asList("-cp", "test.jar", "-Xmx32m", "-Xint", "Foo", "@userArgs"), tr); verifyUserArgs(Arrays.asList("@userArgs"), tr, 6); tr = doExec(env, javaCmd, "@cpOpt", "test.jar", "@vmArgs", "Foo", "@userArgs"); verifyOptions(Arrays.asList("-cp", "test.jar", "-Xmx32m", "-Xint", "Foo", "@userArgs"), tr); verifyUserArgs(Arrays.asList("@userArgs"), tr, 6); vmArgs.delete(); jarOpt.delete(); cpOpt.delete(); jarArg.delete(); userArgs.delete(); } // test with missing file @Test public void missingFileNegativeTest() throws IOException { TestResult tr = doExec(javaCmd, "@" + "missing.cmd"); tr.checkNegative(); tr.contains("Error: could not open `missing.cmd'"); if (!tr.testStatus) { System.out.println(tr); throw new RuntimeException("test fails"); } } public static void main(String... args) throws Exception { init(); ArgsFileTest a = new ArgsFileTest(); a.run(args); if (testExitValue > 0) { System.out.println("Total of " + testExitValue + " failed"); System.exit(1); } else { System.out.println("All tests pass"); } } }