1 /*
2  * Copyright (C) 2010 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 
17 package com.android.cts.tradefed.testtype;
18 
19 import com.android.cts.util.AbiUtils;
20 import com.android.ddmlib.testrunner.TestIdentifier;
21 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
22 
23 import junit.framework.TestCase;
24 
25 import java.io.ByteArrayInputStream;
26 import java.io.InputStream;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Map;
30 
31 /**
32  * Unit tests for {@link TestPackageXmlParser}.
33  */
34 public class TestPackageXmlParserTest extends TestCase {
35 
36     private static final String INSTR_TEST_DATA =
37         "<TestPackage AndroidFramework=\"Android 1.0\" appNameSpace=\"com.example\" " +
38         "appPackageName=\"android.example\" name=\"CtsExampleTestCases\" " +
39         "runner=\"android.test.InstrumentationTestRunner\" version=\"1.0\">" +
40         "</TestPackage>";
41 
42     private static final String HOST_TEST_DATA =
43         "<TestPackage hostSideOnly=\"true\" >\n" +
44         "    <TestSuite name=\"com\" >\n" +
45         "        <TestSuite name=\"example\" >\n" +
46         "            <TestCase name=\"ExampleTest\" >\n" +
47         "                <Test name=\"testFoo\" />\n" +
48         "                <Test name=\"testFoo2\" expectation=\"failure\" />\n" +
49         "            </TestCase>\n" +
50         "        </TestSuite>\n" +
51         "        <TestSuite name=\"example2\" >\n" +
52         "            <TestCase name=\"Example2Test\" >\n" +
53         "                <Test name=\"testFoo\" />\n" +
54         "            </TestCase>\n" +
55         "        </TestSuite>\n" +
56         "    </TestSuite>\n" +
57         "</TestPackage>";
58 
59     private static final String BAD_HOST_TEST_DATA =
60         "<TestPackage hostSideOnly=\"blah\" >" +
61         "</TestPackage>";
62 
63     private static final String VM_HOST_TEST_XML =
64             "<TestPackage vmHostTest=\"true\"></TestPackage>";
65 
66     private static final String NATIVE_TEST_XML = "<TestPackage testType=\"native\"></TestPackage>";
67 
68     private static final String NO_TEST_DATA = "<invalid />";
69 
70     private static final String INSTANCED_TEST_DATA =
71         "<TestPackage>\n" +
72         "    <TestSuite name=\"com\" >\n" +
73         "        <TestSuite name=\"example\" >\n" +
74         "            <TestCase name=\"ExampleTest\" >\n" +
75         "                <Test name=\"testMultiInstanced\" >\n" +
76         "                    <TestInstance foo=\"bar\" />\n" +
77         "                    <TestInstance foo=\"baz\" foo2=\"baz2\"/>\n" +
78         "                </Test>\n" +
79         "                <Test name=\"testSingleInstanced\" >\n" +
80         "                    <TestInstance foo=\"bar\" />\n" +
81         "                </Test>\n" +
82         "                <Test name=\"testEmptyInstances\" >\n" +
83         "                    <TestInstance />\n" +
84         "                    <TestInstance />\n" +
85         "                </Test>\n" +
86         "                <Test name=\"testNotInstanced\" >\n" +
87         "                </Test>\n" +
88         "            </TestCase>\n" +
89         "        </TestSuite>\n" +
90         "    </TestSuite>\n" +
91         "</TestPackage>";
92 
93     /**
94      * Test parsing test case xml containing an instrumentation test definition.
95      */
testParse_instrPackage()96     public void testParse_instrPackage() throws ParseException  {
97         TestPackageXmlParser parser = new TestPackageXmlParser(true);
98         parser.parse(getStringAsStream(INSTR_TEST_DATA));
99         for (TestPackageDef def : parser.getTestPackageDefs()) {
100             assertEquals("com.example", def.getAppNameSpace());
101             assertEquals("android.example", def.getAppPackageName());
102             assertEquals("android.test.InstrumentationTestRunner", def.getRunner());
103             assertTrue(AbiUtils.isAbiSupportedByCts(def.getAbi().getName()));
104         }
105     }
106 
107     /**
108      * Test parsing test case xml containing an host test attribute and test data.
109      */
testParse_hostTest()110     public void testParse_hostTest() throws ParseException  {
111         TestPackageXmlParser parser = new TestPackageXmlParser(true);
112         parser.parse(getStringAsStream(HOST_TEST_DATA));
113         for (TestPackageDef def : parser.getTestPackageDefs()) {
114             assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
115             assertEquals(3, def.getTests().size());
116             Iterator<TestIdentifier> iterator = def.getTests().iterator();
117 
118             TestIdentifier firstTest = iterator.next();
119             assertEquals("com.example.ExampleTest", firstTest.getClassName());
120             assertEquals("testFoo", firstTest.getTestName());
121 
122             TestIdentifier secondTest = iterator.next();
123             assertEquals("com.example.ExampleTest", secondTest.getClassName());
124             assertEquals("testFoo2", secondTest.getTestName());
125 
126             TestIdentifier thirdTest = iterator.next();
127             assertEquals("com.example2.Example2Test", thirdTest.getClassName());
128             assertEquals("testFoo", thirdTest.getTestName());
129 
130             assertFalse(iterator.hasNext());
131         }
132     }
133 
testParse_hostTest_noKnownFailures()134     public void testParse_hostTest_noKnownFailures() throws ParseException  {
135         TestPackageXmlParser parser = new TestPackageXmlParser(false);
136         parser.parse(getStringAsStream(HOST_TEST_DATA));
137         for (TestPackageDef def : parser.getTestPackageDefs()) {
138             assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
139             assertEquals(2, def.getTests().size());
140             Iterator<TestIdentifier> iterator = def.getTests().iterator();
141 
142             TestIdentifier firstTest = iterator.next();
143             assertEquals("com.example.ExampleTest", firstTest.getClassName());
144             assertEquals("testFoo", firstTest.getTestName());
145 
146             TestIdentifier thirdTest = iterator.next();
147             assertEquals("com.example2.Example2Test", thirdTest.getClassName());
148             assertEquals("testFoo", thirdTest.getTestName());
149 
150             assertFalse(iterator.hasNext());
151         }
152     }
153 
154     /**
155      * Test parsing test case xml containing an invalid host test attribute.
156      */
testParse_badHostTest()157     public void testParse_badHostTest() throws ParseException  {
158         TestPackageXmlParser parser = new TestPackageXmlParser(true);
159         parser.parse(getStringAsStream(BAD_HOST_TEST_DATA));
160         for (TestPackageDef def : parser.getTestPackageDefs()) {
161             assertFalse(TestPackageDef.HOST_SIDE_ONLY_TEST.equals(def.getTestType()));
162         }
163     }
164 
testParse_vmHostTest()165     public void testParse_vmHostTest() throws ParseException  {
166         assertTestType(TestPackageDef.VM_HOST_TEST, VM_HOST_TEST_XML);
167     }
168 
testParse_nativeTest()169     public void testParse_nativeTest() throws ParseException  {
170         assertTestType(TestPackageDef.NATIVE_TEST, NATIVE_TEST_XML);
171     }
172 
assertTestType(String expectedType, String xml)173     private void assertTestType(String expectedType, String xml) throws ParseException {
174         TestPackageXmlParser parser = new TestPackageXmlParser(true);
175         parser.parse(getStringAsStream(xml));
176         for (TestPackageDef def : parser.getTestPackageDefs()) {
177             assertEquals(expectedType, def.getTestType());
178         }
179     }
180 
181     /**
182      * Test parsing a test case xml with no test package data.
183      */
testParse_noData()184     public void testParse_noData() throws ParseException  {
185         TestPackageXmlParser parser = new TestPackageXmlParser(true);
186         parser.parse(getStringAsStream(NO_TEST_DATA));
187         assertTrue(parser.getTestPackageDefs().isEmpty());
188     }
189 
190     /**
191      * Test parsing a test case xml with multiple test instances
192      */
testParse_instancedMultiple()193     public void testParse_instancedMultiple() throws ParseException  {
194         TestPackageXmlParser parser = new TestPackageXmlParser(true);
195         parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
196         for (TestPackageDef def : parser.getTestPackageDefs()) {
197             final TestIdentifier testId =
198                     new TestIdentifier("com.example.ExampleTest", "testMultiInstanced");
199             final List<Map<String, String>> targetInstances =
200                     def.getTestInstanceArguments().get(testId);
201             assertNotNull(targetInstances);
202             assertEquals(2, targetInstances.size());
203 
204             final Iterator<Map<String, String>> iterator = targetInstances.iterator();
205             final Map<String, String> firstInstance = iterator.next();
206             final Map<String, String> secondInstance = iterator.next();
207 
208             assertEquals("bar", firstInstance.get("foo"));
209             assertEquals("baz", secondInstance.get("foo"));
210             assertEquals("baz2", secondInstance.get("foo2"));
211         }
212     }
213 
214     /**
215      * Test parsing a test case xml with single test instance
216      */
testParse_instancedSingle()217     public void testParse_instancedSingle() throws ParseException  {
218         TestPackageXmlParser parser = new TestPackageXmlParser(true);
219         parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
220         for (TestPackageDef def : parser.getTestPackageDefs()) {
221             final TestIdentifier testId =
222                     new TestIdentifier("com.example.ExampleTest", "testSingleInstanced");
223             final List<Map<String, String>> targetInstances =
224                     def.getTestInstanceArguments().get(testId);
225             assertNotNull(targetInstances);
226             assertEquals(1, targetInstances.size());
227 
228             final Iterator<Map<String, String>> iterator = targetInstances.iterator();
229             final Map<String, String> firstInstance = iterator.next();
230 
231             assertEquals("bar", firstInstance.get("foo"));
232         }
233     }
234 
235     /**
236      * Test parsing a test case xml with multiple test instances with no data
237      */
testParse_instancedEmptys()238     public void testParse_instancedEmptys() throws ParseException  {
239         TestPackageXmlParser parser = new TestPackageXmlParser(true);
240         parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
241         for (TestPackageDef def : parser.getTestPackageDefs()) {
242             final TestIdentifier testId =
243                     new TestIdentifier("com.example.ExampleTest", "testEmptyInstances");
244             final List<Map<String, String>> targetInstances =
245                     def.getTestInstanceArguments().get(testId);
246             assertNotNull(targetInstances);
247             assertEquals(2, targetInstances.size());
248 
249             final Iterator<Map<String, String>> iterator = targetInstances.iterator();
250             final Map<String, String> firstInstance = iterator.next();
251             final Map<String, String> secondInstance = iterator.next();
252 
253             assertTrue(firstInstance.isEmpty());
254             assertTrue(secondInstance.isEmpty());
255         }
256     }
257 
258     /**
259      * Test parsing a test case xml with no test instances
260      */
testParse_instancedNoInstances()261     public void testParse_instancedNoInstances() throws ParseException  {
262         TestPackageXmlParser parser = new TestPackageXmlParser(true);
263         parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
264         for (TestPackageDef def : parser.getTestPackageDefs()) {
265             final TestIdentifier testId =
266                     new TestIdentifier("com.example.ExampleTest", "testNotInstanced");
267             final List<Map<String, String>> targetInstances =
268                     def.getTestInstanceArguments().get(testId);
269             assertNotNull(targetInstances);
270             assertTrue(targetInstances.isEmpty());
271         }
272     }
273 
getStringAsStream(String input)274     private InputStream getStringAsStream(String input) {
275         return new ByteArrayInputStream(input.getBytes());
276     }
277 }
278