blob: 8ff58585a0e89d982404ab2100dddace789d823a [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dalvik.runner;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeoutException;
import java.util.logging.Logger;
/**
* A Java-like virtual machine for compiling and running tests.
*/
public abstract class Vm extends Mode {
private static final Logger logger = Logger.getLogger(Vm.class.getName());
protected final List<String> additionalVmArgs;
Vm(Environment environment, long timeoutSeconds, File sdkJar,
PrintStream tee, List<String> additionalVmArgs) {
super(environment, timeoutSeconds, sdkJar, tee);
this.additionalVmArgs = additionalVmArgs;
}
/**
* Returns a VM for test execution.
*/
@Override protected List<String> runTestCommand(TestRun testRun)
throws TimeoutException {
Command command = newVmCommandBuilder(testRun.getUserDir())
.classpath(getRuntimeSupportClasspath(testRun))
.userDir(testRun.getUserDir())
.debugPort(environment.debugPort)
.vmArgs(additionalVmArgs)
.mainClass(TestRunner.class.getName())
.output(tee)
.build();
return command.executeWithTimeout(timeoutSeconds);
}
/**
* Returns a VM for test execution.
*/
protected abstract VmCommandBuilder newVmCommandBuilder(File workingDirectory);
/**
* Returns the classpath containing JUnit and the dalvik annotations
* required for test execution.
*/
protected abstract Classpath getRuntimeSupportClasspath(TestRun testRun);
/**
* Builds a virtual machine command.
*/
public static class VmCommandBuilder {
private File temp;
private Classpath classpath = new Classpath();
private File workingDir;
private File userDir;
private Integer debugPort;
private String mainClass;
private PrintStream output;
private List<String> vmCommand = Collections.singletonList("java");
private List<String> vmArgs = new ArrayList<String>();
public VmCommandBuilder vmCommand(String... vmCommand) {
this.vmCommand = Arrays.asList(vmCommand.clone());
return this;
}
public VmCommandBuilder temp(File temp) {
this.temp = temp;
return this;
}
public VmCommandBuilder classpath(Classpath classpath) {
this.classpath.addAll(classpath);
return this;
}
public VmCommandBuilder workingDir(File workingDir) {
this.workingDir = workingDir;
return this;
}
public VmCommandBuilder userDir(File userDir) {
this.userDir = userDir;
return this;
}
public VmCommandBuilder debugPort(Integer debugPort) {
this.debugPort = debugPort;
return this;
}
public VmCommandBuilder mainClass(String mainClass) {
this.mainClass = mainClass;
return this;
}
public VmCommandBuilder output(PrintStream output) {
this.output = output;
return this;
}
public VmCommandBuilder vmArgs(String... vmArgs) {
return vmArgs(Arrays.asList(vmArgs));
}
public VmCommandBuilder vmArgs(Collection<String> vmArgs) {
this.vmArgs.addAll(vmArgs);
return this;
}
public Command build() {
Command.Builder builder = new Command.Builder();
builder.args(vmCommand);
builder.args("-classpath", classpath.toString());
builder.args("-Duser.dir=" + userDir);
if (workingDir != null) {
builder.workingDirectory(workingDir);
}
if (temp != null) {
builder.args("-Djava.io.tmpdir=" + temp);
}
if (debugPort != null) {
builder.args("-Xrunjdwp:transport=dt_socket,address="
+ debugPort + ",server=y,suspend=y");
}
builder.args(vmArgs);
builder.args(mainClass);
builder.tee(output);
return builder.build();
}
}
}