Path: blob/master/test/jdk/tools/launcher/ArgsFileTest.java
41145 views
/*1* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @bug 8027634 823186326* @summary Argument parsing from file27* @modules jdk.compiler28* jdk.zipfs29* @build TestHelper30* @run main ArgsFileTest31*/32import java.io.File;33import java.io.IOException;34import java.util.ArrayList;35import java.util.Arrays;36import java.util.Collections;37import java.util.HashMap;38import java.util.List;39import java.util.Map;40import java.util.regex.Matcher;41import java.util.regex.Pattern;4243public class ArgsFileTest extends TestHelper {44private static File testJar = null;45private static Map<String, String> env = new HashMap<>();4647static void init() throws IOException {48if (testJar != null) {49return;50}51testJar = new File("test.jar");52StringBuilder tsrc = new StringBuilder();53tsrc.append("public static void main(String... args) {\n");54tsrc.append(" for (String x : args) {\n");55tsrc.append(" System.out.println(x);\n");56tsrc.append(" }\n");57tsrc.append("}\n");58createJar(testJar, new File("Foo"), tsrc.toString());5960env.put(JLDEBUG_KEY, "true");61}6263private File createArgFile(String fname, List<String> lines, boolean endWithNewline) throws IOException {64File argFile = new File(fname);65argFile.delete();66createAFile(argFile, lines, endWithNewline);67return argFile;68}6970private File createArgFile(String fname, List<String> lines) throws IOException {71return createArgFile(fname, lines, true);72}7374private void verifyOptions(List<String> args, TestResult tr) {75if (args.isEmpty()) {76return;77}7879int i = 1;80for (String x : args) {81tr.matches(".*argv\\[" + i + "\\] = " + Pattern.quote(x) + ".*");82i++;83}84if (! tr.testStatus) {85System.out.println(tr);86throw new RuntimeException("test fails");87}88}8990private void verifyUserArgs(List<String> args, TestResult tr, int index) {91if (javaCmd != TestHelper.javaCmd) {92tr.contains("\tFirst application arg index: 1");93} else {94tr.contains("\tFirst application arg index: " + index);9596for (String arg: args) {97tr.matches("^" + Pattern.quote(arg) + "$");98}99}100101if (! tr.testStatus) {102System.out.println(tr);103throw new RuntimeException("test fails");104}105}106107@Test108public void expandAll() throws IOException {109List<String> lines = new ArrayList<>();110lines.add("-Xmx32m");111lines.add("-Xint");112File argFile1 = createArgFile("argFile1", lines);113lines = new ArrayList<>();114lines.add("-jar");115lines.add("test.jar");116lines.add("uarg1 @uarg2 @@uarg3 -uarg4 uarg5");117File argFile2 = createArgFile("argFile2", lines);118119TestResult tr = doExec(env, javaCmd, "@argFile1", "@argFile2");120121List<String> appArgs = new ArrayList<>();122appArgs.add("uarg1");123appArgs.add("@uarg2");124appArgs.add("@@uarg3");125appArgs.add("-uarg4");126appArgs.add("uarg5");127128List<String> options = new ArrayList<>();129options.add("-Xmx32m");130options.add("-Xint");131options.add("-jar");132options.add("test.jar");133options.addAll(appArgs);134135verifyOptions(options, tr);136verifyUserArgs(appArgs, tr, 5);137argFile1.delete();138argFile2.delete();139140File cpFile = createArgFile("cpFile", Arrays.asList("-cp", "test.jar"));141List<String> appCmd = new ArrayList<>();142appCmd.add("Foo");143appCmd.addAll(appArgs);144File appFile = createArgFile("appFile", appCmd);145146tr = doExec(env, javaCmd, "@cpFile", "@appFile");147verifyOptions(Arrays.asList("-cp", "test.jar", "Foo",148"uarg1", "@uarg2", "@@uarg3", "-uarg4", "uarg5"), tr);149verifyUserArgs(appArgs, tr, 4);150cpFile.delete();151appFile.delete();152}153154@Test155public void escapeArg() throws IOException {156List<String> lines = new ArrayList<>();157lines.add("-Xmx32m");158lines.add("-Xint");159File argFile1 = createArgFile("argFile1", lines);160161TestResult tr = doExec(env, javaCmd, "-cp", "@@arg", "-cp", "@",162"-cp", "@@@cp", "@argFile1", "@@@@Main@@@@", "-version");163List<String> options = new ArrayList<>();164options.add("-cp");165options.add("@arg");166options.add("-cp");167options.add("@");168options.add("-cp");169options.add("@@cp");170options.add("-Xmx32m");171options.add("-Xint");172options.add("@@@Main@@@@");173options.add("-version");174verifyOptions(options, tr);175verifyUserArgs(Collections.emptyList(), tr, options.size());176argFile1.delete();177}178179@Test180public void killSwitch() throws IOException {181List<String> lines = new ArrayList<>();182lines.add("-Xmx32m");183lines.add("-Xint");184File argFile1 = createArgFile("argFile1", lines);185lines = new ArrayList<>();186lines.add("-jar");187lines.add("test.jar");188lines.add("uarg1 @uarg2 @@uarg3 -uarg4 uarg5");189File argFile2 = createArgFile("argFile2", lines);190File argKill = createArgFile("argKill",191Collections.singletonList("--disable-@files"));192193TestResult tr = doExec(env, javaCmd, "@argFile1", "--disable-@files", "@argFile2");194List<String> options = new ArrayList<>();195options.add("-Xmx32m");196options.add("-Xint");197options.add("--disable-@files");198options.add("@argFile2");199verifyOptions(options, tr);200// Main class is @argFile2201verifyUserArgs(Collections.emptyList(), tr, 5);202203// Specify in file is same as specify inline204tr = doExec(env, javaCmd, "@argFile1", "@argKill", "@argFile2");205verifyOptions(options, tr);206// Main class is @argFile2207verifyUserArgs(Collections.emptyList(), tr, 5);208209// multiple is fine, once on is on.210tr = doExec(env, javaCmd, "@argKill", "@argFile1", "--disable-@files", "@argFile2");211options = Arrays.asList("--disable-@files", "@argFile1",212"--disable-@files", "@argFile2");213verifyOptions(options, tr);214verifyUserArgs(Collections.emptyList(), tr, 3);215216// after main class, becoming an user application argument217tr = doExec(env, javaCmd, "@argFile2", "@argKill");218options = Arrays.asList("-jar", "test.jar", "uarg1", "@uarg2", "@@uarg3",219"-uarg4", "uarg5", "@argKill");220verifyOptions(options, tr);221verifyUserArgs(Arrays.asList("uarg1", "@uarg2", "@@uarg3",222"-uarg4", "uarg5", "@argKill"), tr, 3);223224argFile1.delete();225argFile2.delete();226argKill.delete();227}228229@Test230public void userApplication() throws IOException {231List<String> lines = new ArrayList<>();232lines.add("-Xmx32m");233lines.add("-Xint");234File vmArgs = createArgFile("vmArgs", lines);235File jarOpt = createArgFile("jarOpt", Arrays.asList("-jar"));236File cpOpt = createArgFile("cpOpt", Arrays.asList("-cp"));237File jarArg = createArgFile("jarArg", Arrays.asList("test.jar"));238File userArgs = createArgFile("userArgs", Arrays.asList("-opt", "arg", "--longopt"));239240TestResult tr = doExec(env, javaCmd,241"@vmArgs", "@jarOpt", "test.jar", "-opt", "arg", "--longopt");242verifyOptions(Arrays.asList(243"-Xmx32m", "-Xint", "-jar", "test.jar", "-opt", "arg", "--longopt"), tr);244verifyUserArgs(Arrays.asList("-opt", "arg", "--longopt"), tr, 5);245246tr = doExec(env, javaCmd, "@jarOpt", "@jarArg", "@vmArgs");247verifyOptions(Arrays.asList("-jar", "test.jar", "@vmArgs"), tr);248verifyUserArgs(Arrays.asList("@vmArgs"), tr, 3);249250tr = doExec(env, javaCmd, "-cp", "@jarArg", "@vmArgs", "Foo", "@userArgs");251verifyOptions(Arrays.asList("-cp", "test.jar", "-Xmx32m", "-Xint",252"Foo", "@userArgs"), tr);253verifyUserArgs(Arrays.asList("@userArgs"), tr, 6);254255tr = doExec(env, javaCmd, "@cpOpt", "@jarArg", "@vmArgs", "Foo", "@userArgs");256verifyOptions(Arrays.asList("-cp", "test.jar", "-Xmx32m", "-Xint",257"Foo", "@userArgs"), tr);258verifyUserArgs(Arrays.asList("@userArgs"), tr, 6);259260tr = doExec(env, javaCmd, "@cpOpt", "test.jar", "@vmArgs", "Foo", "@userArgs");261verifyOptions(Arrays.asList("-cp", "test.jar", "-Xmx32m", "-Xint",262"Foo", "@userArgs"), tr);263verifyUserArgs(Arrays.asList("@userArgs"), tr, 6);264265vmArgs.delete();266jarOpt.delete();267cpOpt.delete();268jarArg.delete();269userArgs.delete();270}271272@Test273public void userApplicationWithoutEmptyLastLine() throws IOException {274File cpOpt = createArgFile("cpOpt", Arrays.asList("-classpath ."), false);275File vmArgs = createArgFile("vmArgs", Arrays.asList("-Xint"), false);276277TestResult tr = doExec(env, javaCmd, "-cp", "test.jar", "@cpOpt", "Foo", "-test");278verifyOptions(Arrays.asList("-cp", "test.jar", "-classpath", ".", "Foo", "-test"), tr);279verifyUserArgs(Arrays.asList("-test"), tr, 6);280281tr = doExec(env, javaCmd, "-cp", "test.jar", "@vmArgs", "Foo", "-test");282verifyOptions(Arrays.asList("-cp", "test.jar", "-Xint", "Foo", "-test"), tr);283verifyUserArgs(Arrays.asList("-test"), tr, 5);284285cpOpt.delete();286vmArgs.delete();287}288289// test with missing file290@Test291public void missingFileNegativeTest() throws IOException {292TestResult tr = doExec(javaCmd, "@" + "missing.cmd");293tr.checkNegative();294tr.contains("Error: could not open `missing.cmd'");295if (!tr.testStatus) {296System.out.println(tr);297throw new RuntimeException("test fails");298}299}300301public static void main(String... args) throws Exception {302init();303ArgsFileTest a = new ArgsFileTest();304a.run(args);305if (testExitValue > 0) {306System.out.println("Total of " + testExitValue + " failed");307System.exit(1);308} else {309System.out.println("All tests pass");310}311}312}313314315