blob: f2cc36f6ca0572bbaae031eb67ddbc398e0a3810 [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("$zx/public/gn/test/zbi_test_success.gni")
import("$zx/public/gn/zbi.gni")
# Build a ZBI file to be run as a standalone ZBI test.
#
# What we call a "ZBI test" is a test that consists of booting a ZBI and
# capturing its console log. The test is considered successful if the
# $zbi_test_success_string is seen in the console log. That string is emitted
# by userboot when given the userboot.shutdown kernel command line argument
# and the program it launched exits with a zero return code.
#
# zbi_test() is like a zbi() target, but specifically meant for ZBI tests.
# The ZBI always embeds kernel command line arguments to instruct userboot.
# Its metadata identifies this image as a ZBI test so it will be run, and
# prevents deps on a zbi_test() target from other zbi() targets from folding
# the ZBIs together (so a zbi_test() target can be thrown together with
# individual test() targets populating a full system image).
#
# The $target_name target is a group() that holds the metadata and is what
# should be used in deps. The actual zbi() target is defined as
# "$target_name.zbi" so that e.g. get_target_outputs(":$target_name.zbi")
# can be used.
#
# Parameters
#
# * args
# - Required: List of kernel command line arguments,
# e.g. `[ "userboot=bin/my-standalone-test" ]`.
# "userboot.shutdown" is always appended to the list; this tells
# userboot to wait for the launched process to exit and to log its
# exit status and (if that's zero) $zbi_test_success_string before
# shutting down. Note "userboot.reboot" can still be added at boot
# time to cause the machine to reboot instead of powering off.
# - Type: list(string)
#
# * tags
# - Optional: See zbi() for full details. The tag "disabled" here
# causes this ZBI test to be disabled for bot runs. It will still
# be built and can be run manually, but won't be run automatically.
# - Type: list(string)
#
# * device_types
# - Optional: The list of device types that this test should be run on.
# Allowable values are those among the entries in //build/testing/platforms.gni;
# others will be ignored.
# - Default: [ "QEMU" ]
# - Type: list(string)
#
# See zbi() for other parameters.
template("zbi_test") {
test_target = target_name
cmdline_target = "_zbi_test.$target_name.cmdline"
zbi_target = "$target_name.zbi"
zbi_input(cmdline_target) {
visibility = [ ":*" ]
testonly = true
type = "cmdline"
args = []
foreach(arg, invoker.args + [ "userboot.shutdown" ]) {
args += [ "--entry=$arg" ]
}
}
zbi(zbi_target) {
testonly = true
forward_variables_from(invoker,
[
"cpu",
"compress",
"output_dir",
"output_extension",
"output_name",
"tags",
"visibility",
])
if (defined(visibility)) {
visibility += [ ":$test_target" ]
}
if (!defined(output_name)) {
output_name = test_target
}
deps = invoker.deps + [ ":$cmdline_target" ]
}
outputs = get_target_outputs(":$zbi_target")
output_path = outputs[0]
if (defined(invoker.device_types)) {
_device_types = invoker.device_types
} else {
_device_types = [ "QEMU" ]
}
# The main target is a group that provides a metadata.zbi_barrier
# blocking collection of the zbi() target's metadata.zbi_input_args.
group(test_target) {
forward_variables_from(invoker,
[
"assert_no_deps",
"visibility",
])
testonly = true
deps = [ ":$zbi_target" ]
metadata = {
# The zbi_test() target will not affect the contents of any zbi()
# targets that depend on it (directly or indirectly).
zbi_barrier = []
if (defined(invoker.metadata)) {
forward_variables_from(invoker.metadata, "*")
}
zbi_tests = [
{
cpu = current_cpu
disabled =
defined(tags) && tags + [ "disabled" ] - [ "disabled" ] != tags
name = test_target
label = get_label_info(":$test_target", "label_with_toolchain")
path = rebase_path(output_path, root_build_dir)
bootserver_netboot = [ "--boot" ]
success_string = zbi_test_success_string
device_types = _device_types
},
]
}
}
}