1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li# Copyright (c) 2021 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li"""Generate metadata for build from Autotest ctrl files.""" 6*9c5db199SXin Li 7*9c5db199SXin Liimport argparse 8*9c5db199SXin Liimport os 9*9c5db199SXin Liimport six 10*9c5db199SXin Liimport sys 11*9c5db199SXin Li 12*9c5db199SXin Li# If running in Autotest dir, keep this. 13*9c5db199SXin Lios.environ["PY_VERSION"] = '3' 14*9c5db199SXin Li 15*9c5db199SXin Liimport common 16*9c5db199SXin Li 17*9c5db199SXin Li# NOTE: this MUST be run in Python3, if we get configured back to PY2, exit. 18*9c5db199SXin Liif six.PY2: 19*9c5db199SXin Li exit(1) 20*9c5db199SXin Li 21*9c5db199SXin Lifrom autotest_lib.server.cros.dynamic_suite import control_file_getter 22*9c5db199SXin Lifrom autotest_lib.client.common_lib import control_data 23*9c5db199SXin Li 24*9c5db199SXin Lifrom chromiumos.test.api import test_case_metadata_pb2 as tc_metadata_pb 25*9c5db199SXin Lifrom chromiumos.test.api import test_harness_pb2 as th_pb 26*9c5db199SXin Lifrom chromiumos.test.api import test_case_pb2 as tc_pb 27*9c5db199SXin Li 28*9c5db199SXin LiHARNESS = th_pb.TestHarness.Tauto() 29*9c5db199SXin Li 30*9c5db199SXin Li 31*9c5db199SXin Lidef parse_local_arguments(args): 32*9c5db199SXin Li """Parse the CLI.""" 33*9c5db199SXin Li parser = argparse.ArgumentParser( 34*9c5db199SXin Li description="Prep Autotest, Tast, & Services for DockerBuild.") 35*9c5db199SXin Li parser.add_argument('-autotest_path', 36*9c5db199SXin Li dest='autotest_path', 37*9c5db199SXin Li default='../../../../third_party/autotest/files/', 38*9c5db199SXin Li help='path to autotest/files relative to this script.') 39*9c5db199SXin Li parser.add_argument('-output_file', 40*9c5db199SXin Li dest='output_file', 41*9c5db199SXin Li default=None, 42*9c5db199SXin Li help='Where to write the serialized pb.') 43*9c5db199SXin Li return parser.parse_args(args) 44*9c5db199SXin Li 45*9c5db199SXin Li 46*9c5db199SXin Lidef read_file(filename): 47*9c5db199SXin Li """Read the given file.""" 48*9c5db199SXin Li with open(filename, 'r') as f: 49*9c5db199SXin Li return f.read() 50*9c5db199SXin Li 51*9c5db199SXin Li 52*9c5db199SXin Lidef all_control_files(args): 53*9c5db199SXin Li """Return all control files as control file objs.""" 54*9c5db199SXin Li subpaths = ['server/site_tests', 'client/site_tests'] 55*9c5db199SXin Li start_cwd = os.getcwd() 56*9c5db199SXin Li try: 57*9c5db199SXin Li os.chdir(args.autotest_path) 58*9c5db199SXin Li 59*9c5db199SXin Li # Might not be needed, but this resolves out the ../ 60*9c5db199SXin Li autotest_path = os.getcwd() 61*9c5db199SXin Li 62*9c5db199SXin Li directories = [os.path.join(autotest_path, p) for p in subpaths] 63*9c5db199SXin Li f = control_file_getter.FileSystemGetter(directories) 64*9c5db199SXin Li except Exception as e: 65*9c5db199SXin Li raise Exception("Failed to find control files at path %s", 66*9c5db199SXin Li args.autotest_path) 67*9c5db199SXin Li 68*9c5db199SXin Li finally: 69*9c5db199SXin Li os.chdir(start_cwd) 70*9c5db199SXin Li return f._get_control_file_list() 71*9c5db199SXin Li 72*9c5db199SXin Li 73*9c5db199SXin Lidef serialize_test_case_info(data): 74*9c5db199SXin Li """Return a serialized TestCaseInfo obj.""" 75*9c5db199SXin Li serialized_contacts = tc_metadata_pb.Contact(email=data.author) 76*9c5db199SXin Li return tc_metadata_pb.TestCaseInfo(owners=[serialized_contacts]) 77*9c5db199SXin Li 78*9c5db199SXin Li 79*9c5db199SXin Lidef serialize_tags(data): 80*9c5db199SXin Li """Return a serialized tags obj (list).""" 81*9c5db199SXin Li serialized_tags = [] 82*9c5db199SXin Li for value in data.dependencies: 83*9c5db199SXin Li serialized_tags.append(tc_pb.TestCase.Tag(value=value)) 84*9c5db199SXin Li for value in data.attributes: 85*9c5db199SXin Li serialized_tags.append(tc_pb.TestCase.Tag(value=value)) 86*9c5db199SXin Li if data.test_class: 87*9c5db199SXin Li serialized_tags.append( 88*9c5db199SXin Li tc_pb.TestCase.Tag( 89*9c5db199SXin Li value="test_class:{}".format(data.test_class))) 90*9c5db199SXin Li return serialized_tags 91*9c5db199SXin Li 92*9c5db199SXin Li 93*9c5db199SXin Lidef serialize_test_case(data): 94*9c5db199SXin Li """Return a serialized api.TestCase obj.""" 95*9c5db199SXin Li serialized_testcase_id = tc_pb.TestCase.Id(value="tauto." + data.name) 96*9c5db199SXin Li tags = serialize_tags(data) 97*9c5db199SXin Li return tc_pb.TestCase(id=serialized_testcase_id, name=data.name, tags=tags) 98*9c5db199SXin Li 99*9c5db199SXin Li 100*9c5db199SXin Lidef serialized_test_case_exec(data): 101*9c5db199SXin Li """Return a serialized TestCaseExec obj.""" 102*9c5db199SXin Li serialized_test_harness = th_pb.TestHarness(tauto=HARNESS) 103*9c5db199SXin Li return tc_metadata_pb.TestCaseExec(test_harness=serialized_test_harness) 104*9c5db199SXin Li 105*9c5db199SXin Li 106*9c5db199SXin Lidef serialized_test_case_metadata(data): 107*9c5db199SXin Li """Return a TestCaseMetadata obj from a given control file.""" 108*9c5db199SXin Li serialized_meta_data = tc_metadata_pb.TestCaseMetadata( 109*9c5db199SXin Li test_case_exec=serialized_test_case_exec(data), 110*9c5db199SXin Li test_case=serialize_test_case(data), 111*9c5db199SXin Li test_case_info=serialize_test_case_info(data)) 112*9c5db199SXin Li return serialized_meta_data 113*9c5db199SXin Li 114*9c5db199SXin Li 115*9c5db199SXin Lidef serialized_test_case_metadata_list(data): 116*9c5db199SXin Li """Return a TestCaseMetadataList obj from a list of TestCaseMetadata pb.""" 117*9c5db199SXin Li serialized_meta_data_list = tc_metadata_pb.TestCaseMetadataList( 118*9c5db199SXin Li values=data) 119*9c5db199SXin Li return serialized_meta_data_list 120*9c5db199SXin Li 121*9c5db199SXin Li 122*9c5db199SXin Lidef main(): 123*9c5db199SXin Li """Generate the metadata, and if an output path is given, save it.""" 124*9c5db199SXin Li args = parse_local_arguments(sys.argv[1:]) 125*9c5db199SXin Li ctrlfiles = all_control_files(args) 126*9c5db199SXin Li serialized_metadata = [] 127*9c5db199SXin Li for file_path in ctrlfiles: 128*9c5db199SXin Li text = read_file(file_path) 129*9c5db199SXin Li path = ctrlfiles[1] 130*9c5db199SXin Li 131*9c5db199SXin Li test = control_data.parse_control_string(text, 132*9c5db199SXin Li raise_warnings=True, 133*9c5db199SXin Li path=path) 134*9c5db199SXin Li serialized_metadata.append(serialized_test_case_metadata(test)) 135*9c5db199SXin Li 136*9c5db199SXin Li serialized = serialized_test_case_metadata_list(serialized_metadata) 137*9c5db199SXin Li if args.output_file: 138*9c5db199SXin Li with open(args.output_file, 'wb') as wf: 139*9c5db199SXin Li wf.write(serialized.SerializeToString()) 140*9c5db199SXin Li 141*9c5db199SXin Li 142*9c5db199SXin Liif __name__ == '__main__': 143*9c5db199SXin Li main() 144