# 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 = "" # Sets the Fuchsia device node name which will be used by default by the # generated runner scripts. If not specficed, then no default node name will # be used. default_fuchsia_device_node_name = "" # 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}/ffx", "//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/fuchsia-sdk/sdk/tools/${test_host_cpu}/fvdl", "//third_party/qemu-${host_os}-${test_host_cpu}/", "${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_run_test_component) && invoker.use_run_test_component) { executable_args += [ "--use-run-test-component" ] } 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, ] } if (default_fuchsia_device_node_name != "") { executable_args += [ "--node-name", default_fuchsia_device_node_name, ] } } # Produces a script which installs a package and its dependencies into the # package repository of a pre-existing Fuchsia build directory. generate_wrapper(_generate_installer_target) { executable = rebase_path("//build/fuchsia/deploy_to_pkg_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}" ] } } }