blob: a43eb5c49c3621e77bb7b03c1837a8b3aea7f545 [file] [log] [blame]
# Copyright 2020 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
if (current_toolchain != default_toolchain) {
import("//build/dist/generated_resource.gni")
import("//src/bringup/lib/mexec/testing/zbi_test.gni")
import("//zircon/kernel/phys/phys_executable.gni")
import("//zircon/kernel/phys/qemu.gni")
import("//zircon/kernel/phys/zbi_executable.gni")
assert(toolchain.environment == "kernel.phys" ||
toolchain_variant.base == qemu_environment)
# This provides a PhysMain function appropriate for zbi_test() targets.
source_set("qemu-test-main") {
testonly = true
sources = [ "qemu-test-main.cc" ]
defines = [ "ZBI_TEST_SUCCESS_STRING=\"$zbi_test_success_string\"" ]
deps = [
"//zircon/kernel/lib/arch",
"//zircon/kernel/lib/libc",
"//zircon/system/ulib/uart",
]
public_deps = [
# This is public to propagate its public_deps so dependents
# of qemu-test-main can use #include "test-main.h".
":test-main",
]
}
source_set("zbi-test-main") {
testonly = true
sources = [ "zbi-test-main.cc" ]
defines = [ "ZBI_TEST_SUCCESS_STRING=\"$zbi_test_success_string\"" ]
public_deps = [ ":test-main" ]
deps = [ "//zircon/kernel/lib/libc" ]
}
source_set("test-main") {
testonly = true
public = [ "test-main.h" ]
public_deps = [
"..:main",
"..:symbolize",
"//zircon/kernel/lib/arch:headers",
]
}
# Build a test that runs directly as a QEMU kernel. This is wired up as a
# zbi_test() for infrastructure purposes though there is nothing in the ZBI.
template("phys_qemu_test") {
main_target = target_name
executable_target = "_qemu_phys_test.$target_name.executable"
zbi_target = "_qemu_phys_test.$target_name.zbi_test"
phys_executable(executable_target) {
testonly = true
visibility = [ ":*" ]
deps = []
forward_variables_from(invoker,
"*",
[
"output_dir",
"output_extension",
"output_name",
"tags",
"testonly",
"target_name",
"timeout",
])
deps += qemu_deps + [ ":qemu-test-main" ]
}
zbi_test(zbi_target) {
visibility = [ ":*" ]
# Ensure the file, and its images.json entry, is not named
# _qemu_phys_test.xxxx.zbi_test, which is pretty unreadable and
# an implementation detail anyway.
output_name = main_target
# The ZBI is empty other than the boilerplate cmdline, and does not
# contain a ZBI-bootable kernel.
args = []
cpu = ""
deps = []
tags = [ "incomplete" ]
if (defined(invoker.tags)) {
tags += invoker.tags
}
# The special kernel is all that really matters for this test.
device_types = [ "QEMU" ]
qemu_kernel = ":$executable_target"
# Set a short timeout since the tests don't necessarily shut down QEMU
# after printing the success string.
timeout = qemu_short_timeout
}
group(main_target) {
testonly = true
forward_variables_from(invoker, [ "visibility" ])
public_deps = [ ":$zbi_target($qemu_environment)" ]
}
}
# TODO(fxbug.dev/57245): We provide a dummy resource to contrive 'completeness'
# in the following ZBI tests, which is a requirement for bootability under the
# current policy of zedboot, gigaboot, and the boot-shims using the old
# `zbi_check`. Once that is no longer a requirement, remove this target.
generated_resource("dummy.txt") {
testonly = true
visibility = [ "./*" ]
contents = "This space is intentionally left blank."
outputs = [ "$target_gen_dir/dummy.txt" ]
}
# Build a ZBI test that uses the physboot framework.
template("phys_zbi_test") {
if (defined(invoker.test_deps)) {
test_deps = invoker.test_deps
} else {
test_deps = [ ":$target_name.executable" ]
zbi_executable("$target_name.executable") {
visibility = [ ":*" ]
testonly = true
deps = []
forward_variables_from(invoker,
"*",
[
"target_name",
"test_deps",
"timeout",
])
deps += [ ":zbi-test-main" ]
}
}
zbi_test(target_name) {
args = []
deps = test_deps + [ ":dummy.txt" ]
# TODO(mcgrathr): enable on hardware too
device_types = [
"AEMU",
"QEMU",
]
if (defined(invoker.timeout)) {
if (invoker.timeout != false) {
timeout = invoker.timeout
}
} else {
# Set a short timeout since the tests don't reliably reboot the machine.
timeout = qemu_short_timeout
}
}
}
# Build both a phys_qemu_test() and zbi_executable()/zbi_test() from the
# same sources.
#
# Generates a target with a name of the form "qemu-xxx" for the QEMU test,
# and "zbi-xxx" for the ZBI test.
template("common_test") {
phys_qemu_test("qemu-$target_name") {
visibility = [ ":*" ]
forward_variables_from(invoker, "*", [ "target_name" ])
}
phys_zbi_test("zbi-$target_name") {
visibility = [ ":*" ]
forward_variables_from(invoker, "*", [ "target_name" ])
}
group(target_name) {
testonly = true
deps = [
":qemu-$target_name",
":zbi-$target_name",
]
}
}
common_test("hello-world-test") {
sources = [ "hello-world-test.cc" ]
deps = [
":test-main",
"//zircon/kernel/lib/libc",
]
}
common_test("backtrace-test") {
sources = [ "backtrace-test.cc" ]
deps = [
":test-main",
"//zircon/kernel/lib/arch",
"//zircon/kernel/lib/libc",
]
}
# Ideally we'd test all four combinations on arm64 and both combinations on
# x86. But the common library code is always compiled with shadow-call-stack
# on arm64 so we can't disable the ABI support for it and with safe-stack on
# x86 so we can't disable the ABI support for it there. The start.S code only
# enables extra stack support conditionally so as not to waste space, so there
# isn't a good way to test non-default configurations.
common_test("phys-unittests") {
sources = [
"phys-unittests.cc",
"stack-tests.cc",
]
deps = [
":test-main",
"//zircon/kernel/lib/libc",
"//zircon/kernel/lib/unittest",
"//zircon/kernel/tests",
]
}
common_test("memory-test") {
sources = [ "phys-memory-test.cc" ]
deps = [
":test-main",
"..:allocation",
"//zircon/kernel/lib/ktl",
"//zircon/kernel/lib/libc",
]
}
zbi_input("decompress-test-data") {
visibility = [ ":*" ]
testonly = true
type = "ramdisk"
args = [
"--compressed=zstd.max",
"--entry=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
]
}
# Test the zbitl decompression code.
#
# This requires a zbi_input, so we only run it as a ZBI test.
phys_zbi_test("zbi-decompress-test") {
sources = [ "decompress-test.cc" ]
deps = [
":test-main",
"..:allocation",
"..:zbi-memory",
"..:zbitl-allocation",
"//zircon/kernel/lib/ktl",
"//zircon/kernel/lib/libc",
"//zircon/system/ulib/zbitl",
"//zircon/system/ulib/zxc",
]
data_deps = [ ":decompress-test-data" ]
}
zbi_executable("chain-load-test") {
visibility = [ ":*" ]
testonly = true
sources = [ "chain-load-test.cc" ]
deps = [
":zbi-test-main",
"..:allocation",
"..:boot-zbi",
"..:zbi-memory",
"..:zbitl-allocation",
"//zircon/kernel/lib/ktl",
"//zircon/kernel/lib/libc",
"//zircon/system/ulib/zbitl",
"//zircon/system/ulib/zxc",
]
}
phys_zbi_test("zbi-chain-load-hello-world-test") {
test_deps = [
":chain-load-hello-world-test-data",
":chain-load-test",
]
}
zbi_input("chain-load-hello-world-test-data") {
visibility = [ ":*" ]
testonly = true
type = "ramdisk"
args = [ "--compressed=zstd.max" ]
deps = [ ":zbi-hello-world-test.executable" ]
sources = get_target_outputs(deps[0])
}
phys_zbi_test("zbi-chain-load-core-tests") {
test_deps = [
":chain-load-core-tests-data",
":chain-load-test",
]
# Once it chain-loads Zircon, it will shut down by itself, but not
# necessarily really quickly since the tests take a little while to run.
timeout = false
}
zbi_input("chain-load-core-tests-data") {
visibility = [ ":*" ]
testonly = true
type = "ramdisk"
args = [ "--compressed=zstd.max" ]
deps = [ "//zircon/system/utest/core:core-tests.zbi($default_toolchain)" ]
sources = [ get_label_info(deps[0], "target_out_dir") + "/core-tests.zbi" ]
}
group("test") {
testonly = true
deps = [
":backtrace-test",
":hello-world-test",
":phys-unittests",
":zbi-decompress-test",
":zbi-memory-test",
"code-patching",
]
if (current_cpu == "arm64") {
deps += [
":zbi-chain-load-core-tests",
":zbi-chain-load-hello-world-test",
]
}
if (current_cpu == "x64") {
deps += [ ":qemu-memory-test" ]
}
}
} else { # current_toolchain == default_toolchain
import("//src/bringup/lib/mexec/testing/zbi_test.gni")
# We create mexec-chainloading variations of all of the phys ZBI tests.
test_deps = []
foreach(test,
[
"zbi-backtrace-test",
"zbi-hello-world-test",
"zbi-memory-test",
"zbi-phys-unittests",
"zbi-decompress-test",
]) {
mexec_zbi_test("mexec-$test") {
child_zbi = ":$test(//zircon/kernel/phys:kernel.phys_$current_cpu)"
child_zbi_file =
get_label_info(child_zbi, "target_out_dir") + "/$test.zbi"
}
test_deps += [ ":mexec-$test" ]
}
group("test") {
testonly = true
deps =
[ ":test(//zircon/kernel/phys:kernel.phys_$current_cpu)" ] + test_deps
}
}