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