blob: 0c312803216b8d61c2b9b5a37c3df32c49bebf7b [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.testrunner.TestResult.TestStatus;
import com.android.tradefed.build.BuildInfo;
import com.android.tradefed.invoker.IInvocationContext;
import com.android.tradefed.invoker.InvocationContext;
import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
import com.android.tradefed.util.proto.TfMetricProtoUtil;
import junit.framework.TestCase;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Unit tests for {@link CollectingTestListener}.
*/
public class CollectingTestListenerTest extends TestCase {
private static final String METRIC_VALUE = "value";
private static final String TEST_KEY = "key";
private static final String METRIC_VALUE2 = "value2";
private static final String RUN_KEY = "key2";
private CollectingTestListener mCollectingTestListener;
/**
* {@inheritDoc}
*/
@Override
protected void setUp() throws Exception {
super.setUp();
mCollectingTestListener = new CollectingTestListener();
IInvocationContext context = new InvocationContext();
context.addDeviceBuildInfo("fakeDevice", new BuildInfo());
mCollectingTestListener.invocationStarted(context);
}
/**
* Test the listener under a single normal test run.
*/
public void testSingleRun() {
final TestDescription test = injectTestRun("run", "testFoo", METRIC_VALUE);
TestRunResult runResult = mCollectingTestListener.getCurrentRunResults();
assertTrue(runResult.isRunComplete());
assertFalse(runResult.isRunFailure());
assertEquals(1, mCollectingTestListener.getNumTotalTests());
assertEquals(TestStatus.PASSED,
runResult.getTestResults().get(test).getStatus());
assertTrue(runResult.getTestResults().get(test).getStartTime() > 0);
assertTrue(runResult.getTestResults().get(test).getEndTime() >=
runResult.getTestResults().get(test).getStartTime());
}
/**
* Test the listener where test run has failed.
*/
public void testRunFailed() {
mCollectingTestListener.testRunStarted("foo", 1);
mCollectingTestListener.testRunFailed("error");
mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
TestRunResult runResult = mCollectingTestListener.getCurrentRunResults();
assertTrue(runResult.isRunComplete());
assertTrue(runResult.isRunFailure());
assertEquals("error", runResult.getRunFailureMessage());
}
/**
* Test the listener where test run has failed.
*/
public void testRunFailed_counting() {
mCollectingTestListener.testRunStarted("foo1", 1);
mCollectingTestListener.testRunFailed("error1");
mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
mCollectingTestListener.testRunStarted("foo2", 1);
mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
mCollectingTestListener.testRunStarted("foo3", 1);
mCollectingTestListener.testRunFailed("error3");
mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
assertEquals(2, mCollectingTestListener.getNumAllFailedTestRuns());
}
/**
* Test the listener when invocation is composed of two test runs.
*/
public void testTwoRuns() {
final TestDescription test1 = injectTestRun("run1", "testFoo1", METRIC_VALUE);
final TestDescription test2 = injectTestRun("run2", "testFoo2", METRIC_VALUE2);
assertEquals(2, mCollectingTestListener.getNumTotalTests());
assertEquals(2, mCollectingTestListener.getNumTestsInState(TestStatus.PASSED));
assertEquals(2, mCollectingTestListener.getRunResults().size());
Iterator<TestRunResult> runIter = mCollectingTestListener.getRunResults().iterator();
final TestRunResult runResult1 = runIter.next();
final TestRunResult runResult2 = runIter.next();
assertEquals("run1", runResult1.getName());
assertEquals("run2", runResult2.getName());
assertEquals(TestStatus.PASSED,
runResult1.getTestResults().get(test1).getStatus());
assertEquals(TestStatus.PASSED,
runResult2.getTestResults().get(test2).getStatus());
assertEquals(METRIC_VALUE,
runResult1.getRunMetrics().get(RUN_KEY));
assertEquals(METRIC_VALUE,
runResult1.getTestResults().get(test1).getMetrics().get(TEST_KEY));
assertEquals(METRIC_VALUE2,
runResult2.getTestResults().get(test2).getMetrics().get(TEST_KEY));
}
/**
* Test the listener when invocation is composed of a re-executed test run.
*/
public void testReRun() {
final TestDescription test1 = injectTestRun("run", "testFoo1", METRIC_VALUE);
final TestDescription test2 = injectTestRun("run", "testFoo2", METRIC_VALUE2);
assertEquals(2, mCollectingTestListener.getNumTotalTests());
assertEquals(2, mCollectingTestListener.getNumTestsInState(TestStatus.PASSED));
assertEquals(1, mCollectingTestListener.getRunResults().size());
TestRunResult runResult = mCollectingTestListener.getCurrentRunResults();
assertEquals(2, runResult.getNumTestsInState(TestStatus.PASSED));
assertTrue(runResult.getCompletedTests().contains(test1));
assertTrue(runResult.getCompletedTests().contains(test2));
}
/**
* Test the listener when invocation is composed of a re-executed test run, containing the same
* tests
*/
public void testReRun_overlap() {
injectTestRun("run", "testFoo1", METRIC_VALUE);
injectTestRun("run", "testFoo1", METRIC_VALUE2, true);
assertEquals(1, mCollectingTestListener.getNumTotalTests());
assertEquals(0, mCollectingTestListener.getNumTestsInState(TestStatus.PASSED));
assertEquals(1, mCollectingTestListener.getNumTestsInState(TestStatus.FAILURE));
assertEquals(1, mCollectingTestListener.getRunResults().size());
TestRunResult runResult = mCollectingTestListener.getCurrentRunResults();
assertEquals(0, runResult.getNumTestsInState(TestStatus.PASSED));
assertEquals(1, runResult.getNumTestsInState(TestStatus.FAILURE));
assertEquals(1, runResult.getNumTests());
}
/**
* Test run with incomplete tests
*/
@SuppressWarnings("unchecked")
public void testSingleRun_incomplete() {
mCollectingTestListener.testRunStarted("run", 1);
mCollectingTestListener.testStarted(new TestDescription("FooTest", "incomplete"));
mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
assertEquals(1, mCollectingTestListener.getNumTestsInState(TestStatus.INCOMPLETE));
}
/**
* Test aggregating of metrics with long values
*/
public void testRunEnded_aggregateLongMetrics() {
mCollectingTestListener.setIsAggregrateMetrics(true);
injectTestRun("run", "testFoo1", "1");
injectTestRun("run", "testFoo1", "1");
assertEquals("2", mCollectingTestListener.getCurrentRunResults().getRunMetrics().get(
RUN_KEY));
}
/**
* Test aggregating of metrics with double values
*/
public void testRunEnded_aggregateDoubleMetrics() {
mCollectingTestListener.setIsAggregrateMetrics(true);
injectTestRun("run", "testFoo1", "1.1");
injectTestRun("run", "testFoo1", "1.1");
assertEquals("2.2", mCollectingTestListener.getCurrentRunResults().getRunMetrics().get(
RUN_KEY));
}
/**
* Test aggregating of metrics with different data types
*/
public void testRunEnded_aggregateMixedMetrics() {
mCollectingTestListener.setIsAggregrateMetrics(true);
injectTestRun("run", "testFoo1", "1");
injectTestRun("run", "testFoo1", "1.1");
mCollectingTestListener.invocationEnded(0);
assertEquals("2.1", mCollectingTestListener.getCurrentRunResults().getRunMetrics().get(
RUN_KEY));
}
/**
* Test aggregating of metrics when new metric isn't a number
*/
public void testRunEnded_aggregateNewStringMetrics() {
mCollectingTestListener.setIsAggregrateMetrics(true);
injectTestRun("run", "testFoo1", "1");
injectTestRun("run", "testFoo1", "bar");
mCollectingTestListener.invocationEnded(0);
assertEquals("bar", mCollectingTestListener.getCurrentRunResults().getRunMetrics().get(
RUN_KEY));
}
/**
* Test aggregating of metrics when existing metric isn't a number
*/
public void testRunEnded_aggregateExistingStringMetrics() {
mCollectingTestListener.setIsAggregrateMetrics(true);
injectTestRun("run", "testFoo1", "bar");
injectTestRun("run", "testFoo1", "1");
mCollectingTestListener.invocationEnded(0);
assertEquals("1", mCollectingTestListener.getCurrentRunResults().getRunMetrics().get(
RUN_KEY));
}
public void testGetNumTestsInState() {
injectTestRun("run", "testFoo1", "1");
injectTestRun("run", "testFoo2", "1");
int testsPassed = mCollectingTestListener.getNumTestsInState(TestStatus.PASSED);
assertEquals(2, testsPassed);
injectTestRun("run", "testFoo3", "1");
testsPassed = mCollectingTestListener.getNumTestsInState(TestStatus.PASSED);
assertEquals(3, testsPassed);
}
public void testGetNumTotalTests() {
injectTestRun("run", "testFoo1", "1");
injectTestRun("run", "testFoo2", "1");
int total = mCollectingTestListener.getNumTotalTests();
assertEquals(2, total);
injectTestRun("run", "testFoo3", "1", true);
total = mCollectingTestListener.getNumTotalTests();
assertEquals(3, total);
}
/**
* Injects a single test run with 1 passed test into the {@link CollectingTestListener} under
* test
*
* @return the {@link TestDescription} of added test
*/
private TestDescription injectTestRun(String runName, String testName, String metricValue) {
return injectTestRun(runName, testName, metricValue, false);
}
/**
* Injects a single test run with 1 test into the {@link CollectingTestListener} under test.
*
* @return the {@link TestDescription} of added test
*/
private TestDescription injectTestRun(
String runName, String testName, String metricValue, boolean failtest) {
Map<String, String> runMetrics = new HashMap<String, String>(1);
runMetrics.put(RUN_KEY, metricValue);
Map<String, String> testMetrics = new HashMap<String, String>(1);
testMetrics.put(TEST_KEY, metricValue);
mCollectingTestListener.testRunStarted(runName, 1);
final TestDescription test = new TestDescription("FooTest", testName);
mCollectingTestListener.testStarted(test);
if (failtest) {
mCollectingTestListener.testFailed(test, "trace");
}
mCollectingTestListener.testEnded(test, TfMetricProtoUtil.upgradeConvert(testMetrics));
mCollectingTestListener.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(runMetrics));
return test;
}
}