/* * 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; } @Override 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); } @Override 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", AndroidTestLocationProvider.PROTOCOL_ID + "://" + myRunningState.getModule().getName() + ':' + 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", AndroidTestLocationProvider.PROTOCOL_ID + "://" + myRunningState.getModule().getName() + ':' + 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; } @Override public void testFailed(TestIdentifier test, String stackTrace) { ServiceMessageBuilder builder = new ServiceMessageBuilder("testFailed"); builder.addAttribute("name", test.getTestName()); builder.addAttribute("message", ""); builder.addAttribute("details", stackTrace); builder.addAttribute("error", "true"); getProcessHandler().notifyTextAvailable(builder.toString() + '\n', ProcessOutputTypes.STDOUT); } @Override public void testAssumptionFailure(TestIdentifier test, String trace) { ServiceMessageBuilder builder = ServiceMessageBuilder.testFailed(test.getTestName()); builder.addAttribute("message", "Assumption Failed"); builder.addAttribute("details", trace); builder.addAttribute("error", "true"); getProcessHandler().notifyTextAvailable(builder.toString() + "\n", ProcessOutputTypes.STDOUT); } @Override public void testIgnored(TestIdentifier test) { ServiceMessageBuilder builder = ServiceMessageBuilder.testIgnored(test.getTestName()); 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); } @Override public void testRunFailed(String errorMessage) { ProcessHandler handler = getProcessHandler(); handler.notifyTextAvailable("Test running failed: " + errorMessage + "\n", ProcessOutputTypes.STDERR); handler.destroyProcess(); } }