xref: /aosp_15_r20/external/autotest/utils/generate_metadata.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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