blob: 1598101d2b8693f0563087c182f685f1553d1f1a [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/testing/host_test.gni")
if (is_host) {
# Add this to go_test()'s environments to disable a test in infra
disabled_env = {
tags = [ "system-tests-disabled" ] # Tells infra not to run this by default
dimensions = host_env.dimensions
}
}
# The service account that allows the test to download build artifacts.
_environment_service_account =
"artifact-readers@fuchsia-infra.iam.gserviceaccount.com"
# A template that configures a System Test Upgrade Suite against a given release
# builder.
#
# Parameters
#
# builds
# - Required: An array of build scopes to download and install onto the
# device in sequence, in order to simulate multi-step upgrade flows. The
# first will be flashed or paved onto the device, then the rest will be
# OTAed.
#
# Each scope in $builds contains one of:
#
# release_builder
# - Optional: Builder from which the build artifacts will be downloaded and
# upgraded to on the device, rather than from the current build. This
# has the form of `project/bucket/builder id`, like
# `fuchsia/ci/fuchsia-x64-release`.
# Conflicts with `release_build_id`.
# - Type: string
#
# release_build_id
# - Optional: Build ID from which the build artifacts will be downloaded
# and upgraded to on the device, rather than from the current
# build. This has the form of `1234...`. Conflicts with `release_builder`.
# - Type: string
#
# downgrade_release_builder
# - Required: Builder from which the downgrade build artifacts will be
# downloaded and installed on the device. This has the form of
# `project/bucket/builder id`, like `fuchsia/ci/fuchsia-x64-release`.
# Conflicts with `downgrade_release_build_id`.
# - Type: string
#
# downgrade_release_build_id
# - Required: Build ID from which the downgrade build artifacts will be
# downloaded and installed on the device. This has the form of `1234...`.
# Conflicts with `downgrade_release_builder`.
# - Type: string
#
# downgrade_ota_attempts
# - Optional: Number of times to try to OTA from the downgrade build to the
# upgrade build before failing.
# - Type: integer
#
# upgrade_release_builder
# - Optional: Builder from which the upgrade build artifacts will be
# downloaded and upgraded to on the device, rather than from the current
# build. This has the form of `project/bucket/builder id`, like
# `fuchsia/ci/fuchsia-x64-release`.
# Conflicts with `upgrade_release_build_id`.
# - Type: string
#
# upgrade_release_build_id
# - Optional: Build ID from which the upgrade build artifacts will be
# downloaded and upgraded to on the device, rather than from the current
# build. This has the form of `1234...`. Conflicts with `release_builder`.
# - Type: string
#
# installer
# - Optional: Installer to use to install OTA.
# - Type: string
#
# service_account
# - Optional: The service account that has permission to download the build
# artifacts.
# - Type: string
#
# environments
# - Required: What environments this test should target.
# - Type: see //build/testing/test_spec.gni for more details. Note that
# any label and service_account in each environment is ignored.
#
# timeout
# - Optional: Err if this test takes longer than this time.
# - Type: duration string
#
# pave_timeout
# - Optional: Err if paving takes longer than this time.
# - Type: duration string
#
# cycle_timeout
# - Optional: Err if the test cycle takes longer than this time.
# - Type: duration string
#
# cycle_count
# - Optional: How many test cycles should the test execute. Defaults to 1
# cycle.
# - Type: integer string
#
# device_connect_timeout
# - Optional: How long to wait between connection attempts.
# - Type: duration string
#
# workaround_broken_time_skip
# - Optional: whether to sleep 15 seconds and then reconnect after paving
# the device to avoid a known bug (https://fxbug.dev/42154590) in netstack when
# system time becomes accurate.
# - Type: boolean, default false
#
# workaround_downgrade_ota_no_rewrite_rules
# - Optional: omaha updater will not set workaround downgrade ota rewrite
# rules.
# - Type: boolean, default false
#
# require_cup
# - Optional: whether or not mock-omaha-server should require that all
# incoming requests have CUP enabled.
# - Type: boolean, default false
#
# use_flash
# - Optional: whether or not to use ffx flash instead of paving when
# installing the downgrade build.
# - Type: boolean, default false
#
# max_system_image_size
# - Optional: the maximum size of the system image. The system image package
# will be artificially extended to this size or less.
#
# max_update_images_size
# - Optional: the maximum size of the update images. The update images will
# be artificially extended to this size or less.
# - Type: integer greater than or equal to 0
#
# max_update_package_size
# - Optional: the maximum size of the update package. The update package will
# be artificially extended to this size or less.
# - Type: integer greater than or equal to 0
#
# use_new_update_format
# - Optional: use the new update format.
# - Type: boolean, default false
#
# bootfs_compression
# - Optional: setting to use when compressing bootfs in the zbi
# - Type: string
#
# check_abr
# - Optional: check that the device booted into the expected ABR slot.
# - Type: bool, default true
template("system_test_upgrade_suite") {
assert(is_linux || is_mac, "system_tests are for linux/mac only")
assert(
!(defined(invoker.downgrade_release_builder) &&
defined(invoker.downgrade_release_build_id)),
"downgrade_release_builder and downgrade_release_build_id are mutually exclusive for $target_name")
assert(
!(defined(invoker.builds) && defined(invoker.downgrade_release_builder)),
"builds is mutually exlusive with downgrade_release_builder for $target_name")
assert(
!(defined(invoker.builds) && defined(invoker.downgrade_release_build_id)),
"builds is mutually exlusive with downgrade_release_build_id for $target_name")
assert(
!(defined(invoker.builds) && defined(invoker.upgrade_release_builder)),
"builds is mutually exlusive with upgrade_release_builder for $target_name")
assert(
!(defined(invoker.builds) && defined(invoker.upgrade_release_build_id)),
"builds is mutually exlusive with upgrade_release_build_id for $target_name")
assert(defined(invoker.environments),
"environments must be defined for $target_name")
_builds = []
if (defined(invoker.builds)) {
foreach(build, invoker.builds) {
assert(
defined(build.release_builder) || defined(build.release_build_id),
"release_builder or release_build_id must be defined for $target_name")
assert(
!(defined(invoker.release_builder) &&
defined(invoker.release_build_id)),
"release_builder and release_build_id are mutually exclusive for $target_name")
_builds += [ build ]
}
} else {
_build = {
}
if (defined(invoker.downgrade_release_builder)) {
_build.release_builder = invoker.downgrade_release_builder
}
if (defined(invoker.downgrade_release_build_id)) {
_build.release_build_id = invoker.downgrade_release_build_id
}
if (defined(invoker.upgrade_release_builder)) {
_build.release_builder = invoker.upgrade_release_builder
}
if (defined(invoker.upgrade_release_build_id)) {
_build.release_build_id = invoker.upgrade_release_build_id
}
_builds += [ _build ]
}
assert(_builds != [], "upgrade builds must be specified")
_tests =
[ "//src/sys/pkg/tests/system-tests/upgrade_test:system_tests_upgrade" ]
_deps = []
foreach(test, _tests) {
_test_name = get_label_info(test, "name")
_test_binary = "$root_out_dir/$_test_name"
_host_test_target_name = "${target_name}_${_test_name}"
_deps += [ ":${_host_test_target_name}" ]
_args = [ "-test.v" ] # Print test detailed case status
foreach(build, _builds) {
if (defined(build.release_build_id)) {
_args += [
"--build-id",
build.release_build_id,
]
}
if (defined(build.release_builder)) {
_args += [
"--builder-name",
build.release_builder,
]
}
}
if (defined(invoker.downgrade_ota_attempts)) {
_args += [
"-downgrade-ota-attempts",
invoker.downgrade_ota_attempts,
]
}
_service_account = _environment_service_account
if (defined(invoker.service_account)) {
assert(invoker.service_account != "",
"'${_host_test_target_name}' cannot have an empty service_account")
_service_account = invoker.service_account
}
if (defined(invoker.timeout)) {
assert(invoker.timeout != "",
"'${_host_test_target_name}' cannot have an empty timeout")
_args += [
"-test.timeout",
invoker.timeout,
]
}
if (defined(invoker.pave_timeout)) {
assert(invoker.pave_timeout != "",
"'${_host_test_target_name}' cannot have an empty pave timeout")
_args += [
"-pave-timeout",
invoker.pave_timeout,
]
}
if (defined(invoker.cycle_timeout)) {
assert(invoker.cycle_timeout != "",
"'${_host_test_target_name}' cannot have an empty cycle timeout")
_args += [
"-cycle-timeout",
invoker.cycle_timeout,
]
}
if (defined(invoker.cycle_count)) {
assert(invoker.cycle_count != "",
"'${_host_test_target_name}' cannot have an empty cycle count")
_args += [
"-cycle-count",
invoker.cycle_count,
]
}
if (defined(invoker.installer)) {
assert(invoker.installer != "",
"'${_host_test_target_name}' cannot have an empty installer")
_args += [
"-installer",
invoker.installer,
]
}
if (defined(invoker.device_connect_timeout)) {
assert(
invoker.device_connect_timeout != "",
"'${_host_test_target_name}' cannot have empty device connect timout")
_args += [
"-device-connect-timeout",
invoker.device_connect_timeout,
]
}
# TODO(74942): remove this workaround
if (defined(invoker.workaround_broken_time_skip) &&
invoker.workaround_broken_time_skip) {
_args += [ "-workaround-broken-time-skip" ]
}
if (defined(invoker.workaround_downgrade_ota_no_rewrite_rules) &&
invoker.workaround_downgrade_ota_no_rewrite_rules) {
_args += [ "-workaround-downgrade-ota-no-rewrite-rules" ]
}
if (defined(invoker.require_cup) && invoker.require_cup) {
_args += [ "-require-cup" ]
}
if (defined(invoker.use_flash) && invoker.use_flash) {
_args += [ "-use-flash" ]
}
if (defined(invoker.build_expect_unknown_firmware) &&
invoker.build_expect_unknown_firmware) {
_args += [ "-build-expect-unknown-firmware" ]
}
if (defined(invoker.max_system_image_size)) {
assert(
invoker.max_system_image_size != "",
"'${_host_test_target_name}' cannot have an empty max_system_image_size")
_args += [
"-max-system-image-size",
invoker.max_system_image_size,
]
}
if (defined(invoker.max_update_images_size)) {
assert(
invoker.max_update_images_size != "",
"'${_host_test_target_name}' cannot have an empty max_update_images_size")
_args += [
"-max-update-images-size",
invoker.max_update_images_size,
]
}
if (defined(invoker.max_update_package_size)) {
assert(
invoker.max_update_package_size != "",
"'${_host_test_target_name}' cannot have an empty max_update_package_size")
_args += [
"-max-update-package-size",
invoker.max_update_package_size,
]
}
if (defined(invoker.bootfs_compression)) {
assert(
invoker.bootfs_compression != "",
"'${_host_test_target_name}' cannot have an empty bootfs_compression")
_args += [
"-bootfs-compression",
invoker.bootfs_compression,
]
}
if (!defined(invoker.check_abr) || invoker.check_abr) {
_args += [ "--check-abr=true" ]
} else {
_args += [ "--check-abr=false" ]
}
host_test(_host_test_target_name) {
binary_path = _test_binary
args = _args
deps = [ test ]
environments = []
foreach(env, invoker.environments) {
env.service_account = _service_account
environments += [ env ]
}
}
}
# Finally, group all the generated test specs into a group to make it easy to
# reference.
group(target_name) {
testonly = true
deps = _deps
}
}
# A template that configures a System Test Reboot Suite against a given release
# builder.
#
# Parameters
#
# release_builder
# - Optional: Builder from which build artifacts will be downloaded and
# installed on the device, instead of from the current build. This has
# the form of `project/bucket/builder id`, like
# `fuchsia/ci/fuchsia-x64-release`. Conflicts with `release_build_id`.
# - Type: string
#
# release_build_id
# - Optional: Build ID from which build artifacts will be downloaded and
# installed on the device, instead of from the current build. This has
# the form of `1234...`. Conflicts with `release_builder`.
# - Type: string
#
# service_account
# - Optional: The service account that has permission to download the build
# artifacts.
# - Type: string
#
# environments
# - Required: What environments this test should target.
# - Type: see //build/testing/test_spec.gni for more details. Note that
# any label and service_account in each environment is ignored.
#
# timeout
# - Optional: Err if this test takes longer than this time.
# - Type: duration string
#
# cycle_timeout
# - Optional: Err if the test cycle takes longer than this time.
# - Type: duration string
#
# cycle_count
# - Optional: How many test cycles should the test execute. Defaults to 1
# cycle.
# - Type: integer string
#
# device_connect_timeout
# - Optional: How long to wait between connection attempts.
# - Type: duration string
#
# sleep_after_reboot
# - Optional: How long to sleep after we trigger a reboot and connect to the device.
# - Type: duration string
#
# check_abr
# - Optional: check that the device booted into the expected ABR slot.
# - Type: bool, default true
template("system_test_reboot_suite") {
assert(is_linux || is_mac, "system_test_reboot_suite is for linux/mac only")
assert(
!(defined(invoker.release_builder) && defined(invoker.release_build_id)),
"release_builder and release_build_id are mutually exclusive for $target_name")
assert(defined(invoker.environments),
"environments must be defined for $target_name")
_tests =
[ "//src/sys/pkg/tests/system-tests/reboot_test:system_tests_reboot" ]
_deps = []
foreach(test, _tests) {
_test_name = get_label_info(test, "name")
_test_binary = "$root_out_dir/$_test_name"
_host_test_target_name = "${target_name}_${_test_name}"
_deps += [ ":${_host_test_target_name}" ]
_args = [ "-test.v" ] # Print test detailed case status
if (defined(invoker.release_builder)) {
_args += [
"-builder-name",
invoker.release_builder,
]
}
if (defined(invoker.release_build_id)) {
_args += [
"-build-id",
invoker.release_build_id,
]
}
_service_account = _environment_service_account
if (defined(invoker.service_account)) {
assert(invoker.service_account != "",
"'${_host_test_target_name}' cannot have an empty service_account")
_service_account = invoker.service_account
}
if (defined(invoker.timeout)) {
assert(invoker.timeout != "",
"'${_host_test_target_name}' cannot have an empty timeout")
_args += [
"-test.timeout",
invoker.timeout,
]
}
if (defined(invoker.cycle_timeout)) {
assert(invoker.cycle_timeout != "",
"'${_host_test_target_name}' cannot have an empty cycle timeout")
_args += [
"-cycle-timeout",
invoker.cycle_timeout,
]
}
if (defined(invoker.cycle_count)) {
assert(invoker.cycle_count != "",
"'${_host_test_target_name}' cannot have an empty cycle count")
_args += [
"-cycle-count",
invoker.cycle_count,
]
}
if (defined(invoker.device_connect_timeout)) {
assert(
invoker.device_connect_timeout != "",
"'${_host_test_target_name}' cannot have empty device connect timout")
_args += [
"-device-connect-timeout",
invoker.device_connect_timeout,
]
}
if (defined(invoker.sleep_after_reboot)) {
assert(invoker.sleep_after_reboot != "",
"'${_host_test_target_name}' cannot have empty sleep after reboot")
_args += [
"-sleep-after-reboot",
invoker.sleep_after_reboot,
]
}
if (!defined(invoker.check_abr) || invoker.check_abr) {
_args += [ "--check-abr=true" ]
} else {
_args += [ "--check-abr=false" ]
}
host_test(_host_test_target_name) {
binary_path = _test_binary
args = _args
deps = [ test ]
environments = []
foreach(env, invoker.environments) {
env.service_account = _service_account
environments += [ env ]
}
}
}
# Finally, group all the generated test specs into a group to make it easy to
# reference.
group(target_name) {
testonly = true
deps = _deps
}
}
# A template that configures a System Test Recovery Suite against a given release
# builder.
#
# Parameters
#
# release_builder
# - Optional: Builder from which build artifacts will be downloaded and
# installed on the device, instead of from the current build. This has
# the form of `project/bucket/builder id`, like
# `fuchsia/ci/fuchsia-x64-release`. Conflicts with `release_build_id`.
# - Type: string
#
# release_build_id
# - Optional: Build ID from which build artifacts will be downloaded and
# installed on the device, instead of from the current build. This has
# the form of `1234...`. Conflicts with `release_builder`.
# - Type: string
#
# service_account
# - Optional: The service account that has permission to download the build
# artifacts.
# - Type: string
#
# environments
# - Required: What environments this test should target.
# - Type: see //build/testing/test_spec.gni for more details. Note that
# any label and service_account in each environment is ignored.
#
# timeout
# - Optional: Err if this test takes longer than this time.
# - Type: duration string
#
# cycle_timeout
# - Optional: Err if the test cycle takes longer than this time.
# - Type: duration string
#
# cycle_count
# - Optional: How many test cycles should the test execute. Defaults to 1
# cycle.
# - Type: integer string
#
# device_connect_timeout
# - Optional: How long to wait between connection attempts.
# - Type: duration string
#
# check_abr
# - Optional: check that the device booted into the expected ABR slot.
# - Type: bool, default true
template("system_test_recovery_suite") {
assert(is_linux || is_mac, "system_test_recovery_suite is for linux/mac only")
assert(
!(defined(invoker.release_builder) && defined(invoker.release_build_id)),
"release_builder and release_build_id are mutually exclusive for $target_name")
assert(defined(invoker.environments),
"environments must be defined for $target_name")
_tests = [ "//src/sys/pkg/tests/system-tests:system_tests_recovery" ]
_deps = []
foreach(test, _tests) {
_test_name = get_label_info(test, "name")
_test_binary = "$root_out_dir/$_test_name"
_host_test_target_name = "${target_name}_${_test_name}"
_deps += [ ":${_host_test_target_name}" ]
_args = [ "-test.v" ] # Print test detailed case status
if (defined(invoker.release_builder)) {
_args += [
"-builder-name",
invoker.release_builder,
]
}
if (defined(invoker.release_build_id)) {
_args += [
"-build-id",
invoker.release_build_id,
]
}
_service_account = _environment_service_account
if (defined(invoker.service_account)) {
assert(invoker.service_account != "",
"'${_host_test_target_name}' cannot have an empty service_account")
_service_account = invoker.service_account
}
if (defined(invoker.timeout)) {
assert(invoker.timeout != "",
"'${_host_test_target_name}' cannot have an empty timeout")
_args += [
"-test.timeout",
invoker.timeout,
]
}
if (defined(invoker.cycle_timeout)) {
assert(invoker.cycle_timeout != "",
"'${_host_test_target_name}' cannot have an empty cycle timeout")
_args += [
"-cycle-timeout",
invoker.cycle_timeout,
]
}
if (defined(invoker.cycle_count)) {
assert(invoker.cycle_count != "",
"'${_host_test_target_name}' cannot have an empty cycle count")
_args += [
"-cycle-count",
invoker.cycle_count,
]
}
if (defined(invoker.device_connect_timeout)) {
assert(
invoker.device_connect_timeout != "",
"'${_host_test_target_name}' cannot have empty device connect timout")
_args += [
"-device-connect-timeout",
invoker.device_connect_timeout,
]
}
if (!defined(invoker.check_abr) || invoker.check_abr) {
_args += [ "--check-abr=true" ]
} else {
_args += [ "--check-abr=false" ]
}
host_test(_host_test_target_name) {
binary_path = _test_binary
args = _args
deps = [ test ]
environments = []
foreach(env, invoker.environments) {
env.service_account = _service_account
environments += [ env ]
}
}
}
# Finally, group all the generated test specs into a group to make it easy to
# reference.
group(target_name) {
testonly = true
deps = _deps
}
}