1 #!/usr/bin/env python 2 # 3 # Copyright (C) 2017 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 """A tool to generate TradeFed test config file. 18 """ 19 20 import os 21 import shutil 22 import sys 23 from xml.dom.minidom import parse 24 25 ATTRIBUTE_LABEL = 'android:label' 26 ATTRIBUTE_RUNNER = 'android:name' 27 ATTRIBUTE_PACKAGE = 'package' 28 29 PLACEHOLDER_LABEL = '{LABEL}' 30 PLACEHOLDER_MODULE = '{MODULE}' 31 PLACEHOLDER_PACKAGE = '{PACKAGE}' 32 PLACEHOLDER_RUNNER = '{RUNNER}' 33 PLACEHOLDER_TEST_TYPE = '{TEST_TYPE}' 34 35 36 def main(argv): 37 """Entry point of auto_gen_test_config. 38 39 Args: 40 argv: A list of arguments. 41 Returns: 42 0 if no error, otherwise 1. 43 """ 44 if len(argv) != 4: 45 sys.stderr.write( 46 'Invalid arguements. The script requires 4 arguments for file paths: ' 47 'target_config android_manifest empty_config ' 48 'instrumentation_test_config_template.\n') 49 return 1 50 target_config = argv[0] 51 android_manifest = argv[1] 52 empty_config = argv[2] 53 instrumentation_test_config_template = argv[3] 54 55 manifest = parse(android_manifest) 56 instrumentation_elements = manifest.getElementsByTagName('instrumentation') 57 manifest_elements = manifest.getElementsByTagName('manifest') 58 if len(instrumentation_elements) != 1 or len(manifest_elements) != 1: 59 # Failed to locate instrumentation or manifest element in AndroidManifest. 60 # file. Empty test config file will be created. 61 shutil.copyfile(empty_config, target_config) 62 return 0 63 64 module = os.path.splitext(os.path.basename(target_config))[0] 65 instrumentation = instrumentation_elements[0] 66 manifest = manifest_elements[0] 67 if instrumentation.attributes.has_key(ATTRIBUTE_LABEL): 68 label = instrumentation.attributes[ATTRIBUTE_LABEL].value 69 else: 70 label = module 71 runner = instrumentation.attributes[ATTRIBUTE_RUNNER].value 72 package = manifest.attributes[ATTRIBUTE_PACKAGE].value 73 test_type = ('InstrumentationTest' 74 if runner.endswith('.InstrumentationTestRunner') 75 else 'AndroidJUnitTest') 76 77 with open(instrumentation_test_config_template) as template: 78 config = template.read() 79 config = config.replace(PLACEHOLDER_LABEL, label) 80 config = config.replace(PLACEHOLDER_MODULE, module) 81 config = config.replace(PLACEHOLDER_PACKAGE, package) 82 config = config.replace(PLACEHOLDER_TEST_TYPE, test_type) 83 config = config.replace(PLACEHOLDER_RUNNER, runner) 84 with open(target_config, 'w') as config_file: 85 config_file.write(config) 86 return 0 87 88 if __name__ == '__main__': 89 sys.exit(main(sys.argv[1:])) 90