• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.cts.tradefed.result;
17 
18 import com.android.ddmlib.testrunner.TestIdentifier;
19 import com.android.tradefed.util.ArrayUtil;
20 
21 import org.kxml2.io.KXmlSerializer;
22 import org.xmlpull.v1.XmlPullParser;
23 import org.xmlpull.v1.XmlPullParserException;
24 
25 import java.io.IOException;
26 import java.util.Collection;
27 import java.util.Deque;
28 import java.util.LinkedHashMap;
29 import java.util.Map;
30 
31 /**
32  * Data structure that represents a "TestCase" XML element and its children.
33  */
34 class TestCase extends AbstractXmlPullParser {
35 
36     static final String TAG = "TestCase";
37 
38     private String mName;
39 
40     Map<String, Test> mChildTestMap = new LinkedHashMap<String, Test>();
41 
42     /**
43      * Create a {@link TestCase}
44      * @param testCaseName
45      */
TestCase(String testCaseName)46     public TestCase(String testCaseName) {
47         setName(testCaseName);
48     }
49 
TestCase()50     public TestCase() {
51     }
52 
setName(String name)53     public void setName(String name) {
54         mName = name;
55     }
56 
getName()57     public String getName() {
58         return mName;
59     }
60 
61     /**
62      * Gets the child tests
63      */
getTests()64     public Collection<Test> getTests() {
65         return mChildTestMap.values();
66     }
67 
68     /**
69      * @param testName
70      * @param insertIfMissing
71      * @return
72      */
findTest(String testName, boolean insertIfMissing)73     public Test findTest(String testName, boolean insertIfMissing) {
74         Test t = mChildTestMap.get(testName);
75         if (t == null && insertIfMissing) {
76             t = new Test(testName);
77             mChildTestMap.put(t.getName(), t);
78         }
79         return t;
80     }
81 
82     /**
83      * Serialize this object and all its contents to XML.
84      *
85      * @param serializer
86      * @throws IOException
87      */
serialize(KXmlSerializer serializer)88     public void serialize(KXmlSerializer serializer) throws IOException {
89         serializer.startTag(CtsXmlResultReporter.ns, TAG);
90         serializer.attribute(CtsXmlResultReporter.ns, "name", getName());
91         // unused
92         serializer.attribute(CtsXmlResultReporter.ns, "priority", "");
93         for (Test t : mChildTestMap.values()) {
94             t.serialize(serializer);
95         }
96        serializer.endTag(CtsXmlResultReporter.ns, TAG);
97     }
98 
99     /**
100      * Populates this class with test case result data parsed from XML.
101      *
102      * @param parser the {@link XmlPullParser}. Expected to be pointing at start
103      *            of a TestCase tag
104      */
105     @Override
parse(XmlPullParser parser)106     void parse(XmlPullParser parser) throws XmlPullParserException, IOException {
107         if (!parser.getName().equals(TAG)) {
108             throw new XmlPullParserException(String.format(
109                     "invalid XML: Expected %s tag but received %s", TAG, parser.getName()));
110         }
111         setName(getAttribute(parser, "name"));
112         int eventType = parser.next();
113         while (eventType != XmlPullParser.END_DOCUMENT) {
114             if (eventType == XmlPullParser.START_TAG && parser.getName().equals(Test.TAG)) {
115                 Test test = new Test();
116                 test.parse(parser);
117                 mChildTestMap.put(test.getName(), test);
118             } else if (eventType == XmlPullParser.END_TAG && parser.getName().equals(TAG)) {
119                 return;
120             }
121             eventType = parser.next();
122         }
123     }
124 
125     /**
126      * Adds tests contained in this result that have the given <var>resultFilter</var>.
127      *
128      * @param tests the {@link Collection} of {@link TestIdentifier}s to add to
129      * @param parentSuiteNames a {@link Deque} of parent suite names. Used to
130      *            construct the full class name of the test
131      * @param resultFilter the {@link CtsTestStatus} to filter by
132      */
addTestsWithStatus(Collection<TestIdentifier> tests, Deque<String> parentSuiteNames, CtsTestStatus resultFilter)133     void addTestsWithStatus(Collection<TestIdentifier> tests, Deque<String> parentSuiteNames,
134             CtsTestStatus resultFilter) {
135         if (getName() != null) {
136             parentSuiteNames.addLast(getName());
137         }
138         String fullClassName = ArrayUtil.join(".", parentSuiteNames);
139         for (Test test : mChildTestMap.values()) {
140             if (resultFilter.equals(test.getResult())) {
141                 tests.add(new TestIdentifier(fullClassName, test.getName()));
142             }
143         }
144         if (getName() != null) {
145             parentSuiteNames.removeLast();
146         }
147     }
148 
149     /**
150      * Count the number of tests in this {@link TestCase} with given status.
151      *
152      * @param status
153      * @return the test count
154      */
countTests(CtsTestStatus status)155     public int countTests(CtsTestStatus status) {
156         int total = 0;
157         for (Test test : mChildTestMap.values()) {
158             if (test.getResult().equals(status)) {
159                 total++;
160             }
161         }
162         return total;
163     }
164 }
165