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