1 #!/usr/bin/python2.4 2 # 3 # 4 # Copyright 2009, The Android Open Source Project 5 # 6 # Licensed under the Apache License, Version 2.0 (the "License"); 7 # you may not use this file except in compliance with the License. 8 # You may obtain a copy of the License at 9 # 10 # http://www.apache.org/licenses/LICENSE-2.0 11 # 12 # Unless required by applicable law or agreed to in writing, software 13 # distributed under the License is distributed on an "AS IS" BASIS, 14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 # See the License for the specific language governing permissions and 16 # limitations under the License. 17 18 """Utility to parse suite info from xml.""" 19 20 # Python imports 21 import xml.dom.minidom 22 import xml.parsers 23 24 # local imports 25 import errors 26 import logger 27 import host_test 28 import instrumentation_test 29 import native_test 30 31 32 class XmlSuiteParser(object): 33 """Parses XML attributes common to all TestSuite's.""" 34 35 # common attributes 36 _NAME_ATTR = 'name' 37 _BUILD_ATTR = 'build_path' 38 _CONTINUOUS_ATTR = 'continuous' 39 _SUITE_ATTR = 'suite' 40 _DESCRIPTION_ATTR = 'description' 41 _EXTRA_BUILD_ARGS_ATTR = 'extra_build_args' 42 43 def Parse(self, element): 44 """Populates common suite attributes from given suite xml element. 45 46 Args: 47 element: xml node to parse 48 Raises: 49 ParseError if a required attribute is missing. 50 Returns: 51 parsed test suite or None 52 """ 53 parser = None 54 if element.nodeName == InstrumentationParser.TAG_NAME: 55 parser = InstrumentationParser() 56 elif element.nodeName == NativeParser.TAG_NAME: 57 parser = NativeParser() 58 elif element.nodeName == HostParser.TAG_NAME: 59 parser = HostParser() 60 else: 61 logger.Log('Unrecognized tag %s found' % element.nodeName) 62 return None 63 test_suite = parser.Parse(element) 64 return test_suite 65 66 def _ParseCommonAttributes(self, suite_element, test_suite): 67 test_suite.SetName(self._ParseAttribute(suite_element, self._NAME_ATTR, 68 True)) 69 test_suite.SetBuildPath(self._ParseAttribute(suite_element, 70 self._BUILD_ATTR, True)) 71 test_suite.SetContinuous(self._ParseAttribute(suite_element, 72 self._CONTINUOUS_ATTR, 73 False, default_value=False)) 74 test_suite.SetSuite(self._ParseAttribute(suite_element, self._SUITE_ATTR, False, 75 default_value=None)) 76 test_suite.SetDescription(self._ParseAttribute(suite_element, 77 self._DESCRIPTION_ATTR, 78 False, 79 default_value='')) 80 test_suite.SetExtraBuildArgs(self._ParseAttribute( 81 suite_element, self._EXTRA_BUILD_ARGS_ATTR, False, default_value='')) 82 83 def _ParseAttribute(self, suite_element, attribute_name, mandatory, 84 default_value=None): 85 if suite_element.hasAttribute(attribute_name): 86 value = suite_element.getAttribute(attribute_name) 87 elif mandatory: 88 error_msg = ('Could not find attribute %s in %s' % 89 (attribute_name, self.TAG_NAME)) 90 raise errors.ParseError(msg=error_msg) 91 else: 92 value = default_value 93 return value 94 95 96 class InstrumentationParser(XmlSuiteParser): 97 """Parses instrumentation suite attributes from xml.""" 98 99 # for legacy reasons, the xml tag name for java (device) tests is 'test' 100 TAG_NAME = 'test' 101 102 _PKG_ATTR = 'package' 103 _RUNNER_ATTR = 'runner' 104 _CLASS_ATTR = 'class' 105 _TARGET_ATTR = 'coverage_target' 106 107 def Parse(self, suite_element): 108 """Creates suite and populate with data from xml element.""" 109 suite = instrumentation_test.InstrumentationTestSuite() 110 XmlSuiteParser._ParseCommonAttributes(self, suite_element, suite) 111 suite.SetPackageName(self._ParseAttribute(suite_element, self._PKG_ATTR, 112 True)) 113 suite.SetRunnerName(self._ParseAttribute( 114 suite_element, self._RUNNER_ATTR, False, 115 instrumentation_test.InstrumentationTestSuite.DEFAULT_RUNNER)) 116 suite.SetClassName(self._ParseAttribute(suite_element, self._CLASS_ATTR, 117 False)) 118 suite.SetTargetName(self._ParseAttribute(suite_element, self._TARGET_ATTR, 119 False)) 120 return suite 121 122 123 class NativeParser(XmlSuiteParser): 124 """Parses native suite attributes from xml.""" 125 126 TAG_NAME = 'test-native' 127 128 def Parse(self, suite_element): 129 """Creates suite and populate with data from xml element.""" 130 suite = native_test.NativeTestSuite() 131 XmlSuiteParser._ParseCommonAttributes(self, suite_element, suite) 132 return suite 133 134 135 class HostParser(XmlSuiteParser): 136 """Parses host suite attributes from xml.""" 137 138 TAG_NAME = 'test-host' 139 140 _CLASS_ATTR = 'class' 141 # TODO: consider obsoleting in favor of parsing the Android.mk to find the 142 # jar name 143 _JAR_ATTR = 'jar_name' 144 145 def Parse(self, suite_element): 146 """Creates suite and populate with data from xml element.""" 147 suite = host_test.HostTestSuite() 148 XmlSuiteParser._ParseCommonAttributes(self, suite_element, suite) 149 suite.SetClassName(self._ParseAttribute(suite_element, self._CLASS_ATTR, 150 True)) 151 suite.SetJarName(self._ParseAttribute(suite_element, self._JAR_ATTR, True)) 152 return suite 153