| # 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/gclient_args.gni") |
| import("//build/config/python.gni") |
| import("//build/util/generate_wrapper.gni") |
| |
| assert((is_chromeos_ash || is_chromeos_lacros) && 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}+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_qemu_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 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 |
| # 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", |
| "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 |
| } |
| 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 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], |
| ] |
| } |
| 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[2], |
| _symlink_targets[3], |
| ] |
| } |
| if (_cros_is_vm) { |
| # Add vm sdk items. |
| _sdk_data += [ |
| _symlink_targets[4], |
| _symlink_targets[5], |
| _symlink_targets[6], |
| ] |
| } |
| } |
| } |
| } |
| |
| generate_wrapper(target_name) { |
| executable = "//build/chromeos/test_runner.py" |
| use_vpython3 = true |
| 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, |
| ] |
| } |
| } |
| } else { |
| executable_args += [ "host-cmd" ] |
| } |
| executable_args += [ |
| "--cros-cache", |
| "build/cros_cache/", |
| "--path-to-outdir", |
| rebase_path(root_out_dir, "//"), |
| "-v", |
| ] |
| |
| 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 = [ |
| "//.vpython", |
| "//.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/", |
| |
| # Needed for various SDK components used below. |
| "//build/cros_cache/chrome-sdk/misc/", |
| "//build/cros_cache/chrome-sdk/symlinks/", |
| |
| # 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/+/master/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", |
| ]) |
| 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 |
| 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/+/master:third_party/chromite/scripts/deploy_chrome.py;l=80;drc=86f1234a4be8e9574442e076cdc835897f7bea61 |
| tast_vars = [ "lacrosDeployedBinary=/usr/local/lacros-chrome" ] |
| |
| # Lacros tast tests may have different test expectations based on whether |
| # they're for Chromium or Chrome. |
| tast_vars += [ "lacrosIsChromeBranded=$is_chrome_branded" ] |
| |
| 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", |
| ] |
| |
| 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", |
| ] |
| } |
| } |