1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test TestQuotedLogOutputs 26 * @summary Ensure proper parsing of quoted output names for -Xlog arguments. 27 * @modules java.base/jdk.internal.misc 28 * @library /test/lib 29 */ 30 31 import java.io.File; 32 import java.nio.file.Path; 33 import java.nio.file.Paths; 34 35 import jdk.test.lib.Asserts; 36 import jdk.test.lib.process.ProcessTools; 37 import jdk.test.lib.process.OutputAnalyzer; 38 39 public class TestQuotedLogOutputs { 40 41 public static void main(String[] args) throws Exception { 42 // Ensure log files can be specified with full path. 43 // On windows, this means that the file name will contain 44 // a colon ('C:\log.txt' for example), which is used to 45 // separate -Xlog: options (-Xlog:tags:filename:decorators). 46 // Try to log to a file in our current directory, using its absolute path. 47 String baseName = "test file.log"; 48 Path filePath = Paths.get(baseName).toAbsolutePath(); 49 String fileName = filePath.toString(); 50 File file = filePath.toFile(); 51 52 // In case the file already exists, attempt to delete it before running the test 53 file.delete(); 54 55 // Depending on if we're on Windows or not the quotation marks must be escaped, 56 // otherwise they will be stripped from the command line arguments. 57 String quote; 58 if (System.getProperty("os.name").toLowerCase().contains("windows")) { 59 quote = "\\\""; // quote should be \" (escaped quote) 60 } else { 61 quote = "\""; // quote should be " (no escape needed) 62 } 63 64 // Test a few variations with valid log output specifiers 65 String[] validOutputs = new String[] { 66 quote + fileName + quote, 67 "file=" + quote + fileName + quote, 68 quote + fileName + quote + ":", 69 quote + fileName + quote + "::" 70 }; 71 for (String logOutput : validOutputs) { 72 // Run with logging=trace on stdout so that we can verify the log configuration afterwards. 73 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:logging=trace", 74 "-Xlog:all=trace:" + logOutput, 75 "-version"); 76 OutputAnalyzer output = new OutputAnalyzer(pb.start()); 77 output.shouldHaveExitValue(0); 78 Asserts.assertTrue(file.exists()); 79 file.deleteOnExit(); // Clean up after test 80 output.shouldMatch("\\[logging *\\].*" + baseName); // Expect to see the log output listed 81 } 82 83 // Test a bunch of invalid output specifications and ensure the VM fails with these 84 String[] invalidOutputs = new String[] { 85 quote, 86 quote + quote, // should fail because the VM will try to create a file without a name 87 quote + quote + quote, 88 quote + quote + quote + quote, 89 quote + quote + quote + quote + quote, 90 "prefix" + quote + quote + "suffix", 91 "prefix" + quote + quote, 92 quote + quote + "suffix", 93 quote + "A" + quote + quote + "B" + quote, 94 quote + "A" + quote + "B" + quote + "C" + quote, 95 "A" + quote + quote + "B" 96 }; 97 for (String logOutput : invalidOutputs) { 98 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:logging=trace", 99 "-Xlog:all=trace:" + logOutput, 100 "-version"); 101 OutputAnalyzer output = new OutputAnalyzer(pb.start()); 102 output.shouldHaveExitValue(1); 103 // Ensure error message was logged 104 output.shouldMatch("([Mm]issing terminating quote)" 105 + "|(Error opening log file '')" 106 + "|(Output name can not be partially quoted)"); 107 } 108 } 109 } 110