< prev index next >

test/jdk/tools/launcher/ArgFileSyntax.java

Print this page
rev 51884 : 8210810: Escaped character at specific position in argument file is not handled properly
Contributed-by: Bo Zhang <zhangbodut@gmail.com>
Reviewed-by: henryjen


  23 
  24 /**
  25  * @test
  26  * @bug 8027634
  27  * @summary Verify syntax of argument file
  28  * @build TestHelper
  29  * @run main ArgFileSyntax
  30  */
  31 import java.io.File;
  32 import java.io.IOException;
  33 import java.util.ArrayList;
  34 import java.util.Arrays;
  35 import java.util.Collections;
  36 import java.util.HashMap;
  37 import java.util.List;
  38 import java.util.Map;
  39 import java.util.regex.Matcher;
  40 import java.util.regex.Pattern;
  41 
  42 public class ArgFileSyntax extends TestHelper {



  43     private File createArgFile(List<String> lines) throws IOException {
  44         File argFile = new File("argfile");
  45         argFile.delete();
  46         createAFile(argFile, lines);
  47         return argFile;
  48     }
  49 
  50     private void verifyOutput(List<String> args, TestResult tr) {
  51         if (args.isEmpty()) {
  52             return;
  53         }
  54 
  55         int i = 1;
  56         for (String x : args) {
  57             tr.matches(".*argv\\[" + i + "\\] = " + Pattern.quote(x) + ".*");
  58             i++;
  59         }
  60         if (! tr.testStatus) {
  61             System.out.println(tr);
  62             throw new RuntimeException("test fails");


 169               "-Xint",
 170               "-version",
 171               "-Dcontinue.with.leadingws=Line1continue with \f<ff> and \t<tab>"
 172             }
 173         }
 174     };
 175 
 176     public List<List<List<String>>> loadCases() {
 177         List<List<List<String>>> rv = new ArrayList<>();
 178         for (String[][] testCaseArray: testCases) {
 179             List<List<String>> testCase = new ArrayList<>(2);
 180             testCase.add(Arrays.asList(testCaseArray[0]));
 181             testCase.add(Arrays.asList(testCaseArray[1]));
 182             rv.add(testCase);
 183         }
 184 
 185         // long lines
 186         String bag = "-Dgarbage=";
 187         String ver = "-version";
 188         // a token 8192 long
 189         char[] data = new char[8192 - bag.length()];
 190         Arrays.fill(data, 'O');
 191         List<String> scratch = new ArrayList<>();
 192         scratch.add("-Xmx32m");
 193         scratch.add(bag + String.valueOf(data));
 194         scratch.add(ver);
 195         rv.add(Collections.nCopies(2, scratch));
 196 
 197         data = new char[8192 + 1024];
 198         Arrays.fill(data, 'O');
 199         scratch = new ArrayList<>();
 200         scratch.add(bag + String.valueOf(data));
 201         scratch.add(ver);
 202         rv.add(Collections.nCopies(2, scratch));
 203 










 204         return rv;
 205     }
 206 
 207     // ensure the arguments in the file are read in correctly
 208     private void verifyParsing(List<String> lines, List<String> args) throws IOException {
 209         File argFile = createArgFile(lines);
 210         String fname = "@" + argFile.getName();
 211         Map<String, String> env = new HashMap<>();
 212         env.put(JLDEBUG_KEY, "true");
 213 
 214         TestResult tr;
 215         if (args.contains("-version")) {
 216             tr = doExec(env, javaCmd, fname);
 217         } else {
 218             tr = doExec(env, javaCmd, fname, "-version");
 219         }
 220         tr.checkPositive();
 221         verifyOutput(args, tr);
 222 
 223         String lastArg = args.contains("-version") ? "-Dlast.arg" : "-version";




  23 
  24 /**
  25  * @test
  26  * @bug 8027634
  27  * @summary Verify syntax of argument file
  28  * @build TestHelper
  29  * @run main ArgFileSyntax
  30  */
  31 import java.io.File;
  32 import java.io.IOException;
  33 import java.util.ArrayList;
  34 import java.util.Arrays;
  35 import java.util.Collections;
  36 import java.util.HashMap;
  37 import java.util.List;
  38 import java.util.Map;
  39 import java.util.regex.Matcher;
  40 import java.util.regex.Pattern;
  41 
  42 public class ArgFileSyntax extends TestHelper {
  43     // Buffer size in args.c readArgFile() method
  44     private static final int ARG_FILE_PARSER_BUF_SIZE = 4096;
  45 
  46     private File createArgFile(List<String> lines) throws IOException {
  47         File argFile = new File("argfile");
  48         argFile.delete();
  49         createAFile(argFile, lines);
  50         return argFile;
  51     }
  52 
  53     private void verifyOutput(List<String> args, TestResult tr) {
  54         if (args.isEmpty()) {
  55             return;
  56         }
  57 
  58         int i = 1;
  59         for (String x : args) {
  60             tr.matches(".*argv\\[" + i + "\\] = " + Pattern.quote(x) + ".*");
  61             i++;
  62         }
  63         if (! tr.testStatus) {
  64             System.out.println(tr);
  65             throw new RuntimeException("test fails");


 172               "-Xint",
 173               "-version",
 174               "-Dcontinue.with.leadingws=Line1continue with \f<ff> and \t<tab>"
 175             }
 176         }
 177     };
 178 
 179     public List<List<List<String>>> loadCases() {
 180         List<List<List<String>>> rv = new ArrayList<>();
 181         for (String[][] testCaseArray: testCases) {
 182             List<List<String>> testCase = new ArrayList<>(2);
 183             testCase.add(Arrays.asList(testCaseArray[0]));
 184             testCase.add(Arrays.asList(testCaseArray[1]));
 185             rv.add(testCase);
 186         }
 187 
 188         // long lines
 189         String bag = "-Dgarbage=";
 190         String ver = "-version";
 191         // a token 8192 long
 192         char[] data = new char[2*ARG_FILE_PARSER_BUF_SIZE - bag.length()];
 193         Arrays.fill(data, 'O');
 194         List<String> scratch = new ArrayList<>();
 195         scratch.add("-Xmx32m");
 196         scratch.add(bag + String.valueOf(data));
 197         scratch.add(ver);
 198         rv.add(Collections.nCopies(2, scratch));
 199 
 200         data = new char[2*ARG_FILE_PARSER_BUF_SIZE + 1024];
 201         Arrays.fill(data, 'O');
 202         scratch = new ArrayList<>();
 203         scratch.add(bag + String.valueOf(data));
 204         scratch.add(ver);
 205         rv.add(Collections.nCopies(2, scratch));
 206 
 207         // 8210810: position escaping character at boundary
 208         // reserve space for quote and backslash
 209         data = new char[ARG_FILE_PARSER_BUF_SIZE - bag.length() - 2];
 210         Arrays.fill(data, 'O');
 211         scratch = new ArrayList<>();
 212         String filling = String.valueOf(data);
 213         scratch.add(bag + "'" + filling + "\\\\aaa\\\\'");
 214         scratch.add(ver);
 215         rv.add(List.of(scratch, List.of(bag + filling + "\\aaa\\", ver)));
 216 
 217         return rv;
 218     }
 219 
 220     // ensure the arguments in the file are read in correctly
 221     private void verifyParsing(List<String> lines, List<String> args) throws IOException {
 222         File argFile = createArgFile(lines);
 223         String fname = "@" + argFile.getName();
 224         Map<String, String> env = new HashMap<>();
 225         env.put(JLDEBUG_KEY, "true");
 226 
 227         TestResult tr;
 228         if (args.contains("-version")) {
 229             tr = doExec(env, javaCmd, fname);
 230         } else {
 231             tr = doExec(env, javaCmd, fname, "-version");
 232         }
 233         tr.checkPositive();
 234         verifyOutput(args, tr);
 235 
 236         String lastArg = args.contains("-version") ? "-Dlast.arg" : "-version";


< prev index next >