/*
* Copyright 2009 Google Inc.
*
* 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 com.google.jstestdriver.idea;
import com.google.jstestdriver.JsTestDriverServer;
import com.google.jstestdriver.idea.ui.ToolPanel;
import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.JavaCommandLineState;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RunConfigurationModule;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessListener;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.testframework.TestConsoleProperties;
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil;
import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties;
import com.intellij.execution.testframework.sm.runner.ui.SMTestRunnerResultsForm;
import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Key;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
/**
* Encapsulates the execution state of the test runner.
*
* @author alexeagle@google.com (Alex Eagle)
*/
public class TestRunnerState extends JavaCommandLineState {
private final JSTestDriverConfiguration jsTestDriverConfiguration;
protected final Project project;
private final RunConfigurationModule configurationModule;
// TODO(alexeagle): needs to be configurable?
private static final int testResultPort = 10998;
public TestRunnerState(JSTestDriverConfiguration jsTestDriverConfiguration, Project project,
ExecutionEnvironment env, RunConfigurationModule configurationModule) {
super(env);
this.jsTestDriverConfiguration = jsTestDriverConfiguration;
this.project = project;
this.configurationModule = configurationModule;
}
protected JavaParameters createJavaParameters() throws ExecutionException {
JavaParameters javaParameters = new JavaParameters();
Module module = configurationModule.getModule();
Sdk jdk = module == null ?
ProjectRootManager.getInstance(project).getProjectJdk() :
ModuleRootManager.getInstance(module).getSdk();
javaParameters.setJdk(jdk);
javaParameters.setMainClass(TestRunner.class.getName());
javaParameters.getClassPath().add(PathUtil.getJarPathForClass(JsTestDriverServer.class));
javaParameters.getClassPath().add(PathUtil.getJarPathForClass(TestRunner.class));
String serverURL = (jsTestDriverConfiguration.getServerType() == ServerType.INTERNAL ?
"http://localhost:" + ToolPanel.serverPort :
jsTestDriverConfiguration.getServerAddress());
javaParameters.getProgramParametersList().add(serverURL);
File configFile = new File(jsTestDriverConfiguration.getSettingsFile());
javaParameters.setWorkingDirectory(configFile.getParentFile());
javaParameters.getProgramParametersList().add(jsTestDriverConfiguration.getSettingsFile());
javaParameters.getProgramParametersList().add(String.valueOf(testResultPort));
return javaParameters;
}
@Nullable
public ExecutionResult execute(Executor executor, @NotNull ProgramRunner runner) throws ExecutionException {
TestConsoleProperties testConsoleProperties = new SMTRunnerConsoleProperties(jsTestDriverConfiguration);
final SMTestRunnerResultsForm testRunnerResultsForm =
new SMTestRunnerResultsForm(jsTestDriverConfiguration, testConsoleProperties,
getRunnerSettings(), getConfigurationSettings());
ProcessHandler processHandler = startProcess();
processHandler.addProcessListener(new ProcessListener() {
RemoteTestListener listener;
public void startNotified(ProcessEvent event) {
listener = new RemoteTestListener(testRunnerResultsForm);
listener.listen(testResultPort);
}
public void processTerminated(ProcessEvent event) {
listener.shutdown();
}
public void processWillTerminate(ProcessEvent event, boolean willBeDestroyed) {}
public void onTextAvailable(ProcessEvent event, Key outputType) {}
});
BaseTestsOutputConsoleView consoleView =
SMTestRunnerConnectionUtil.attachRunner(project, processHandler, testConsoleProperties, testRunnerResultsForm);
return new DefaultExecutionResult(consoleView, processHandler, createActions(consoleView, processHandler));
}
}