ef614ed8af
Reviewed-by: kvn, epavlova
140 lines
4.9 KiB
Java
140 lines
4.9 KiB
Java
/*
|
|
* Copyright (c) 2013, 2020, 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 jdk.test.lib.Utils;
|
|
import nsk.share.TestBug;
|
|
import nsk.share.TestFailure;
|
|
import nsk.share.log.Log;
|
|
import nsk.share.log.LogSupport;
|
|
import vm.share.options.Option;
|
|
import vm.share.options.OptionSupport;
|
|
import vm.share.process.ProcessExecutor;
|
|
|
|
import java.io.File;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileOutputStream;
|
|
import java.io.PrintStream;
|
|
import java.lang.reflect.Constructor;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* 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>-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;
|
|
|
|
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() {
|
|
List<String> options = new ArrayList<>();
|
|
Collections.addAll(options, Utils.getTestJavaOpts());
|
|
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();
|
|
int exitCode = executor.waitFor(timeout * 1000);
|
|
|
|
if (exitCode != 0) {
|
|
if (new File("hs_err_pid" + executor.getPid() + ".log").exists()) {
|
|
throw new TestFailure("Test crashed. Exit code: " + exitCode);
|
|
} else {
|
|
throw new TestFailure("Test exited with non-zero code: " + exitCode);
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
}
|