blob: fc7f8e5ab7ef58c534bae88033fa41de8048b1b8 [file] [log] [blame]
/*
* 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);
}
}
}