blob: 9c6db2df28bbece74db52dfba4dd4e27b377b7bd [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("//build/components/fuchsia_unittest_package.gni")
import("//build/config/zircon/levels.gni")
import("//build/test.gni")
import("//build/testing/boot_tests/kernel_zbi_test.gni")
import("//build/testing/boot_tests/zbi_test_executable.gni")
import("//build/testing/bootfs_test.gni")
import("//build/toolchain/rbe.gni")
import("//zircon/kernel/params.gni")
# Each subdirectory just provides an eponymous source_set().
core_tests = [
"assert",
"bad-segsel",
"c11-condvar",
"c11-mutex",
"c11-thread",
"channel-call-etc",
"channel-iovec",
"channel-write-etc",
"clock",
"elf-tls",
"event-pair",
"exceptions",
"fifo",
"fpu",
"futex",
"handle-close",
"handle-dup",
"handle-info",
"handle-transfer",
"handle-wait",
"iob",
"object-child",
"object-wait",
"page-size",
"property",
"pthread",
"pthread-barrier",
"pthread-tls",
"socket",
"stack",
"stream",
"sync-completion",
"sync-condition",
"sync-mutex",
"syscall-generation",
"thread-initial-state",
"time",
"version",
]
# Requires use_next_vdso in the manifest. Build as a package and unified bootfs test, but not a
# standalone bootfs test.
# TODO(https://fxbug.dev/42170954): Remove this once standalone bootfs tests can access the next vDSO.
requires_next_vdso = [
"pager-writeback",
"restricted-mode",
]
# These tests require custom component manifests to execute as components.
core_tests_with_custom_manifests =
[
# Some tests require ZX_POL_NEW_PROCESS.
"channel",
"memory-mapping",
"port",
"process-shared", # requires ZX_POL_NEW_PROCESS,
# ZX_POL_AMBIENT_MARK_VMO_EXEC, and the next vDSO
# Some tests require ZX_POL_AMBIENT_MARK_VMO_EXEC.
"vmo",
] + requires_next_vdso
# These tests need to run in a bootfs environment and can't run as a Fuchsia
# component even with additional configuration.
bootfs_only = [
# These tests require ZX_POL_NEW_PROCESS for many tests.
"address-tagging",
"job",
"object-info",
"process",
"vmar",
# Some tests new ZX_POL_NEW_PROCESS, and the DebugRegisterState tests on
# x86_64 fail when run as a component due to DR6 containing unexpected values.
"threads",
# The pager tests rely on being able to check for test threads blocking on user pagers created
# by the test. They do this by verifying that the thread state is ZX_THREAD_STATE_BLOCKED_PAGER
# which only captures that the thread is blocked against *some* user pager, not any specific one.
# So they cannot run in an environment where test threads can block on pagers created outside of
# the test, e.g. when the test is run as a component.
#
# TODO(https://fxbug.dev/42170954): pager-writeback should be moved here too once standalone bootfs tests
# can access the next vDSO.
"pager",
]
# These tests need to run in the unified core-tests binary because
# they either call standalone::Get*Resource() or they need to run in a job
# tree without any exception handler.
unified_only = [
"bad-syscall",
"bti",
"default-exception-handler", # needs job tree w/o exception handler.
"debuglog:unified-only",
"interrupt",
"next-vdso",
"pager-writeback",
"profile",
"resource",
"system-event",
"system-cpu",
"system-suspend",
"thread-sampler",
]
assert(core_tests + core_tests_with_custom_manifests -
core_tests_with_custom_manifests == core_tests,
"core_tests and core_tests_with_custom_manifests must be disjoint")
assert(core_tests + bootfs_only - bootfs_only == core_tests,
"core_tests and bootfs_only must be disjoint")
assert(bootfs_only + core_tests_with_custom_manifests -
core_tests_with_custom_manifests == bootfs_only,
"bootfs_only and core_tests_with_custom_manifests must be disjoint")
assert(core_tests + unified_only - unified_only == core_tests,
"core_tests and unified_only must be disjoint")
all_bootfs_tests = core_tests + core_tests_with_custom_manifests + bootfs_only
# Build each test as a standalone binary meant to be run by runtests.
foreach(test_name, all_bootfs_tests) {
test(test_name) {
output_name = "core-$test_name"
deps = [ test_name ]
if (is_fuchsia) {
fdio_config = [ "//build/config/fuchsia:fdio_config" ]
if (configs + fdio_config - fdio_config != configs) {
configs -= fdio_config
}
deps += [ "//sdk/lib/fdio" ]
}
}
bootfs_test("core-$test_name-bootfs-test") {
name = "core-$test_name"
deps = [ ":$test_name" ]
}
}
# Build Fuchsia components and packages for tests that can run by
# fx test.
core_test_packages = []
# These tests can use an autogenerated manifest.
foreach(test_name, core_tests) {
fuchsia_test_package_name = "core-${test_name}-test-package"
core_test_packages += [ ":${fuchsia_test_package_name}" ]
fuchsia_unittest_package(fuchsia_test_package_name) {
deps = [ ":${test_name}" ]
}
}
# These tests specify a custom component manifest.
foreach(test_name, core_tests_with_custom_manifests) {
fuchsia_test_package_name = "core-${test_name}-test-package"
core_test_packages += [ ":${fuchsia_test_package_name}" ]
fuchsia_unittest_package(fuchsia_test_package_name) {
deps = [ ":${test_name}" ]
manifest = "${test_name}/meta/${test_name}_test.cml"
}
}
group("tests") {
testonly = true
deps = core_test_packages
}
template("core_tests") {
kernel_zbi_test(target_name) {
assert_no_deps = [
"//zircon/system/core/*",
"//zircon/system/dev/*",
]
deps = [ ":core-tests-standalone" ]
forward_variables_from(invoker,
[
"args",
"device_types",
"timeout",
])
if (!defined(timeout)) {
# We've observed the ASAN variant of core-tests take as long as 701
# seconds when booted via firmware on certain types of hardware. Leave a
# little buffer for growth.
timeout = 840
}
}
}
if (is_fuchsia) {
# Now build all of those (and more) together into the core-tests
# binary. This can and must be run directly from userboot because
# some of the tests require the root resource handle or no system
# services whatsoever.
zbi_test_executable("core-tests-standalone") {
deps = [
"//src/zircon/testing/standalone-test",
"//zircon/system/ulib/zxtest",
]
deps += all_bootfs_tests + unified_only
# These arguments are always needed in the ZBI to run this executable.
data_deps = [ ":core-tests-standalone.args" ]
# LTO for this target requires a massive amount of memory,
# and thus, should be run less concurrently with other large jobs.
# See https://fxbug.dev/42062387 for context.
if (toolchain_variant.tags + [ "lto" ] - [ "lto" ] !=
toolchain_variant.tags ||
toolchain_variant.tags + [ "thinlto" ] - [ "thinlto" ] !=
toolchain_variant.tags) {
pool = "//build/config:highmem($default_toolchain)"
if (link_rbe_enable) {
# OOM on RBE workers
configs += [ "//build/config:no_remote_link" ]
}
}
}
kernel_cmdline("core-tests-standalone.args") {
args = [
"kernel.vdso.always_use_next=true",
"kernel.enable-debugging-syscalls=true",
"kernel.test.ram.reserve=0x8000",
"kernel.compression.strategy=lz4",
"kernel.compression.storage-strategy=tri_page",
"kernel.compression.reclaim_anonymous=true",
"kernel.compression.reclaim_zero_forks=true",
"kernel.compression.random-debug-compress=true",
]
# Only add this switch if we're building with ZX_DEBUG_ASSERT enabled
# in the kernel, or we'll trigger a panic on kernel start. Some kernel
# code asserts that this switch is only set for a debug configuration.
if (zx_assert_level > 1) {
args += [ "kernel.pmm.alloc-random-should-wait=true" ]
}
}
}
boot_tests = [ ":core-tests" ]
core_tests("core-tests") {
device_types = kernel_test_device_types
}
# If we are building for x64, make sure to run the core tests on a system which
# has been configured to force selection of HPET as the timing source instead
# of choosing TSC if possible.
if (current_cpu == "x64") {
core_tests("core-tests-hpet") {
args = [ "kernel.wallclock=hpet" ]
device_types = [ "Intel NUC Kit NUC7i5DNHE" ]
# core-hpet test is taking longer than 14mins. Bump the timeout to 16mins
# as a mitigation.
timeout = 960
}
boot_tests += [ ":core-tests-hpet" ]
}
if (current_cpu == "arm64") {
_smccc11_device_types = [
"AEMU",
"Astro",
"QEMU",
"Sherlock",
]
foreach(alternate,
[
{
option = "auto"
device_types = kernel_test_device_types
},
{
option = "arch3"
device_types = _smccc11_device_types
},
{
option = "arch1"
device_types = _smccc11_device_types
},
{
option = "psci"
device_types = _smccc11_device_types
},
{
option = "smccc10"
device_types = kernel_test_device_types
},
]) {
core_tests("core-tests-workaround-${alternate.option}") {
args = [ "kernel.arm64.alternate-vbar=${alternate.option}" ]
device_types = alternate.device_types
}
boot_tests += [ ":core-tests-workaround-${alternate.option}" ]
}
}
# TODO(https://fxbug.dev/42170495): Remove once migration is complete.
core_tests("core-tests-serial-migration") {
args = [ "kernel.experimental.serial_migration=true" ]
device_types = [ "QEMU" ]
}
boot_tests += [ ":core-tests-serial-migration" ]
group("boot_tests") {
testonly = true
deps = boot_tests
}