blob: c7c5bdc611d90bf3814f3dae49775e66e7cd1dd6 [file] [log] [blame]
Dan Shiefb892d2017-12-06 15:57:31 -08001#!/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
20import os
21import shutil
22import sys
23from xml.dom.minidom import parse
24
25ATTRIBUTE_LABEL = 'android:label'
26ATTRIBUTE_RUNNER = 'android:name'
Dan Shi9a501682017-12-22 13:32:48 -080027ATTRIBUTE_PACKAGE = 'package'
Dan Shiefb892d2017-12-06 15:57:31 -080028
29PLACEHOLDER_LABEL = '{LABEL}'
30PLACEHOLDER_MODULE = '{MODULE}'
31PLACEHOLDER_PACKAGE = '{PACKAGE}'
32PLACEHOLDER_RUNNER = '{RUNNER}'
33PLACEHOLDER_TEST_TYPE = '{TEST_TYPE}'
34
35
36def 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')
Dan Shi9a501682017-12-22 13:32:48 -080057 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.
Dan Shiefb892d2017-12-06 15:57:31 -080061 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]
Dan Shi9a501682017-12-22 13:32:48 -080066 manifest = manifest_elements[0]
Dan Shiefb892d2017-12-06 15:57:31 -080067 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
Dan Shi9a501682017-12-22 13:32:48 -080072 package = manifest.attributes[ATTRIBUTE_PACKAGE].value
Dan Shi96068b72018-02-21 11:31:06 -080073 test_type = ('InstrumentationTest'
74 if runner.endswith('.InstrumentationTestRunner')
75 else 'AndroidJUnitTest')
Dan Shiefb892d2017-12-06 15:57:31 -080076
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
88if __name__ == '__main__':
89 sys.exit(main(sys.argv[1:]))