155 lines
4.9 KiB
Python
155 lines
4.9 KiB
Python
import json
|
|
import os
|
|
import re
|
|
from xml.dom import minidom
|
|
from xml.etree import ElementTree
|
|
|
|
|
|
SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
|
|
TEST_JSON = 'tests.json'
|
|
TEST_JSON_PATH = os.path.join(SCRIPT_DIR, TEST_JSON)
|
|
|
|
|
|
def write_one_cc_test(test_details, f):
|
|
stringified_sources = map(lambda s: f'"{s}"', test_details['srcs'])
|
|
stringified_data = map(lambda s: f'"{s}"', test_details.get('data', []))
|
|
stringified_cflags = map(lambda s: f'"{s}"', test_details.get('cflags', []))
|
|
|
|
default = "ocl-test-defaults"
|
|
if test_details.get('image_type', False):
|
|
default = "ocl-test-image-defaults"
|
|
|
|
rtti = test_details.get('rtti', False)
|
|
|
|
cc_test_string = """
|
|
cc_test {{
|
|
name: "{}",
|
|
srcs: [ {} ],
|
|
data: [ {} ],
|
|
cflags: [ {} ],
|
|
defaults: [ "{}" ],
|
|
rtti: {},
|
|
gtest: false
|
|
}}
|
|
|
|
""".format(test_details['binary_name'],
|
|
", ".join(stringified_sources),
|
|
", ".join(stringified_data),
|
|
", ".join(stringified_cflags),
|
|
default,
|
|
(str(rtti)).lower())
|
|
|
|
empty_field_regex = re.compile("^\s*\w+: \[\s*\],?$")
|
|
cc_test_string = '\n'.join([line for line in cc_test_string.split('\n')
|
|
if not empty_field_regex.match(line)])
|
|
f.write(cc_test_string)
|
|
|
|
|
|
def generate_android_bp():
|
|
android_bp_head_path = os.path.join(SCRIPT_DIR, 'android_bp_head')
|
|
android_bp_tail_path = os.path.join(SCRIPT_DIR, 'android_bp_tail')
|
|
|
|
with open('Android.bp', 'w') as android_bp:
|
|
with open(android_bp_head_path, 'r') as android_bp_head:
|
|
android_bp.write(android_bp_head.read())
|
|
|
|
with open(TEST_JSON_PATH) as f:
|
|
tests = json.load(f)
|
|
for test in tests:
|
|
write_one_cc_test(test, android_bp)
|
|
|
|
with open(android_bp_tail_path, 'r') as android_bp_tail:
|
|
android_bp.write(android_bp_tail.read())
|
|
|
|
|
|
def create_subelement_with_attribs(element, tag, attribs):
|
|
subelement = ElementTree.SubElement(element, tag)
|
|
|
|
for key, value in attribs.items():
|
|
subelement.attrib[key] = value
|
|
|
|
return subelement
|
|
|
|
|
|
def generate_push_file_rules(configuration):
|
|
create_subelement_with_attribs(configuration, 'target_preparer',
|
|
{ 'class': "com.android.tradefed.targetprep.RootTargetPreparer" })
|
|
file_pusher = create_subelement_with_attribs(configuration, 'target_preparer',
|
|
{ 'class': "com.android.compatibility.common.tradefed.targetprep.FilePusher" })
|
|
create_subelement_with_attribs(file_pusher, 'option',
|
|
{ 'name': "cleanup", 'value': "true" })
|
|
create_subelement_with_attribs(file_pusher, 'option',
|
|
{ 'name': "append-bitness", 'value': "true" })
|
|
|
|
with open(TEST_JSON_PATH, "r") as f:
|
|
tests = json.load(f)
|
|
|
|
for test in tests:
|
|
if test.get('manual_only', False):
|
|
continue
|
|
|
|
create_subelement_with_attribs(file_pusher, 'option',
|
|
{
|
|
'name': "push-file",
|
|
'key': test['binary_name'],
|
|
'value': "/data/nativetest64/unrestricted/{}".format(test['binary_name'])
|
|
})
|
|
|
|
|
|
def generate_test_rules(configuration):
|
|
with open(TEST_JSON_PATH, "r") as f:
|
|
tests = json.load(f)
|
|
|
|
for test in tests:
|
|
if test.get('manual_only', False):
|
|
continue
|
|
|
|
test_rule = create_subelement_with_attribs(configuration, 'test',
|
|
{ 'class': "com.android.tradefed.testtype.python.PythonBinaryHostTest" })
|
|
|
|
create_subelement_with_attribs(test_rule, 'option',
|
|
{ 'name': "par-file-name", 'value': "opencl_cts" })
|
|
create_subelement_with_attribs(test_rule, 'option',
|
|
{ 'name': "inject-android-serial", 'value': "true" })
|
|
create_subelement_with_attribs(test_rule, 'option',
|
|
{ 'name': "test-timeout", 'value': test.get('timeout', "30m") })
|
|
create_subelement_with_attribs(test_rule, 'option',
|
|
{ 'name': "python-options", 'value': test["test_name"] })
|
|
create_subelement_with_attribs(test_rule, 'option',
|
|
{ 'name': "python-options",
|
|
'value': "/data/nativetest64/unrestricted/{}".format(test['binary_name']) })
|
|
|
|
for arg in test.get('arguments', []):
|
|
create_subelement_with_attribs(test_rule, 'option',
|
|
{ 'name': "python-options", 'value': arg })
|
|
|
|
|
|
def generate_test_xml():
|
|
configuration = ElementTree.Element('configuration')
|
|
configuration.attrib['description'] = "Config to run OpenCL CTS"
|
|
|
|
logcat = ElementTree.SubElement(configuration, 'option')
|
|
logcat.attrib['name'] = "logcat-on-failure"
|
|
logcat.attrib['value'] = "false"
|
|
|
|
generate_push_file_rules(configuration)
|
|
generate_test_rules(configuration)
|
|
|
|
stringified_configuration = ElementTree.tostring(configuration, 'utf-8')
|
|
reparsed_configuration = minidom.parseString(stringified_configuration)
|
|
with open('test_opencl_cts.xml', 'w') as f:
|
|
f.write(reparsed_configuration.toprettyxml(indent=" "*4))
|
|
|
|
|
|
def main():
|
|
generate_android_bp()
|
|
generate_test_xml()
|
|
|
|
print("Don't forget to move -")
|
|
print(" Android.bp -> {ANDROID_ROOT}/external/OpenCL-CTS/Android.bp")
|
|
print(" test_opencl_cts.xml -> {ANDROID_ROOT}/external/OpenCL-CTS/scripts/test_opencl_cts.xml")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|