| # 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. |
| |
| assert(is_fuchsia) |
| |
| import("//build/config/chromecast_build.gni") |
| import("//build/config/fuchsia/config.gni") |
| import("//build/config/fuchsia/package.gni") |
| import("//build/config/gclient_args.gni") |
| import("//build/config/sysroot.gni") |
| import("//build/util/generate_wrapper.gni") |
| |
| declare_args() { |
| # Sets the Fuchsia Amber repository which will be used by default by the |
| # generated installation scripts. If not specified, then no default directory |
| # will be used. |
| default_fuchsia_build_dir_for_installation = "" |
| |
| # CPU architecture of the host used to run the tests. |
| test_host_cpu = host_cpu |
| |
| # Sets whether emulators need to be included in the test isolates |
| test_isolate_uses_emulator = true |
| |
| # A list of additional Fuchsia boot images to include in the test isolates. |
| fuchsia_additional_boot_images = [] |
| } |
| |
| # Generates a script which deploys and optionally executes a package on a |
| # device. |
| # |
| # Parameters: |
| # package: The package() target which will be run. |
| # package_name_override: Specifies the name of the generated package, if its |
| # name is different than the |package| target name. This value must match |
| # package_name_override in the |package| target. |
| # package_deps: An array of [package, package_name_override] array pairs |
| # which specify additional dependency packages to be installed |
| # prior to execution. |
| # runner_script: The runner script implementation to use, relative to |
| # "build/fuchsia". Defaults to "test_runner.py". |
| # install_only: If true, executing the script will only install the package |
| # on the device, but not run it. |
| # is_test_exe: If true, the generated script will run the command under |
| # test_env.py and add arguments expected to be passed to test exes. |
| template("fuchsia_package_runner") { |
| forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "runner_script" ]) |
| |
| if (defined(invoker.package_name_override)) { |
| _pkg_shortname = invoker.package_name_override |
| } else { |
| _pkg_shortname = get_label_info(invoker.package, "name") |
| } |
| |
| _pkg_dir = "$root_out_dir/gen/" + get_label_info(invoker.package, "dir") + |
| "/" + _pkg_shortname |
| _package_path = "$_pkg_dir/${_pkg_shortname}.far" |
| |
| generated_run_pkg_script_path = "$root_build_dir/bin/run_${_pkg_shortname}" |
| generated_install_pkg_script_path = |
| "$root_build_dir/bin/install_$_pkg_shortname" |
| |
| _generate_runner_target = "${target_name}__generate_runner" |
| _generate_installer_target = "${target_name}__generate_installer" |
| |
| # Generates a script which installs and runs a test. |
| generate_wrapper(_generate_runner_target) { |
| forward_variables_from(invoker, [ "target" ]) |
| |
| _is_test_exe = defined(invoker.is_test_exe) && invoker.is_test_exe |
| |
| if (defined(runner_script)) { |
| _runner_script = runner_script |
| } else { |
| _runner_script = "//build/fuchsia/test_runner.py" |
| } |
| |
| if (_is_test_exe) { |
| executable = "//testing/test_env.py" |
| executable_args = |
| [ "@WrappedPath(" + rebase_path(_runner_script, root_out_dir) + ")" ] |
| data = [ |
| _runner_script, |
| "//.vpython", |
| ] |
| data_deps = [ "//testing:test_scripts_shared" ] |
| } else { |
| executable = rebase_path(_runner_script) |
| executable_args = [] |
| data = [] |
| data_deps = [] |
| } |
| |
| if (defined(invoker.data)) { |
| data += invoker.data |
| } |
| |
| wrapper_script = generated_run_pkg_script_path |
| |
| data_deps += [ |
| invoker.package, |
| |
| # Runner scripts require access to "ids.txt" for symbolization, and to |
| # the "package" from which to get the name & version to deploy, which |
| # are outputs of the archive manifest generation action. |
| "${invoker.package}__archive-manifest", |
| |
| # Runner scripts require access to "meta.far" from which to calculate the |
| # expected Merkle root for the package, to verify it has been cached. |
| "${invoker.package}__archive-metadata", |
| ] |
| if (defined(invoker.data_deps)) { |
| data_deps += invoker.data_deps |
| } |
| |
| # Declares the files that are needed for test execution on the |
| # swarming test client. |
| data += [ |
| "//build/fuchsia/", |
| "//build/util/lib/", |
| "//third_party/fuchsia-sdk/sdk/.build-id/", |
| "//third_party/fuchsia-sdk/sdk/bin/fpave.sh", |
| "//third_party/fuchsia-sdk/sdk/bin/fuchsia-common.sh", |
| "//third_party/fuchsia-sdk/sdk/meta/manifest.json", |
| ] |
| |
| # TODO(crbug.com/1137662): Remove checkout_fuchsia_for_arm64_host from |
| # gclient_gn_args in //DEPS as well as this condition when builders have |
| # test_host_cpu set correctly. |
| if (checkout_fuchsia_for_arm64_host) { |
| test_host_cpu = "arm64" |
| } |
| |
| if (test_host_cpu == "x64") { |
| data_deps += |
| [ "//build/config/clang:llvm-symbolizer_data($host_toolchain)" ] |
| } |
| |
| data += [ |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/device-finder", |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/fvm", |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/merkleroot", |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/pm", |
| |
| # TODO(crbug.com/1162314) Remove "symbolize" when transition to |
| # "symbolizer" is complete. |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/symbolize", |
| |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/symbolizer", |
| "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/zbi", |
| ] |
| |
| if (test_isolate_uses_emulator) { |
| data += [ |
| "${boot_image_root}/qemu/qemu-kernel.kernel", |
| "${boot_image_root}/qemu/storage-full.blk", |
| "${boot_image_root}/qemu/zircon-a.zbi", |
| "//third_party/qemu-${host_os}-${test_host_cpu}/", |
| ] |
| |
| # Include AEMU for x64 emulator hosts. |
| if (test_host_cpu == "x64") { |
| data += [ "${aemu_root}/" ] |
| } |
| } |
| |
| foreach(fuchsia_additional_boot_image, fuchsia_additional_boot_images) { |
| data += [ "${fuchsia_additional_boot_image}/" ] |
| } |
| |
| package_paths = [ rebase_path(_package_path, root_build_dir) ] |
| if (defined(invoker.package_deps)) { |
| foreach(package_dep, invoker.package_deps) { |
| package_dep_target = package_dep[0] |
| package_dep_name = package_dep[1] |
| |
| data_deps += [ |
| package_dep_target, |
| package_dep_target + "__archive-manifest", |
| package_dep_target + "__archive-metadata", |
| ] |
| package_dep_path = rebase_path( |
| get_label_info(package_dep_target, "target_gen_dir") + "/" + |
| package_dep_name + "/" + package_dep_name + ".far", |
| root_build_dir) |
| package_paths += [ package_dep_path ] |
| } |
| } |
| |
| foreach(package_path, package_paths) { |
| executable_args += [ |
| "--package", |
| "@WrappedPath(${package_path})", |
| ] |
| } |
| |
| executable_args += [ |
| "--out-dir", |
| "@WrappedPath(.)", |
| "--target-cpu", |
| target_cpu, |
| "--package-name", |
| _pkg_shortname, |
| ] |
| |
| if (defined(invoker.use_test_server) && invoker.use_test_server) { |
| executable_args += [ "--enable-test-server" ] |
| } |
| |
| if (default_fuchsia_build_dir_for_installation != "") { |
| executable_args += [ |
| "--fuchsia-out-dir", |
| default_fuchsia_build_dir_for_installation, |
| ] |
| } |
| } |
| |
| # Produces a script which installs a package and its dependencies into the |
| # Amber repository of a pre-existing Fuchsia build directory. |
| generate_wrapper(_generate_installer_target) { |
| executable = rebase_path("//build/fuchsia/deploy_to_amber_repo.py") |
| wrapper_script = generated_install_pkg_script_path |
| |
| data_deps = [ invoker.package ] |
| if (defined(invoker.data_deps)) { |
| data_deps += invoker.data_deps |
| } |
| |
| # Build a list of all packages to install, and pass the list to the runner |
| # script. |
| package_paths = [ rebase_path(_package_path, root_build_dir) ] |
| if (defined(invoker.package_deps)) { |
| foreach(package_dep, invoker.package_deps) { |
| package_dep_target = package_dep[0] |
| package_dep_name = package_dep[1] |
| |
| data_deps += [ package_dep_target ] |
| package_dep_path = rebase_path( |
| get_label_info(package_dep_target, "target_gen_dir") + "/" + |
| package_dep_name + "/" + package_dep_name + ".far", |
| root_build_dir) |
| package_paths += [ package_dep_path ] |
| } |
| } |
| executable_args = [] |
| foreach(package_path, package_paths) { |
| executable_args += [ |
| "--package", |
| "@WrappedPath(${package_path})", |
| ] |
| |
| if (default_fuchsia_build_dir_for_installation != "") { |
| executable_args += [ |
| "--fuchsia-out-dir", |
| default_fuchsia_build_dir_for_installation, |
| ] |
| } |
| } |
| } |
| |
| group(target_name) { |
| deps = [ ":${_generate_installer_target}" ] |
| |
| if (!defined(invoker.install_only) || invoker.install_only == false) { |
| deps += [ ":${_generate_runner_target}" ] |
| } |
| } |
| } |