blob: fdb8b3b5eb82c0b520e23b8da7c45b10d1fc5027 [file] [log] [blame]
/*
* Copyright (C) 2011 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.cts.tradefed.result;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.util.ArrayUtil;
import org.kxml2.io.KXmlSerializer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Collection;
import java.util.Deque;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Data structure that represents a "TestCase" XML element and its children.
*/
class TestCase extends AbstractXmlPullParser {
static final String TAG = "TestCase";
private String mName;
Map<String, Test> mChildTestMap = new LinkedHashMap<String, Test>();
/**
* Create a {@link TestCase}
* @param testCaseName
*/
public TestCase(String testCaseName) {
setName(testCaseName);
}
public TestCase() {
}
public void setName(String name) {
mName = name;
}
public String getName() {
return mName;
}
/**
* Gets the child tests
*/
public Collection<Test> getTests() {
return mChildTestMap.values();
}
/**
* @param testName
* @param insertIfMissing
* @return
*/
public Test findTest(String testName, boolean insertIfMissing) {
Test t = mChildTestMap.get(testName);
if (t == null && insertIfMissing) {
t = new Test(testName);
mChildTestMap.put(t.getName(), t);
}
return t;
}
/**
* Serialize this object and all its contents to XML.
*
* @param serializer
* @throws IOException
*/
public void serialize(KXmlSerializer serializer) throws IOException {
serializer.startTag(CtsXmlResultReporter.ns, TAG);
serializer.attribute(CtsXmlResultReporter.ns, "name", getName());
// unused
serializer.attribute(CtsXmlResultReporter.ns, "priority", "");
for (Test t : mChildTestMap.values()) {
t.serialize(serializer);
}
serializer.endTag(CtsXmlResultReporter.ns, TAG);
}
/**
* Populates this class with test case result data parsed from XML.
*
* @param parser the {@link XmlPullParser}. Expected to be pointing at start
* of a TestCase tag
*/
@Override
void parse(XmlPullParser parser) throws XmlPullParserException, IOException {
if (!parser.getName().equals(TAG)) {
throw new XmlPullParserException(String.format(
"invalid XML: Expected %s tag but received %s", TAG, parser.getName()));
}
setName(getAttribute(parser, "name"));
int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG && parser.getName().equals(Test.TAG)) {
Test test = new Test();
test.parse(parser);
mChildTestMap.put(test.getName(), test);
} else if (eventType == XmlPullParser.END_TAG && parser.getName().equals(TAG)) {
return;
}
eventType = parser.next();
}
}
/**
* Adds tests contained in this result that have the given <var>resultFilter</var>.
*
* @param tests the {@link Collection} of {@link TestIdentifier}s to add to
* @param parentSuiteNames a {@link Deque} of parent suite names. Used to
* construct the full class name of the test
* @param resultFilter the {@link CtsTestStatus} to filter by
*/
void addTestsWithStatus(Collection<TestIdentifier> tests, Deque<String> parentSuiteNames,
CtsTestStatus resultFilter) {
if (getName() != null) {
parentSuiteNames.addLast(getName());
}
String fullClassName = ArrayUtil.join(".", parentSuiteNames);
for (Test test : mChildTestMap.values()) {
if (resultFilter.equals(test.getResult())) {
tests.add(new TestIdentifier(fullClassName, test.getName()));
}
}
if (getName() != null) {
parentSuiteNames.removeLast();
}
}
/**
* Count the number of tests in this {@link TestCase} with given status.
*
* @param status
* @return the test count
*/
public int countTests(CtsTestStatus status) {
int total = 0;
for (Test test : mChildTestMap.values()) {
if (test.getResult().equals(status)) {
total++;
}
}
return total;
}
}