123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 |
- # Copyright 2018 The Chromium 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/config/chrome_build.gni")
- import("//build/config/chromeos/args.gni")
- import("//build/config/chromeos/ui_mode.gni")
- import("//build/config/dcheck_always_on.gni")
- import("//build/config/gclient_args.gni")
- import("//build/config/python.gni")
- import("//build/util/generate_wrapper.gni")
- assert(is_chromeos && is_chromeos_device)
- # Determine the real paths for various items in the SDK, which may be used
- # in the 'generate_runner_script' template below. We do so outside the template
- # to confine exec_script to a single invocation.
- if (cros_sdk_version != "") {
- # Ideally these should be maps, however, gn doesn't support map, so using a
- # list of list to simulate a map:
- # [key1, [value1, value2, ...]], [key2, [value1, value2, ...]], where
- # the keys are boards and values are symlinks or symlink targets, and the
- # mapping shouldn't be used for anything else.
- #
- # A sample usage is:
- # foreach(m, _symlink_targets_map) {
- # if(m[0] == target_key) {
- # target_value = m[1]
- # }
- # }
- #
- _symlink_map = []
- _symlink_targets_map = []
- if (is_chromeos_ash) {
- _potential_test_boards = [ cros_board ]
- } else {
- _potential_test_boards = []
- if (cros_boards != "") {
- _potential_test_boards += string_split(cros_boards, ":")
- }
- if (cros_boards_with_qemu_images != "") {
- _potential_test_boards += string_split(cros_boards_with_qemu_images, ":")
- }
- }
- foreach(b, _potential_test_boards) {
- _cache_path_prefix =
- "//build/cros_cache/chrome-sdk/symlinks/${b}+${cros_sdk_version}"
- _cros_is_vm = false
- foreach(b1, string_split(cros_boards_with_qemu_images, ":")) {
- if (b == b1) {
- _cros_is_vm = true
- }
- }
- _symlinks = []
- _symlinks = [
- # Tast harness & test data.
- rebase_path("${_cache_path_prefix}+autotest_server_package.tar.bz2"),
- rebase_path("${_cache_path_prefix}+chromeos-base/tast-cmd"),
- rebase_path("${_cache_path_prefix}+chromeos-base/tast-remote-tests-cros"),
- # Binutils (and other toolchain tools) used to deploy Chrome to the device.
- rebase_path(
- "${_cache_path_prefix}+environment_chromeos-base_chromeos-chrome.tar.xz"),
- rebase_path("${_cache_path_prefix}+target_toolchain"),
- ]
- if (_cros_is_vm) {
- # VM-related tools.
- _symlinks += [
- rebase_path("${_cache_path_prefix}+sys-firmware/seabios"),
- rebase_path("${_cache_path_prefix}+chromiumos_test_image.tar.xz"),
- rebase_path("${_cache_path_prefix}+app-emulation/qemu"),
- ]
- }
- _symlink_map += [ [
- b,
- _symlinks,
- ] ]
- }
- _all_symlinks = []
- foreach(m, _symlink_map) {
- _all_symlinks += m[1]
- }
- _all_symlink_targets =
- exec_script("//build/get_symlink_targets.py", _all_symlinks, "list lines")
- _index = 0
- foreach(m, _symlink_map) {
- _symlink_targets = []
- foreach(_, m[1]) {
- _symlink_targets += [ _all_symlink_targets[_index] ]
- _index += 1
- }
- _symlink_targets_map += [ [
- m[0],
- _symlink_targets,
- ] ]
- }
- }
- # Creates dependencies required by skylab testing. If passed the
- # generated_script and test_exe this will generate the skylab runner script.
- # If passed tast_attr_expr, tast_tests or tast_disabled_tests this will
- # generate a filter file containing the expression for running tests in skylab.
- # Args:
- # generated_script: Name of the generated runner script created for test_exe
- # test_exe: Name of the executable to run with the generated script.
- # tast_attr_expr: Tast expression to determine tests to run. This creates the
- # initial set of tests that can be further filtered..
- # tast_tests: Names of tests to enable in tast. All other tests will be
- # disabled that are not listed.
- # tast_disabled_tests: Names of tests to disable in tast. All other tests that
- # match the tast expression will still run.
- # tast_control: gni file with collections of tests to be used for specific
- # filters (e.g. "//chromeos/tast_control.gni"). Any lists of strings in
- # this file will be used to generate additional tast expressions with
- # those strings expanded into tests to disable (i.e. as && !"name:test").
- # The name of those lists are then intended to be used to specify in
- # test_suites.pyl which collection to be used on specific test suites.
- template("generate_skylab_deps") {
- forward_variables_from(invoker,
- [
- "generated_script",
- "test_exe",
- "tast_attr_expr",
- "tast_tests",
- "tast_disabled_tests",
- "tast_control",
- ])
- if (defined(test_exe) || defined(generated_script)) {
- assert(defined(test_exe) && defined(generated_script),
- "The test_exe and generated_script must both be defined when " +
- "generating the skylab runner script")
- action(target_name) {
- script = "//build/chromeos/generate_skylab_deps.py"
- outputs = [ generated_script ]
- args = [
- "generate-runner",
- "--test-exe",
- test_exe,
- "--output",
- rebase_path(generated_script, root_build_dir),
- ]
- deps = [ "//testing/buildbot/filters:chromeos_filters" ]
- if (defined(invoker.deps)) {
- deps += invoker.deps
- }
- data = [ generated_script ]
- if (defined(invoker.data)) {
- data += invoker.data
- }
- data_deps = [ "//testing:test_scripts_shared" ]
- if (defined(invoker.data_deps)) {
- data_deps += invoker.data_deps
- }
- }
- }
- if (defined(tast_attr_expr) || defined(tast_tests) ||
- defined(tast_disabled_tests)) {
- if (defined(tast_disabled_tests)) {
- assert(defined(tast_attr_expr),
- "tast_attr_expr must be used when specifying tast_disabled_tests.")
- }
- _generated_filter = "$root_build_dir/bin/${target_name}.filter"
- _skylab_args = [
- "generate-filter",
- "--output",
- rebase_path(_generated_filter),
- ]
- if (defined(tast_control)) {
- _skylab_args += [
- "--tast-control",
- rebase_path(tast_control),
- ]
- }
- if (defined(tast_attr_expr)) {
- _skylab_args += [
- "--tast-expr",
- tast_attr_expr,
- ]
- }
- if (defined(tast_tests)) {
- foreach(_test, tast_tests) {
- _skylab_args += [
- "--enabled-tests",
- _test,
- ]
- }
- }
- if (defined(tast_disabled_tests)) {
- foreach(_test, tast_disabled_tests) {
- _skylab_args += [
- "--disabled-tests",
- _test,
- ]
- }
- }
- action(target_name) {
- script = "//build/chromeos/generate_skylab_deps.py"
- if (defined(tast_control)) {
- sources = [ tast_control ]
- }
- outputs = [ _generated_filter ]
- args = _skylab_args
- if (defined(invoker.data_deps)) {
- data_deps = invoker.data_deps
- }
- data = [ _generated_filter ]
- if (defined(invoker.data)) {
- data += invoker.data
- }
- if (defined(invoker.deps)) {
- deps = invoker.deps
- }
- }
- }
- }
- # Creates a script at $generated_script that can be used to launch a cros VM
- # and optionally run a test within it.
- # Args:
- # test_exe: Name of test binary located in the out dir. This will get copied
- # to the VM and executed there.
- # tast_attr_expr: Tast expression to pass to local_test_runner on the VM.
- # tast_tests: List of Tast tests to run on the VM. Note that when this is
- # specified, the target name used to invoke this template will be
- # designated as the "name" of this test and will primarly used for test
- # results tracking and displaying (eg: flakiness dashboard).
- # generated_script: Path to place the generated script.
- # deploy_chrome: If true, deploys a locally built chrome located in the root
- # build dir to the VM or DUT after launching it.
- # deploy_lacros: If true, deploys a locally built Lacros located in the root
- # build dir to the VM or DUT after launching it.
- # runtime_deps_file: Path to file listing runtime deps for the test. If set,
- # all files listed will be copied to the VM before testing.
- # skip_generating_board_args: By default, this template generates an '--board'
- # arg with corresponding '--flash' or '--use-vm' args for device and vm
- # respectively. This argument instructs the template to skip generating
- # them, and it's designed for use cases where one builds for one board
- # (e.g. amd64-generic), but tests on a different board (e.g. eve).
- # tast_vars: A list of "key=value" runtime variable pairs to pass to invoke
- # strip_chrome: If true, strips Chrome before deploying it for non-Tast tests.
- # the Tast tests. For more details, please see:
- # https://chromium.googlesource.com/chromiumos/platform/tast/+/HEAD/docs/writing_tests.md#Runtime-variables
- template("generate_runner_script") {
- forward_variables_from(invoker,
- [
- "deploy_chrome",
- "deploy_lacros",
- "generated_script",
- "runtime_deps_file",
- "skip_generating_board_args",
- "strip_chrome",
- "tast_attr_expr",
- "tast_tests",
- "tast_vars",
- "testonly",
- "test_exe",
- ])
- if (!defined(skip_generating_board_args)) {
- skip_generating_board_args = false
- }
- if (skip_generating_board_args) {
- # cros_board is not needed, so setting it to empty to avoid being used
- # accidentally below.
- cros_board = ""
- not_needed([ cros_board ])
- }
- if (!defined(deploy_chrome)) {
- deploy_chrome = false
- }
- if (!defined(deploy_lacros)) {
- deploy_lacros = false
- }
- if (!defined(strip_chrome)) {
- strip_chrome = false
- }
- assert(!(deploy_chrome && deploy_lacros),
- "deploy_chrome and deploy_lacros are exclusive.")
- is_tast = defined(tast_attr_expr) || defined(tast_tests)
- assert(!(is_tast && defined(test_exe)),
- "Tast tests are invoked from binaries shipped with the VM image. " +
- "There should be no locally built binary needed.")
- assert(is_tast || !defined(tast_vars),
- "tast_vars is only support for Tast tests")
- if (is_tast) {
- not_needed([ "strip_chrome" ])
- }
- # If we're in the cros chrome-sdk (and not the raw ebuild), the test will
- # need some additional runtime data located in the SDK cache.
- _sdk_data = []
- if (cros_sdk_version != "") {
- assert(defined(generated_script),
- "Must specify where to place generated test launcher script via " +
- "'generated_script'")
- foreach(b, _potential_test_boards) {
- _cros_is_vm = false
- foreach(b1, string_split(cros_boards_with_qemu_images, ":")) {
- if (b == b1) {
- _cros_is_vm = true
- }
- }
- # Determine the real paths for various items in the SDK, which may be used
- # in the 'generate_runner_script' template below.
- if (is_tast || _cros_is_vm || deploy_chrome) {
- _symlink_targets = []
- foreach(m, _symlink_targets_map) {
- if (b == m[0]) {
- _symlink_targets = []
- _symlink_targets = m[1]
- }
- }
- if (is_tast) {
- # Add tast sdk items.
- _sdk_data += [
- _symlink_targets[0],
- _symlink_targets[1],
- _symlink_targets[2],
- ]
- }
- if (deploy_chrome) {
- # To deploy chrome to the VM, it needs to be stripped down to fit into
- # the VM. This is done by using binutils in the toolchain. So add the
- # toolchain to the data.
- _sdk_data += [
- _symlink_targets[3],
- _symlink_targets[4],
- ]
- }
- if (_cros_is_vm) {
- # Add vm sdk items.
- _sdk_data += [
- _symlink_targets[5],
- _symlink_targets[6],
- _symlink_targets[7],
- ]
- }
- }
- }
- }
- generate_wrapper(target_name) {
- executable = "//build/chromeos/test_runner.py"
- wrapper_script = generated_script
- executable_args = []
- if (defined(runtime_deps_file)) {
- write_runtime_deps = runtime_deps_file
- }
- # Build executable_args for the three different test types: GTest, Tast,
- # and host-side commands (eg telemetry).
- if (defined(test_exe)) {
- executable_args += [
- "gtest",
- "--test-exe",
- test_exe,
- ]
- if (defined(runtime_deps_file)) {
- executable_args += [
- "--runtime-deps-path",
- rebase_path(runtime_deps_file, root_build_dir),
- ]
- }
- } else if (is_tast) {
- # When --tast-tests is specified, test_runner.py will call
- # local_test_runner on the VM to run the set of tests.
- executable_args += [
- "tast",
- "--suite-name",
- target_name,
- ]
- if (defined(tast_attr_expr)) {
- executable_args += [
- "--attr-expr",
- tast_attr_expr,
- ]
- } else {
- foreach(test, tast_tests) {
- executable_args += [
- "-t",
- test,
- ]
- }
- }
- if (defined(tast_vars)) {
- foreach(var, tast_vars) {
- executable_args += [
- "--tast-var",
- var,
- ]
- }
- }
- if (dcheck_always_on) {
- executable_args += [
- "--tast-extra-use-flags",
- "chrome_dcheck",
- ]
- }
- } else {
- executable_args += [ "host-cmd" ]
- }
- executable_args += [
- "--cros-cache",
- "build/cros_cache/",
- "--path-to-outdir",
- rebase_path(root_out_dir, "//"),
- "-v",
- ]
- if (!is_tast && strip_chrome) {
- executable_args += [ "--strip-chrome" ]
- }
- if (!skip_generating_board_args) {
- executable_args += [
- "--board",
- cros_board,
- ]
- _cros_is_vm = false
- foreach(b, string_split(cros_boards_with_qemu_images, ":")) {
- if (cros_board == b) {
- _cros_is_vm = true
- }
- }
- if (_cros_is_vm) {
- executable_args += [ "--use-vm" ]
- } else {
- executable_args += [ "--flash" ]
- }
- }
- # If we have public Chromium builds, use public Chromium OS images when
- # flashing the test device.
- if (!is_chrome_branded) {
- executable_args += [ "--public-image" ]
- }
- if (deploy_lacros) {
- executable_args += [ "--deploy-lacros" ]
- }
- if (deploy_chrome && !defined(test_exe) && !is_tast) {
- executable_args += [ "--deploy-chrome" ]
- }
- # executable_args should be finished, now build the data and deps lists.
- deps = [ "//testing/buildbot/filters:chromeos_filters" ]
- if (defined(invoker.deps)) {
- deps += invoker.deps
- }
- data = [
- "//.vpython3",
- # We use android test-runner's results libs to construct gtest output
- # json.
- "//build/android/pylib/__init__.py",
- "//build/android/pylib/base/",
- "//build/android/pylib/results/",
- "//build/chromeos/",
- "//build/util/",
- # Needed for various SDK components used below.
- "//build/cros_cache/chrome-sdk/misc/",
- "//build/cros_cache/chrome-sdk/symlinks/",
- "//chrome/VERSION",
- # The LKGM file controls what version of the VM image to download. Add it
- # as data here so that changes to it will trigger analyze.
- "//chromeos/CHROMEOS_LKGM",
- "//third_party/chromite/",
- ]
- data += _sdk_data
- if (defined(invoker.data)) {
- data += invoker.data
- }
- data_deps = [ "//testing:test_scripts_shared" ]
- if (defined(invoker.data_deps)) {
- data_deps += invoker.data_deps
- }
- }
- }
- template("tast_test") {
- forward_variables_from(invoker, "*")
- # Default the expression to match any chrome-related test.
- if (!defined(tast_attr_expr) && !defined(tast_tests)) {
- # The following expression filters out all non-critical tests. See the link
- # below for more details:
- # https://chromium.googlesource.com/chromiumos/platform/tast/+/main/docs/test_attributes.md
- tast_attr_expr = "\"group:mainline\" && \"dep:chrome\""
- if (defined(enable_tast_informational_tests) &&
- enable_tast_informational_tests) {
- tast_attr_expr += " && informational"
- } else {
- tast_attr_expr += " && !informational"
- }
- if (!is_chrome_branded) {
- tast_attr_expr += " && !\"dep:chrome_internal\""
- }
- } else {
- assert(defined(tast_attr_expr) != defined(tast_tests),
- "Specify one of tast_tests or tast_attr_expr.")
- }
- # Append any disabled tests to the expression.
- if (defined(tast_disabled_tests)) {
- assert(defined(tast_attr_expr),
- "tast_attr_expr must be used when specifying tast_disabled_tests.")
- foreach(test, tast_disabled_tests) {
- tast_attr_expr += " && !\"name:${test}\""
- }
- }
- if (defined(tast_attr_expr)) {
- tast_attr_expr = "( " + tast_attr_expr + " )"
- }
- generate_runner_script(target_name) {
- testonly = true
- generated_script = "$root_build_dir/bin/run_${target_name}"
- runtime_deps_file = "$root_out_dir/${target_name}.runtime_deps"
- deploy_chrome = true
- data_deps = [
- "//:chromiumos_preflight", # Builds the browser.
- "//chromeos:cros_chrome_deploy", # Adds additional browser run-time deps.
- # Tools used to symbolize Chrome crash dumps.
- # TODO(crbug.com/1156772): Remove these if/when all tests pick them up by
- # default.
- "//third_party/breakpad:dump_syms",
- "//third_party/breakpad:minidump_dump",
- "//third_party/breakpad:minidump_stackwalk",
- ]
- data = [ "//components/crash/content/tools/generate_breakpad_symbols.py" ]
- }
- }
- template("lacros_tast_tests") {
- forward_variables_from(invoker,
- [
- "tast_attr_expr",
- "tast_disabled_tests",
- "tast_tests",
- "tast_control",
- ])
- assert(defined(tast_attr_expr) != defined(tast_tests),
- "Specify one of tast_tests or tast_attr_expr.")
- _lacros_data_deps = [
- "//chrome", # Builds the browser.
- # Tools used to symbolize Chrome crash dumps.
- # TODO(crbug.com/1156772): Remove these if/when all tests pick them up by
- # default.
- "//third_party/breakpad:dump_syms",
- "//third_party/breakpad:minidump_dump",
- "//third_party/breakpad:minidump_stackwalk",
- ]
- _lacros_data = [
- "//components/crash/content/tools/generate_breakpad_symbols.py",
- # A script needed to launch Lacros in Lacros Tast tests.
- "//build/lacros/mojo_connection_lacros_launcher.py",
- ]
- if (is_skylab) {
- generate_skylab_deps(target_name) {
- data = _lacros_data
- data_deps = _lacros_data_deps
- # To disable a test on specific milestones, add it to the appropriate
- # collection in the following file
- tast_control = "//chromeos/tast_control.gni"
- }
- } else {
- # Append any disabled tests to the expression.
- if (defined(tast_disabled_tests)) {
- assert(defined(tast_attr_expr),
- "tast_attr_expr must be used when specifying tast_disabled_tests.")
- foreach(test, tast_disabled_tests) {
- tast_attr_expr += " && !\"name:${test}\""
- }
- }
- if (defined(tast_attr_expr)) {
- tast_attr_expr = "( " + tast_attr_expr + " )"
- }
- generate_runner_script(target_name) {
- testonly = true
- deploy_lacros = true
- generated_script = "$root_build_dir/bin/run_${target_name}"
- runtime_deps_file = "$root_out_dir/${target_name}.runtime_deps"
- # At build time, Lacros tests don't know whether they'll run on VM or HW,
- # and instead, these flags are specified at runtime when invoking the
- # generated runner script.
- skip_generating_board_args = true
- # By default, tast tests download a lacros-chrome from a gcs location and
- # use it for testing. To support running lacros tast tests from Chromium CI,
- # a Var is added to support pointing the tast tests to use a specified
- # pre-deployed lacros-chrome. The location is decided by:
- # https://source.chromium.org/chromium/chromium/src/+/main:third_party/chromite/scripts/deploy_chrome.py;l=80;drc=86f1234a4be8e9574442e076cdc835897f7bea61
- tast_vars = [ "lacros.DeployedBinary=/usr/local/lacros-chrome" ]
- data_deps = _lacros_data_deps
- data = _lacros_data
- }
- }
- }
|