xref: /aosp_15_r20/external/OpenCL-CTS/scripts/generate_test_files.py (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimiimport json
2*6467f958SSadaf Ebrahimiimport os
3*6467f958SSadaf Ebrahimiimport re
4*6467f958SSadaf Ebrahimiimport shutil
5*6467f958SSadaf Ebrahimiimport subprocess
6*6467f958SSadaf Ebrahimifrom xml.dom import minidom
7*6467f958SSadaf Ebrahimifrom xml.etree import ElementTree
8*6467f958SSadaf Ebrahimi
9*6467f958SSadaf Ebrahimi
10*6467f958SSadaf EbrahimiSCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
11*6467f958SSadaf EbrahimiTEST_JSON = 'tests.json'
12*6467f958SSadaf EbrahimiTEST_JSON_PATH = os.path.join(SCRIPT_DIR, TEST_JSON)
13*6467f958SSadaf Ebrahimi
14*6467f958SSadaf Ebrahimi
15*6467f958SSadaf Ebrahimidef write_one_cc_test(test_details, f):
16*6467f958SSadaf Ebrahimi  stringified_sources = map(lambda s: f'"{s}"', test_details['srcs'])
17*6467f958SSadaf Ebrahimi  stringified_data = map(lambda s: f'"{s}"', test_details.get('data', []))
18*6467f958SSadaf Ebrahimi  stringified_cflags = map(lambda s: f'"{s}"', test_details.get('cflags', []))
19*6467f958SSadaf Ebrahimi
20*6467f958SSadaf Ebrahimi  default = "ocl-test-defaults"
21*6467f958SSadaf Ebrahimi  if test_details.get('image_type', False):
22*6467f958SSadaf Ebrahimi    default = "ocl-test-image-defaults"
23*6467f958SSadaf Ebrahimi
24*6467f958SSadaf Ebrahimi  rtti = test_details.get('rtti', False)
25*6467f958SSadaf Ebrahimi
26*6467f958SSadaf Ebrahimi  cc_test_string = """
27*6467f958SSadaf Ebrahimicc_test {{
28*6467f958SSadaf Ebrahimi    name: "{}",
29*6467f958SSadaf Ebrahimi    srcs: [ {} ],
30*6467f958SSadaf Ebrahimi    data: [ {} ],
31*6467f958SSadaf Ebrahimi    cflags: [ {} ],
32*6467f958SSadaf Ebrahimi    defaults: [ "{}" ],
33*6467f958SSadaf Ebrahimi    rtti: {},
34*6467f958SSadaf Ebrahimi    gtest: false
35*6467f958SSadaf Ebrahimi}}
36*6467f958SSadaf Ebrahimi
37*6467f958SSadaf Ebrahimi""".format(test_details['binary_name'],
38*6467f958SSadaf Ebrahimi           ", ".join(stringified_sources),
39*6467f958SSadaf Ebrahimi           ", ".join(stringified_data),
40*6467f958SSadaf Ebrahimi           ", ".join(stringified_cflags),
41*6467f958SSadaf Ebrahimi           default,
42*6467f958SSadaf Ebrahimi           (str(rtti)).lower())
43*6467f958SSadaf Ebrahimi
44*6467f958SSadaf Ebrahimi  empty_field_regex = re.compile("^\s*\w+: \[\s*\],?$")
45*6467f958SSadaf Ebrahimi  cc_test_string = '\n'.join([line for line in cc_test_string.split('\n')
46*6467f958SSadaf Ebrahimi                                   if not empty_field_regex.match(line)])
47*6467f958SSadaf Ebrahimi  f.write(cc_test_string)
48*6467f958SSadaf Ebrahimi
49*6467f958SSadaf Ebrahimi
50*6467f958SSadaf Ebrahimi# Return value indicates whether the output should be formatted with bpfmt
51*6467f958SSadaf Ebrahimidef generate_android_bp() -> bool:
52*6467f958SSadaf Ebrahimi  android_bp_head_path = os.path.join(SCRIPT_DIR, 'android_bp_head')
53*6467f958SSadaf Ebrahimi  android_bp_tail_path = os.path.join(SCRIPT_DIR, 'android_bp_tail')
54*6467f958SSadaf Ebrahimi
55*6467f958SSadaf Ebrahimi  with open('Android.bp', 'w') as android_bp:
56*6467f958SSadaf Ebrahimi    with open(android_bp_head_path, 'r') as android_bp_head:
57*6467f958SSadaf Ebrahimi      android_bp.write(android_bp_head.read())
58*6467f958SSadaf Ebrahimi
59*6467f958SSadaf Ebrahimi    with open(TEST_JSON_PATH) as f:
60*6467f958SSadaf Ebrahimi      tests = json.load(f)
61*6467f958SSadaf Ebrahimi    for test in tests:
62*6467f958SSadaf Ebrahimi      write_one_cc_test(test, android_bp)
63*6467f958SSadaf Ebrahimi
64*6467f958SSadaf Ebrahimi    with open(android_bp_tail_path, 'r') as android_bp_tail:
65*6467f958SSadaf Ebrahimi      android_bp.write(android_bp_tail.read())
66*6467f958SSadaf Ebrahimi
67*6467f958SSadaf Ebrahimi  if shutil.which('bpfmt') is not None:
68*6467f958SSadaf Ebrahimi    subprocess.run(['bpfmt', '-w', 'Android.bp'])
69*6467f958SSadaf Ebrahimi    return True
70*6467f958SSadaf Ebrahimi
71*6467f958SSadaf Ebrahimi  return False
72*6467f958SSadaf Ebrahimi
73*6467f958SSadaf Ebrahimi
74*6467f958SSadaf Ebrahimidef create_subelement_with_attribs(element, tag, attribs):
75*6467f958SSadaf Ebrahimi  subelement = ElementTree.SubElement(element, tag)
76*6467f958SSadaf Ebrahimi
77*6467f958SSadaf Ebrahimi  for key, value in attribs.items():
78*6467f958SSadaf Ebrahimi    subelement.attrib[key] = value
79*6467f958SSadaf Ebrahimi
80*6467f958SSadaf Ebrahimi  return subelement
81*6467f958SSadaf Ebrahimi
82*6467f958SSadaf Ebrahimi
83*6467f958SSadaf Ebrahimidef generate_push_file_rules(configuration):
84*6467f958SSadaf Ebrahimi  create_subelement_with_attribs(configuration, 'target_preparer',
85*6467f958SSadaf Ebrahimi      { 'class': "com.android.tradefed.targetprep.RootTargetPreparer" })
86*6467f958SSadaf Ebrahimi  file_pusher = create_subelement_with_attribs(configuration, 'target_preparer',
87*6467f958SSadaf Ebrahimi      { 'class': "com.android.compatibility.common.tradefed.targetprep.FilePusher" })
88*6467f958SSadaf Ebrahimi  create_subelement_with_attribs(file_pusher, 'option',
89*6467f958SSadaf Ebrahimi      { 'name': "cleanup", 'value': "true" })
90*6467f958SSadaf Ebrahimi  create_subelement_with_attribs(file_pusher, 'option',
91*6467f958SSadaf Ebrahimi      { 'name': "append-bitness", 'value': "true" })
92*6467f958SSadaf Ebrahimi
93*6467f958SSadaf Ebrahimi  with open(TEST_JSON_PATH, "r") as f:
94*6467f958SSadaf Ebrahimi    tests = json.load(f)
95*6467f958SSadaf Ebrahimi
96*6467f958SSadaf Ebrahimi  for test in tests:
97*6467f958SSadaf Ebrahimi    if test.get('manual_only', False):
98*6467f958SSadaf Ebrahimi      continue
99*6467f958SSadaf Ebrahimi
100*6467f958SSadaf Ebrahimi    create_subelement_with_attribs(file_pusher, 'option',
101*6467f958SSadaf Ebrahimi        {
102*6467f958SSadaf Ebrahimi          'name': "push-file",
103*6467f958SSadaf Ebrahimi          'key': test['binary_name'],
104*6467f958SSadaf Ebrahimi          'value': "/data/nativetest64/unrestricted/{}".format(test['binary_name'])
105*6467f958SSadaf Ebrahimi        })
106*6467f958SSadaf Ebrahimi
107*6467f958SSadaf Ebrahimi
108*6467f958SSadaf Ebrahimidef generate_test_rules(configuration):
109*6467f958SSadaf Ebrahimi  with open(TEST_JSON_PATH, "r") as f:
110*6467f958SSadaf Ebrahimi    tests = json.load(f)
111*6467f958SSadaf Ebrahimi
112*6467f958SSadaf Ebrahimi  for test in tests:
113*6467f958SSadaf Ebrahimi    if test.get('manual_only', False):
114*6467f958SSadaf Ebrahimi      continue
115*6467f958SSadaf Ebrahimi
116*6467f958SSadaf Ebrahimi    test_rule = create_subelement_with_attribs(configuration, 'test',
117*6467f958SSadaf Ebrahimi        { 'class': "com.android.tradefed.testtype.python.PythonBinaryHostTest" })
118*6467f958SSadaf Ebrahimi
119*6467f958SSadaf Ebrahimi    create_subelement_with_attribs(test_rule, 'option',
120*6467f958SSadaf Ebrahimi        { 'name': "par-file-name", 'value': "opencl_cts" })
121*6467f958SSadaf Ebrahimi    create_subelement_with_attribs(test_rule, 'option',
122*6467f958SSadaf Ebrahimi        { 'name': "inject-android-serial", 'value': "true" })
123*6467f958SSadaf Ebrahimi    create_subelement_with_attribs(test_rule, 'option',
124*6467f958SSadaf Ebrahimi        { 'name': "test-timeout", 'value': test.get('timeout', "30m") })
125*6467f958SSadaf Ebrahimi    create_subelement_with_attribs(test_rule, 'option',
126*6467f958SSadaf Ebrahimi        { 'name': "python-options", 'value': test["test_name"] })
127*6467f958SSadaf Ebrahimi    create_subelement_with_attribs(test_rule, 'option',
128*6467f958SSadaf Ebrahimi        { 'name': "python-options",
129*6467f958SSadaf Ebrahimi          'value': "/data/nativetest64/unrestricted/{}".format(test['binary_name']) })
130*6467f958SSadaf Ebrahimi
131*6467f958SSadaf Ebrahimi    for arg in test.get('arguments', []):
132*6467f958SSadaf Ebrahimi      create_subelement_with_attribs(test_rule, 'option',
133*6467f958SSadaf Ebrahimi          { 'name': "python-options", 'value': arg })
134*6467f958SSadaf Ebrahimi
135*6467f958SSadaf Ebrahimi
136*6467f958SSadaf Ebrahimidef generate_test_xml():
137*6467f958SSadaf Ebrahimi  configuration = ElementTree.Element('configuration')
138*6467f958SSadaf Ebrahimi  configuration.attrib['description'] = "Config to run OpenCL CTS"
139*6467f958SSadaf Ebrahimi
140*6467f958SSadaf Ebrahimi  logcat = ElementTree.SubElement(configuration, 'option')
141*6467f958SSadaf Ebrahimi  logcat.attrib['name'] = "logcat-on-failure"
142*6467f958SSadaf Ebrahimi  logcat.attrib['value'] = "false"
143*6467f958SSadaf Ebrahimi
144*6467f958SSadaf Ebrahimi  generate_push_file_rules(configuration)
145*6467f958SSadaf Ebrahimi  generate_test_rules(configuration)
146*6467f958SSadaf Ebrahimi
147*6467f958SSadaf Ebrahimi  stringified_configuration = ElementTree.tostring(configuration, 'utf-8')
148*6467f958SSadaf Ebrahimi  reparsed_configuration = minidom.parseString(stringified_configuration)
149*6467f958SSadaf Ebrahimi  with open('test_opencl_cts.xml', 'w') as f:
150*6467f958SSadaf Ebrahimi    f.write(reparsed_configuration.toprettyxml(indent=" "*4))
151*6467f958SSadaf Ebrahimi
152*6467f958SSadaf Ebrahimi
153*6467f958SSadaf Ebrahimidef main():
154*6467f958SSadaf Ebrahimi  android_bp_formatted = generate_android_bp()
155*6467f958SSadaf Ebrahimi  generate_test_xml()
156*6467f958SSadaf Ebrahimi
157*6467f958SSadaf Ebrahimi  print("Don't forget to move -")
158*6467f958SSadaf Ebrahimi  print("    Android.bp -> {ANDROID_ROOT}/external/OpenCL-CTS/Android.bp")
159*6467f958SSadaf Ebrahimi  print("    test_opencl_cts.xml -> {ANDROID_ROOT}/external/OpenCL-CTS/scripts/test_opencl_cts.xml")
160*6467f958SSadaf Ebrahimi  if not android_bp_formatted:
161*6467f958SSadaf Ebrahimi    print("then run the blueprint autoformatter:")
162*6467f958SSadaf Ebrahimi    print("    bpfmt -w {ANDROID_ROOT}/external/OpenCL-CTS/Android.bp")
163*6467f958SSadaf Ebrahimi
164*6467f958SSadaf Ebrahimi
165*6467f958SSadaf Ebrahimiif __name__ == '__main__':
166*6467f958SSadaf Ebrahimi  main()
167