| /* |
| * Copyright (c) 2013, 2018, 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. |
| */ |
| package vm.compiler.complog.share; |
| |
| import java.io.*; |
| import java.util.*; |
| import java.util.regex.*; |
| import java.lang.reflect.*; |
| import java.lang.management.*; |
| |
| import nsk.share.TestFailure; |
| import nsk.share.TestBug; |
| import nsk.share.log.*; |
| import vm.share.options.*; |
| import vm.share.process.*; |
| |
| /** |
| * Test executor for all tests that require compilation log analysis. |
| * Next options should be passed to LogCompilationTest: |
| * <b>-testClass</b> test to be executed; |
| * <b>-testedJava</b> path to testing java binary; |
| * <b>-options</b> options that should be passed to testing java; |
| * <b>-parserClass</b> parser that will be used for compilation log analysis; |
| * <b>-timeout</b> timeout in secoonds. |
| */ |
| |
| public class LogCompilationTest extends OptionSupport implements Runnable { |
| |
| @Option(name="testClass", description="Test to be executed.") |
| protected String testClass; |
| |
| @Option(name="parserClass", description="Parser for compilation log.") |
| protected String parserClass; |
| |
| @Option(name="timeout", description="Timeout value in seconds.", default_value="1800") |
| protected int timeout; |
| |
| @Option(name="testedJava", description="Java binary to be tested.") |
| protected String testedJava; |
| |
| @Option(name="parserOptions", description="Options that will be passed to compilation log parser.", default_value="") |
| protected String parserOptions; |
| |
| @Option(name="options", description="Options for tested java.") |
| protected String jvmOptions; |
| |
| protected Log log = new LogSupport(System.out); |
| protected Log testLog; |
| |
| public static final String compilationLog = "hotspot.log"; |
| |
| public static void main(String args[]) { |
| LogCompilationTest.setupAndRun(new LogCompilationTest(), args); |
| } |
| |
| public void run() { |
| execute(); |
| parse(); |
| } |
| |
| private String[] getJVMOptions() { |
| Matcher matcher = Pattern.compile("(\"[^\"]*\")|([^\\s\"]+(\"[^\"]*\")?)"). |
| matcher(jvmOptions); |
| List<String> options = new LinkedList<String>(); |
| while(matcher.find()) { |
| options.add(matcher.group()); |
| } |
| options.add("-XX:+UnlockDiagnosticVMOptions"); |
| options.add("-XX:+LogCompilation"); |
| options.add("-XX:LogFile="+compilationLog); |
| return options.toArray(new String[0]); |
| } |
| |
| private LogCompilationParser getParser() { |
| try { |
| Class parser = Class.forName(parserClass); |
| Constructor ctor = parser.getConstructor(); |
| return (LogCompilationParser)ctor.newInstance(); |
| } catch (Throwable e) { |
| throw new TestBug("Parser could not be instantiated.",e); |
| } |
| } |
| |
| private void execute() { |
| String options[] = getJVMOptions(); |
| ProcessExecutor executor = new ProcessExecutor(); |
| try { |
| testLog = new LogSupport(new PrintStream(new FileOutputStream("test.log"))); |
| } catch (FileNotFoundException e) { |
| throw new TestFailure("Can't create test log file.", e); |
| } |
| executor.logStdOutErr("Test>>",testLog); |
| executor.addArg(testedJava); |
| executor.addArgs(options); |
| executor.addArg(testClass); |
| executor.start(); |
| executor.waitFor(timeout*1000); |
| |
| if(executor.getResult()!=0) { |
| if(new File("hs_err_pid"+executor.getPid()+".log").exists()) { |
| throw new TestFailure("Test crashed."); |
| } else { |
| throw new TestFailure("Test exited with non-zero code."); |
| } |
| } |
| } |
| |
| private void parse() { |
| File hotspotLog = new File(compilationLog); |
| LogCompilationParser parser = getParser(); |
| parser.setOptions(parserOptions); |
| parser.setLog(log); |
| try { |
| parser.parse(hotspotLog); |
| } catch (Throwable e) { |
| throw new TestFailure("Error occurred during compilation log parsing.",e); |
| } |
| } |
| |
| } |