blob: 53a5986731df94c51eb7f2ba1b39d01669d3c582 [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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 org.jetbrains.android.run.testing;
import com.android.ddmlib.testrunner.ITestRunListener;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.execution.testframework.sm.ServiceMessageBuilder;
import com.intellij.openapi.util.Comparing;
import org.jetbrains.android.run.AndroidRunningState;
import java.util.Map;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidTestListener implements ITestRunListener {
private final AndroidRunningState myRunningState;
private long myTestStartingTime;
private long myTestSuiteStartingTime;
private String myTestClassName = null;
private ProcessHandler myProcessHandler;
public ProcessHandler getProcessHandler() {
if (myProcessHandler == null) {
myProcessHandler = myRunningState.getProcessHandler();
}
return myProcessHandler;
}
public AndroidTestListener(AndroidRunningState runningState) {
myRunningState = runningState;
}
public void testRunStopped(long elapsedTime) {
ProcessHandler handler = getProcessHandler();
handler.notifyTextAvailable("Test running stopped\n", ProcessOutputTypes.STDOUT);
handler.destroyProcess();
}
@Override
public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
if (myTestClassName != null) {
testSuiteFinished();
}
final ProcessHandler handler = getProcessHandler();
handler.notifyTextAvailable("Finish\n", ProcessOutputTypes.STDOUT);
handler.destroyProcess();
}
@Override
public void testRunStarted(String runName, int testCount) {
ProcessHandler handler = getProcessHandler();
handler.notifyTextAvailable("Test running started\n", ProcessOutputTypes.STDOUT);
final ServiceMessageBuilder builder = new ServiceMessageBuilder("enteredTheMatrix");
handler.notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT);
}
public void testStarted(TestIdentifier test) {
if (!Comparing.equal(test.getClassName(), myTestClassName)) {
if (myTestClassName != null) {
testSuiteFinished();
}
myTestClassName = test.getClassName();
testSuiteStarted();
}
ServiceMessageBuilder builder = new ServiceMessageBuilder("testStarted");
builder.addAttribute("name", test.getTestName());
builder
.addAttribute("locationHint",
"android://" + myRunningState.getModule() + ':' + test.getClassName() + '.' + test.getTestName() + "()");
getProcessHandler().notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT);
myTestStartingTime = System.currentTimeMillis();
}
private void testSuiteStarted() {
myTestSuiteStartingTime = System.currentTimeMillis();
ServiceMessageBuilder builder = new ServiceMessageBuilder("testSuiteStarted");
builder.addAttribute("name", myTestClassName);
builder.addAttribute("locationHint", "android://" + myRunningState.getModule() + ':' + myTestClassName);
getProcessHandler().notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT);
}
private void testSuiteFinished() {
ServiceMessageBuilder builder = new ServiceMessageBuilder("testSuiteFinished");
builder.addAttribute("name", myTestClassName);
builder.addAttribute("duration", Long.toString(System.currentTimeMillis() - myTestSuiteStartingTime));
getProcessHandler().notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT);
myTestClassName = null;
}
public void testFailed(TestFailure status, TestIdentifier test, String stackTrace) {
ServiceMessageBuilder builder = new ServiceMessageBuilder("testFailed");
builder.addAttribute("name", test.getTestName());
builder.addAttribute("message", "");
builder.addAttribute("details", stackTrace);
if (status == TestFailure.ERROR) {
builder.addAttribute("error", "true");
}
getProcessHandler().notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT);
}
@Override
public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
ServiceMessageBuilder builder = new ServiceMessageBuilder("testFinished");
builder.addAttribute("name", test.getTestName());
builder.addAttribute("duration", Long.toString(System.currentTimeMillis() - myTestStartingTime));
getProcessHandler().notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT);
}
public void testRunFailed(String errorMessage) {
ProcessHandler handler = getProcessHandler();
handler.notifyTextAvailable("Test running failed: " + errorMessage + "\n", ProcessOutputTypes.STDERR);
handler.destroyProcess();
}
}