xref: /aosp_15_r20/external/pigweed/pw_build/test_info.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker# Generate metadata for tests.
16*61c4878aSAndroid Build Coastguard Worker#
17*61c4878aSAndroid Build Coastguard Worker# Various types of tests may use this template to create metadata used to
18*61c4878aSAndroid Build Coastguard Worker# describe those tests. All entries will have the following form:
19*61c4878aSAndroid Build Coastguard Worker#
20*61c4878aSAndroid Build Coastguard Worker#   {
21*61c4878aSAndroid Build Coastguard Worker#       "build_label": <GN source-absolute label>,
22*61c4878aSAndroid Build Coastguard Worker#       "test_name": <Name of test>,
23*61c4878aSAndroid Build Coastguard Worker#       "test_type": <Type of test>,
24*61c4878aSAndroid Build Coastguard Worker#       ...
25*61c4878aSAndroid Build Coastguard Worker#   }
26*61c4878aSAndroid Build Coastguard Worker#
27*61c4878aSAndroid Build Coastguard Worker# where "..." may represent additional, type-specific details.
28*61c4878aSAndroid Build Coastguard Worker#
29*61c4878aSAndroid Build Coastguard Worker# Args:
30*61c4878aSAndroid Build Coastguard Worker#   - test_type (required): String describing the type of test. One of:
31*61c4878aSAndroid Build Coastguard Worker#         "test_group"
32*61c4878aSAndroid Build Coastguard Worker#         "unit_test"
33*61c4878aSAndroid Build Coastguard Worker#         "action_test"
34*61c4878aSAndroid Build Coastguard Worker#         "perf_test"
35*61c4878aSAndroid Build Coastguard Worker#         "fuzz_test"
36*61c4878aSAndroid Build Coastguard Worker#   - test_name (optional): Name of the test as a string. Defaults to the
37*61c4878aSAndroid Build Coastguard Worker#         target name.
38*61c4878aSAndroid Build Coastguard Worker#   - build_label (optional): GN label for the test being described. Defaults to
39*61c4878aSAndroid Build Coastguard Worker#         the source-absolute label corresponding to `test_name`.
40*61c4878aSAndroid Build Coastguard Worker#   - extra_metadata (optional): Scope that defines additional metadata to
41*61c4878aSAndroid Build Coastguard Worker#         include for this test. Variables defined in the scope will be included
42*61c4878aSAndroid Build Coastguard Worker#         directly in the metadata, and thus should not be named "build_label",
43*61c4878aSAndroid Build Coastguard Worker#         "test_name", or "test_type".
44*61c4878aSAndroid Build Coastguard Workertemplate("pw_test_info") {
45*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.test_type),
46*61c4878aSAndroid Build Coastguard Worker         "`pw_test_info($target_name)` is missing `test_type`")
47*61c4878aSAndroid Build Coastguard Worker  _type = invoker.test_type
48*61c4878aSAndroid Build Coastguard Worker
49*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker.test_name)) {
50*61c4878aSAndroid Build Coastguard Worker    _name = invoker.test_name
51*61c4878aSAndroid Build Coastguard Worker  } else {
52*61c4878aSAndroid Build Coastguard Worker    _name = get_label_info(target_name, "name")
53*61c4878aSAndroid Build Coastguard Worker  }
54*61c4878aSAndroid Build Coastguard Worker
55*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker.build_label)) {
56*61c4878aSAndroid Build Coastguard Worker    _label = invoker.build_label
57*61c4878aSAndroid Build Coastguard Worker  } else {
58*61c4878aSAndroid Build Coastguard Worker    _label = _name
59*61c4878aSAndroid Build Coastguard Worker  }
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker  _metadata = {
62*61c4878aSAndroid Build Coastguard Worker    # Include the extra metadata first, so any name collisions trigger errors.
63*61c4878aSAndroid Build Coastguard Worker    forward_variables_from(invoker.extra_metadata, "*")
64*61c4878aSAndroid Build Coastguard Worker    build_label = get_label_info(":$_label", "label_no_toolchain")
65*61c4878aSAndroid Build Coastguard Worker    test_name = _name
66*61c4878aSAndroid Build Coastguard Worker    test_type = _type
67*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.tags) && invoker.tags != []) {
68*61c4878aSAndroid Build Coastguard Worker      tags = invoker.tags
69*61c4878aSAndroid Build Coastguard Worker    }
70*61c4878aSAndroid Build Coastguard Worker  }
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker  group(target_name) {
73*61c4878aSAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
74*61c4878aSAndroid Build Coastguard Worker    if (_type == "test_group") {
75*61c4878aSAndroid Build Coastguard Worker      metadata = {
76*61c4878aSAndroid Build Coastguard Worker        test_groups = [ _metadata ]
77*61c4878aSAndroid Build Coastguard Worker      }
78*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "deps" ])
79*61c4878aSAndroid Build Coastguard Worker    } else if (_type == "unit_test") {
80*61c4878aSAndroid Build Coastguard Worker      metadata = {
81*61c4878aSAndroid Build Coastguard Worker        unit_tests = [ _metadata ]
82*61c4878aSAndroid Build Coastguard Worker      }
83*61c4878aSAndroid Build Coastguard Worker    } else if (_type == "action_test") {
84*61c4878aSAndroid Build Coastguard Worker      metadata = {
85*61c4878aSAndroid Build Coastguard Worker        action_tests = [ _metadata ]
86*61c4878aSAndroid Build Coastguard Worker      }
87*61c4878aSAndroid Build Coastguard Worker    } else if (_type == "perf_test") {
88*61c4878aSAndroid Build Coastguard Worker      metadata = {
89*61c4878aSAndroid Build Coastguard Worker        perf_tests = [ _metadata ]
90*61c4878aSAndroid Build Coastguard Worker      }
91*61c4878aSAndroid Build Coastguard Worker    } else if (_type == "fuzz_test") {
92*61c4878aSAndroid Build Coastguard Worker      metadata = {
93*61c4878aSAndroid Build Coastguard Worker        fuzz_tests = [ _metadata ]
94*61c4878aSAndroid Build Coastguard Worker      }
95*61c4878aSAndroid Build Coastguard Worker    } else {
96*61c4878aSAndroid Build Coastguard Worker      assert(
97*61c4878aSAndroid Build Coastguard Worker          false,
98*61c4878aSAndroid Build Coastguard Worker          "pw_test_info($target_name) does not have a valid `test_type`: $_type")
99*61c4878aSAndroid Build Coastguard Worker    }
100*61c4878aSAndroid Build Coastguard Worker  }
101*61c4878aSAndroid Build Coastguard Worker}
102