90 lines
3.0 KiB
Python
Executable File
90 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Copyright (C) 2017 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""A tool to generate TradeFed test config file.
|
|
"""
|
|
|
|
import os
|
|
import shutil
|
|
import sys
|
|
from xml.dom.minidom import parse
|
|
|
|
ATTRIBUTE_LABEL = 'android:label'
|
|
ATTRIBUTE_RUNNER = 'android:name'
|
|
ATTRIBUTE_PACKAGE = 'package'
|
|
|
|
PLACEHOLDER_LABEL = '{LABEL}'
|
|
PLACEHOLDER_MODULE = '{MODULE}'
|
|
PLACEHOLDER_PACKAGE = '{PACKAGE}'
|
|
PLACEHOLDER_RUNNER = '{RUNNER}'
|
|
PLACEHOLDER_TEST_TYPE = '{TEST_TYPE}'
|
|
|
|
|
|
def main(argv):
|
|
"""Entry point of auto_gen_test_config.
|
|
|
|
Args:
|
|
argv: A list of arguments.
|
|
Returns:
|
|
0 if no error, otherwise 1.
|
|
"""
|
|
if len(argv) != 4:
|
|
sys.stderr.write(
|
|
'Invalid arguements. The script requires 4 arguments for file paths: '
|
|
'target_config android_manifest empty_config '
|
|
'instrumentation_test_config_template.\n')
|
|
return 1
|
|
target_config = argv[0]
|
|
android_manifest = argv[1]
|
|
empty_config = argv[2]
|
|
instrumentation_test_config_template = argv[3]
|
|
|
|
manifest = parse(android_manifest)
|
|
instrumentation_elements = manifest.getElementsByTagName('instrumentation')
|
|
manifest_elements = manifest.getElementsByTagName('manifest')
|
|
if len(instrumentation_elements) != 1 or len(manifest_elements) != 1:
|
|
# Failed to locate instrumentation or manifest element in AndroidManifest.
|
|
# file. Empty test config file will be created.
|
|
shutil.copyfile(empty_config, target_config)
|
|
return 0
|
|
|
|
module = os.path.splitext(os.path.basename(target_config))[0]
|
|
instrumentation = instrumentation_elements[0]
|
|
manifest = manifest_elements[0]
|
|
if instrumentation.attributes.has_key(ATTRIBUTE_LABEL):
|
|
label = instrumentation.attributes[ATTRIBUTE_LABEL].value
|
|
else:
|
|
label = module
|
|
runner = instrumentation.attributes[ATTRIBUTE_RUNNER].value
|
|
package = manifest.attributes[ATTRIBUTE_PACKAGE].value
|
|
test_type = ('InstrumentationTest'
|
|
if runner.endswith('.InstrumentationTestRunner')
|
|
else 'AndroidJUnitTest')
|
|
|
|
with open(instrumentation_test_config_template) as template:
|
|
config = template.read()
|
|
config = config.replace(PLACEHOLDER_LABEL, label)
|
|
config = config.replace(PLACEHOLDER_MODULE, module)
|
|
config = config.replace(PLACEHOLDER_PACKAGE, package)
|
|
config = config.replace(PLACEHOLDER_TEST_TYPE, test_type)
|
|
config = config.replace(PLACEHOLDER_RUNNER, runner)
|
|
with open(target_config, 'w') as config_file:
|
|
config_file.write(config)
|
|
return 0
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv[1:]))
|