blob: 2de0fee4faa866270b6ff27d9fb3154cefa47089 [file] [log] [blame]
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
import("//build_overrides/pigweed.gni")
import("$dir_pw_build/python.gni")
import("$dir_pw_build/test_info.gni")
# Creates a Python action to use as a test and associated metadata.
#
# This template derives several additional targets:
# - <target_name>.metadata produces the test metadata when included in a
# `pw_test_group`. This metadata includes the Ninja target that runs the
# test.
# - <target_name>.script creates a `pw_python_action` to run the test and
# wraps it as a standalone `pw_python_package`.
# - <target_name>.group creates a `pw_python_group` in order to apply tools,
# e.g. linters, to the standalone package.
# - <target_name>.lib is an empty group for compatibility with
# `pw_test_group`.
# - <target_name>.run invokes the test.
#
# Targets defined using this template will produce test metadata with a
# `test_type` of "action_test" and a `ninja_target` value that will invoke the
# test when passed to Ninja, i.e. `ninja -C out <ninja_target>`.
#
# Args:
# - The following args have the same meaning as for `pw_test`:
# enable_if
# envvars (may also use `environment`)
# tags
# extra_metadata
# source_gen_deps
#
# - The following args have the same meaning as for `pw_python_action`:
# script (may be omitted if `sources` has length=1)
# args
# deps
# environment (may also use `envvars`)
# working_directory
# command_launcher
# venv
#
# - The following args have the same meaning as for `pw_python_package`:
# sources
# python_deps
# other_deps
# inputs
# static_analysis
# pylintrc
# mypy_ini
#
# - action: Optional string or scope. If a string, this should be a label to
# a `pw_python_action` target that performs the test. If a scope, this
# has the same meaning as for `pw_python_script`.
template("pw_python_action_test") {
_test_target_name = target_name
_deps = []
_run_deps = []
_metadata = {
}
_test_is_enabled = !defined(invoker.enable_if) || invoker.enable_if
if (_test_is_enabled) {
# Metadata for this test when used as part of a pw_test_group target.
_test_metadata = "${target_name}.metadata"
_ninja_target = "$target_out_dir/$target_name.run.stamp"
_extra_metadata = {
forward_variables_from(invoker, [ "extra_metadata" ])
ninja_target = rebase_path(_ninja_target, root_build_dir)
}
pw_test_info(_test_metadata) {
test_type = "action_test"
test_name = _test_target_name
forward_variables_from(invoker, [ "tags" ])
extra_metadata = _extra_metadata
}
_deps += [ ":$_test_metadata" ]
_metadata = {
test_barrier = [ ":$_test_metadata" ]
}
if (defined(invoker.action) && invoker.action == "${invoker.action}") {
# `action` is a label to an existing Python action.
_run_deps = [ invoker.action ]
if (defined(invoker.deps)) {
_deps += invoker.deps
}
} else {
# Wrap the action in a Python script target for additional flexibility.
_test_script_name = _test_target_name + ".script"
_sources = []
if (defined(invoker.script)) {
_sources += [ invoker.script ]
}
if (defined(invoker.sources)) {
_sources += invoker.sources
}
pw_python_script(_test_script_name) {
other_deps = []
forward_variables_from(invoker,
[
"action",
"python_deps",
"other_deps",
"inputs",
"static_analysis",
"testonly",
"pylintrc",
"mypy_ini",
])
sources = _sources
if (defined(invoker.source_gen_deps)) {
other_deps += invoker.source_gen_deps
}
if (!defined(pylintrc)) {
pylintrc = "$dir_pigweed/.pylintrc"
}
if (!defined(mypy_ini)) {
mypy_ini = "$dir_pigweed/.mypy.ini"
}
if (!defined(action)) {
action = {
environment = []
forward_variables_from(invoker,
[
"script",
"args",
"deps",
"environment",
"working_directory",
"command_launcher",
"venv",
])
if (defined(invoker.envvars)) {
environment += invoker.envvars
}
stamp = true
}
}
}
_deps += [ ":$_test_script_name" ]
_run_deps = [ ":$_test_script_name.action" ]
# Create a Python group in order to ensure the package is linted.
_test_python_group = _test_target_name + ".group"
pw_python_group(_test_python_group) {
python_deps = [ ":$_test_script_name" ]
}
_deps += [ ":$_test_python_group" ]
}
} else {
if (defined(invoker.source_gen_deps)) {
_deps += invoker.source_gen_deps
}
}
# For compatibility with `pw_test_group`.
group(_test_target_name + ".lib") {
forward_variables_from(invoker, [ "testonly" ])
}
# For compatibility with `pw_test_group`.
group(_test_target_name + ".run") {
forward_variables_from(invoker, [ "testonly" ])
deps = _run_deps
}
group(_test_target_name) {
forward_variables_from(invoker, [ "testonly" ])
deps = _deps
metadata = _metadata
}
}