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