blob: 9c2bc0f6a8b52ebbace5110ddc5a4e34fb749298 [file] [log] [blame]
/*
* Copyright (C) 2010 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 com.android.tradefed.result;
import com.android.ddmlib.Log;
import com.android.tradefed.invoker.IInvocationContext;
import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
import com.android.tradefed.util.TimeUtil;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestListener;
import junit.framework.TestResult;
import org.junit.AssumptionViolatedException;
import java.util.HashMap;
/**
* A class that listens to {@link ITestInvocationListener} events and forwards them to a
* {@link junit.framework.TestListener}.
* <p/>
*/
public class InvocationToJUnitResultForwarder implements ITestInvocationListener {
private static final String LOG_TAG = "InvocationToJUnitResultForwarder";
private TestListener mJUnitListener;
public InvocationToJUnitResultForwarder(TestListener junitListener) {
mJUnitListener = junitListener;
}
protected TestListener getJUnitListener() {
return mJUnitListener;
}
/** {@inheritDoc} */
@Override
public void testEnded(TestDescription test, HashMap<String, Metric> testMetrics) {
mJUnitListener.endTest(new TestIdentifierResult(test));
}
/** {@inheritDoc} */
@Override
public void testFailed(TestDescription testId, String trace) {
Test test = new TestIdentifierResult(testId);
// TODO: is it accurate to represent the trace as AssertionFailedError?
mJUnitListener.addFailure(test, new AssertionFailedError(trace));
Log.w(
LOG_TAG,
String.format("\nTest %s failed with stack:\n %s", testId.toString(), trace));
}
@Override
public void testAssumptionFailure(TestDescription testId, String trace) {
Test test = new TestIdentifierResult(testId);
AssumptionViolatedException throwable = new AssumptionViolatedException(trace);
mJUnitListener.addError(test, throwable);
}
/** {@inheritDoc} */
@Override
public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
// TODO: no run ended method on TestListener - would be good to propagate the elapsedTime
// info up
Log.i(LOG_TAG, String.format("Run ended in %s", TimeUtil.formatElapsedTime(elapsedTime)));
}
/**
* {@inheritDoc}
*/
@Override
public void testRunFailed(String errorMessage) {
// TODO: no run failed method on TestListener - would be good to propagate this up
Log.e(LOG_TAG, String.format("Run failed: %s", errorMessage));
}
/**
* {@inheritDoc}
*/
@Override
public void testRunStarted(String runName, int testCount) {
// TODO: no run started method on TestResult - would be good to propagate this up
Log.i(LOG_TAG, String.format("Running %s: %d tests", runName, testCount));
}
/**
* {@inheritDoc}
*/
@Override
public void testRunStopped(long elapsedTime) {
Log.i(
LOG_TAG,
String.format("run stopped after %s", TimeUtil.formatElapsedTime(elapsedTime)));
}
/** {@inheritDoc} */
@Override
public void testStarted(TestDescription test) {
Log.d(LOG_TAG, String.format("Starting test: %s", test.toString()));
mJUnitListener.startTest(new TestIdentifierResult(test));
}
/**
* A class that converts a {@link TestDescription} to a JUnit {@link Test}
*
* <p>TODO: The JUnit {@link TestListener} seems to assume a descriptive interface of some sort
* for Test, that is not in its defined methods. Assume for now that its toString()
*/
static class TestIdentifierResult implements Test {
private final TestDescription mTestId;
private TestIdentifierResult(TestDescription testId) {
mTestId = testId;
}
/**
* {@inheritDoc}
*/
@Override
public int countTestCases() {
return 1;
}
/**
* {@inheritDoc}
*/
@Override
public void run(TestResult result) {
// this class for reporting purposes only, ignore
throw new UnsupportedOperationException();
}
/**
* Specialize this to base equality on TestIdentifier.
*/
@Override
public boolean equals(Object other) {
return mTestId.equals(other);
}
/**
* Specialize this to base hashCode on TestIdentifier.
*/
@Override
public int hashCode() {
return mTestId.hashCode();
}
/**
* Return a user-friendly descriptive string.
*/
@Override
public String toString() {
return mTestId.toString();
}
}
/**
* {@inheritDoc}
*/
@Override
public void invocationEnded(long elapsedTime) {
// ignore
}
/**
* {@inheritDoc}
*/
@Override
public void invocationFailed(Throwable cause) {
// ignore
}
/**
* {@inheritDoc}
*/
@Override
public TestSummary getSummary() {
// ignore
return null;
}
/**
* {@inheritDoc}
*/
@Override
public void invocationStarted(IInvocationContext context) {
// ignore
}
/**
* {@inheritDoc}
*/
@Override
public void testLog(String dataName, LogDataType logData, InputStreamSource dataStream) {
// ignore
}
@Override
public void testIgnored(TestDescription test) {
// ignore
}
}