1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117 |
- # Copyright 2015 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.
- # ==============================================================================
- # TEST SETUP
- # ==============================================================================
- import("//build/config/chromeos/args.gni")
- import("//build/config/chromeos/ui_mode.gni")
- import("//build/config/devtools.gni")
- import("//build/config/gclient_args.gni")
- import("//build/config/rts.gni")
- import("//build/rust/mixed_executable.gni")
- import("//build/rust/mixed_shared_library.gni")
- import("//build_overrides/build.gni")
- declare_args() {
- # Some component repos (e.g. ANGLE) import //testing but do not have
- # "location_tags.json", and so we don't want to try and upload the tags
- # for their tests.
- # And, some build configs may simply turn off generation altogether.
- tests_have_location_tags = generate_location_tags
- }
- # On Fuchsia, the test executable has a suffix and is a dependency of the
- # common |target_name| target. For `visibility`, the executable must be
- # specified. Cross-platform targets that include `test` targets in their
- # visibility lists, add `${exec_target_suffix}` immediately after the test
- # target name. This is not necessary when the target is a `source_set`.
- if (is_fuchsia) {
- exec_target_suffix = "__exec"
- } else {
- exec_target_suffix = ""
- }
- if (is_android) {
- import("//build/config/android/config.gni")
- import("//build/config/android/create_unwind_table.gni")
- import("//build/config/android/extract_unwind_tables.gni")
- import("//build/config/android/rules.gni")
- import("//build/config/sanitizers/sanitizers.gni")
- } else if (is_fuchsia) {
- import("//build/config/chromecast_build.gni")
- import("//build/config/fuchsia/generate_runner_scripts.gni")
- import("//build/config/fuchsia/package.gni")
- import("//third_party/fuchsia-sdk/sdk/build/cmc.gni")
- } else if (is_chromeos && is_chromeos_device) {
- import("//build/config/chromeos/rules.gni")
- import("//build/config/sanitizers/sanitizers.gni")
- import("//build/util/generate_wrapper.gni")
- } else if (is_ios) {
- import("//build/config/ios/ios_sdk.gni")
- import("//build/config/ios/ios_test_runner_wrapper.gni")
- import("//build/config/ios/rules.gni")
- } else {
- import("//build/config/sanitizers/sanitizers.gni")
- import("//build/util/generate_wrapper.gni")
- }
- template("mixed_test") {
- assert(defined(invoker.target_type) && invoker.target_type != "")
- target("mixed_${invoker.target_type}", target_name) {
- forward_variables_from(invoker,
- "*",
- TESTONLY_AND_VISIBILITY + [ "target_type" ])
- forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
- if (!defined(rs_configs)) {
- rs_configs = []
- }
- rs_configs += [ "//build/rust:test" ]
- # The crate_root is generated and should not be specified.
- assert(!defined(rs_crate_root))
- rs_generate_crate_root = true
- # We could automatically add `rs_deps += [ "//testing/rust_gtest_interop" ]`
- # if `rs_sources` is non-empty. But we don't automatically provide
- # //testing/gtest either so it would be asymmetric and could break in that
- # case. So, we act instead as if //testing/rust_gtest_interop is part of the
- # //testing/gtest dependency. If you add one, and have `rs_sources` listed,
- # you get both.
- _gtest_is_in_deps = false
- if (defined(rs_sources) && rs_sources != [] && defined(deps) &&
- deps != []) {
- foreach(dep, deps) {
- if (dep == "//testing/gtest") {
- _gtest_is_in_deps = true
- }
- }
- }
- if (_gtest_is_in_deps) {
- if (!defined(rs_deps)) {
- rs_deps = []
- }
- rs_deps += [ "//testing/rust_gtest_interop" ]
- }
- }
- }
- # Define a test as an executable (or apk on Android) with the "testonly" flag
- # set.
- # Variable:
- # use_xvfb: (optional) whether to run the executable under Xvfb.
- # use_raw_android_executable: Use mixed_executable() rather than
- # android_apk().
- # use_native_activity: Test implements ANativeActivity_onCreate().
- # use_cfv2: (Fuchsia, optional): build the test as a framework v2 component;
- # see https://fuchsia.dev/fuchsia-src/concepts/components/v2 for details.
- # The default value is true; set it to false explicitly to omit a .cm
- # manifest from the package.
- # use_cfv1: (Fuchsia, optional): build the test as a framework v1 component.
- # The default value is true; set it to false explicitly to omit a .cmx
- # manifest from the package.
- # test_runner_shard: (Fuchsia, optional): for CFv2 tests, use the given test
- # runner shard rather than the default shard for the ELF runner. This is
- # useful, for example, to use the elf_test_ambient_exec_runner for tests
- # that require job_policy_ambient_mark_vmo_exec.
- # is_xctest: (iOS, optional) whether to build the executable as XCTest.
- # Similar to the GN arg 'enable_run_ios_unittests_with_xctest' but
- # for build targets.
- # allow_cleartext_traffic: (Android, optional) whether to allow cleartext
- # network requests during the test.
- template("test") {
- # Ensures the rts file exists and if not, creates a dummy file
- if (use_rts) {
- action("${target_name}__rts_filters") {
- script = "//build/add_rts_filters.py"
- rts_file = "${root_build_dir}/gen/rts/${invoker.target_name}.filter"
- inverted_rts_file =
- "${root_build_dir}/gen/rts/${invoker.target_name}_inverted.filter"
- args = [
- rebase_path(rts_file, root_build_dir),
- rebase_path(inverted_rts_file, root_build_dir),
- ]
- outputs = [
- rts_file,
- inverted_rts_file,
- ]
- }
- }
- testonly = true
- if (!is_ios) {
- assert(!defined(invoker.is_xctest) || !invoker.is_xctest,
- "is_xctest can be set only for iOS builds")
- }
- if (!is_android) {
- assert(!defined(invoker.allow_cleartext_traffic),
- "allow_cleartext_traffic can be set only for Android tests")
- }
- if (is_android) {
- assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
- _use_default_launcher =
- !defined(invoker.use_default_launcher) || invoker.use_default_launcher
- if (!defined(invoker.use_raw_android_executable)) {
- # Checkouts where build_with_chromium == false often have a custom GN
- # template wrapper around test() which sets use_default_launcher == false.
- # Set the _use_raw_android_executable default so that test() targets which
- # do not use the custom wrapper
- # (1) Do not cause "gn gen" to fail
- # (2) Do not need to be moved into if(build_with_chromium) block.
- _use_raw_android_executable =
- !build_with_chromium && _use_default_launcher
- } else {
- not_needed([ "_use_default_launcher" ])
- _use_raw_android_executable = invoker.use_raw_android_executable
- }
- # output_name is used to allow targets with the same name but in different
- # packages to still produce unique runner scripts.
- _output_name = invoker.target_name
- if (defined(invoker.output_name)) {
- _output_name = invoker.output_name
- }
- _test_runner_target = "${_output_name}__test_runner_script"
- _wrapper_script_vars = [
- "android_test_runner_script",
- "ignore_all_data_deps",
- "shard_timeout",
- ]
- assert(_use_raw_android_executable || enable_java_templates)
- if (_use_raw_android_executable) {
- not_needed(invoker, [ "add_unwind_tables_in_apk" ])
- _exec_target = "${target_name}__exec"
- _dist_target = "${target_name}__dist"
- _exec_output =
- "$target_out_dir/${invoker.target_name}/${invoker.target_name}"
- mixed_test(_exec_target) {
- target_type = "executable"
- # Configs will always be defined since we set_defaults in
- # BUILDCONFIG.gn.
- configs = []
- forward_variables_from(
- invoker,
- "*",
- TESTONLY_AND_VISIBILITY + _wrapper_script_vars + [
- "data_deps",
- "extra_dist_files",
- ])
- # Thanks to the set_defaults() for test(), configs are initialized with
- # the default shared_library configs rather than executable configs.
- configs -= [
- "//build/config:shared_library_config",
- "//build/config/android:hide_all_but_jni",
- ]
- configs += [ "//build/config:executable_config" ]
- if (defined(invoker.data_deps)) {
- data_deps = invoker.data_deps
- } else {
- data_deps = []
- }
- if (!defined(data)) {
- data = []
- }
- if (tests_have_location_tags) {
- data += [ "//testing/location_tags.json" ]
- }
- # Don't output to the root or else conflict with the group() below.
- output_name = rebase_path(_exec_output, root_out_dir)
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- create_native_executable_dist(_dist_target) {
- dist_dir = "$root_out_dir/$target_name"
- binary = _exec_output
- deps = [ ":$_exec_target" ]
- if (defined(invoker.extra_dist_files)) {
- extra_files = invoker.extra_dist_files
- }
- if (use_rts) {
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- } else {
- _library_target = "${target_name}__library"
- _library_crate_name = "${target_name}_library"
- _apk_target = "${target_name}__apk"
- _apk_specific_vars = [
- "allow_cleartext_traffic",
- "android_manifest",
- "android_manifest_dep",
- "android_manifest_template",
- "app_as_shared_lib",
- "enable_multidex",
- "generate_final_jni",
- "product_config_java_packages",
- "loadable_modules",
- "loadable_module_deps",
- "min_sdk_version",
- "proguard_configs",
- "proguard_enabled",
- "srcjar_deps",
- "target_sdk_version",
- "use_default_launcher",
- "use_native_activity",
- ]
- # Adds the unwind tables from unstripped binary as an asset file in the
- # apk, if |add_unwind_tables_in_apk| is specified by the test.
- if (defined(invoker.add_unwind_tables_in_apk) &&
- invoker.add_unwind_tables_in_apk) {
- if (use_android_unwinder_v2) {
- _unwind_table_asset_v2_name = "${target_name}_v2_unwind_assets"
- unwind_table_asset_v2(_unwind_table_asset_v2_name) {
- library_target = _library_target
- deps = [ ":$_library_target" ]
- }
- }
- # TODO(crbug.com/1315603): Remove generation of v1 unwind asset when
- # `CFIBacktraceAndroid` is replaced with `ChromeUnwinderAndroidV2`.
- _unwind_table_asset_name = "${target_name}_unwind_assets"
- unwind_table_asset(_unwind_table_asset_name) {
- library_target = _library_target
- deps = [ ":$_library_target" ]
- }
- }
- mixed_test(_library_target) {
- target_type = "shared_library"
- # Configs will always be defined since we set_defaults in
- # BUILDCONFIG.gn.
- configs = [] # Prevent list overwriting warning.
- configs = invoker.configs
- # Use a crate name that avoids creating a warning due to double
- # underscore (ie. `__`).
- rs_crate_name = _library_crate_name
- forward_variables_from(
- invoker,
- "*",
- [ "deps" ] + _apk_specific_vars + _wrapper_script_vars +
- TESTONLY_AND_VISIBILITY)
- # Native targets do not need to depend on java targets. Filter them out
- # so that the shared library can be built without needing to wait for
- # dependent java targets.
- deps = []
- if (defined(invoker.deps)) {
- foreach(_dep, invoker.deps) {
- _target_label = get_label_info(_dep, "label_no_toolchain")
- if (filter_exclude([ _target_label ], java_target_patterns) != []) {
- deps += [ _dep ]
- }
- }
- }
- if (_use_default_launcher) {
- deps += [ "//testing/android/native_test:native_test_native_code" ]
- }
- }
- unittest_apk(_apk_target) {
- forward_variables_from(invoker, _apk_specific_vars)
- shared_library = ":$_library_target"
- apk_name = invoker.target_name
- if (defined(invoker.output_name)) {
- apk_name = invoker.output_name
- install_script_name = "install_${invoker.output_name}"
- }
- if (defined(invoker.deps)) {
- deps = invoker.deps
- } else {
- deps = []
- }
- if (defined(loadable_module_deps)) {
- deps += loadable_module_deps
- }
- # Add the Java classes so that each target does not have to do it.
- if (_use_default_launcher) {
- deps += [ "//base/test:test_support_java" ]
- }
- if (defined(_unwind_table_asset_name)) {
- deps += [ ":${_unwind_table_asset_name}" ]
- }
- if (defined(_unwind_table_asset_v2_name)) {
- deps += [ ":${_unwind_table_asset_v2_name}" ]
- }
- if (use_rts) {
- data_deps = [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- }
- test_runner_script(_test_runner_target) {
- forward_variables_from(invoker, _wrapper_script_vars)
- if (_use_raw_android_executable) {
- executable_dist_dir = "$root_out_dir/$_dist_target"
- data_deps = [ ":$_exec_target" ]
- } else {
- apk_target = ":$_apk_target"
- incremental_apk = incremental_install
- # Dep needed for the test runner .runtime_deps file to pick up data
- # deps from the forward_variables_from(invoker, "*") on the library.
- data_deps = [ ":$_library_target" ]
- }
- test_name = _output_name
- test_suite = _output_name
- test_type = "gtest"
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- # Create a wrapper script rather than using a group() in order to ensure
- # "ninja $target_name" always works. If this was a group(), then GN would
- # not create a top-level alias for it if a target exists in another
- # directory with the same $target_name.
- # Also - bots run this script directly for "components_perftests".
- generate_wrapper(target_name) {
- forward_variables_from(invoker, [ "visibility" ])
- executable = "$root_build_dir/bin/run_$_output_name"
- wrapper_script = "$root_build_dir/$_output_name"
- deps = [ ":$_test_runner_target" ]
- if (_use_raw_android_executable) {
- deps += [ ":$_dist_target" ]
- } else {
- # Dep needed for the swarming .isolate file to pick up data
- # deps from the forward_variables_from(invoker, "*") on the library.
- deps += [
- ":$_apk_target",
- ":$_library_target",
- ]
- }
- if (defined(invoker.data_deps)) {
- data_deps = invoker.data_deps
- } else {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- if (tests_have_location_tags) {
- data = [ "//testing/location_tags.json" ]
- }
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- } else if (is_fuchsia) {
- assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
- # It's meaningless to omit both types of manifest from the package.
- assert(!defined(invoker.use_cfv2) || invoker.use_cfv2 ||
- !defined(invoker.use_cfv1) || invoker.use_cfv1)
- _output_name = invoker.target_name
- _pkg_target = "${_output_name}_pkg"
- _exec_target = "${_output_name}__exec"
- _program_name = get_label_info(":${_exec_target}", "name")
- _test_component_targets = []
- # Generate a CFv2 manifest unless the target opts-out via `use_cfv2=false`.
- if (!defined(invoker.use_cfv2) || invoker.use_cfv2) {
- # Generate a CML fragment that provides the program name.
- _test_program_fragment_target = "${target_name}_program-fragment"
- _test_program_fragment =
- "${target_out_dir}/${target_name}_program.test-cml"
- generated_file(_test_program_fragment_target) {
- contents = {
- program = {
- binary = _program_name
- }
- }
- outputs = [ _test_program_fragment ]
- output_conversion = "json"
- }
- _test_runner_shard =
- "//build/config/fuchsia/test/elf_test_runner.shard.test-cml"
- if (defined(invoker.test_runner_shard)) {
- _test_runner_shard = invoker.test_runner_shard
- }
- # Collate the complete set of elements to include in the test component's
- # manifest.
- _manifest_fragments = [
- "//build/config/fuchsia/test/chromium_test_facet.shard.test-cml",
- "//build/config/fuchsia/test/minimum.shard.test-cml",
- _test_program_fragment,
- _test_runner_shard,
- ]
- _test_component_manifest = "${target_out_dir}/${target_name}.cml"
- _merged_manifest_name = "${_output_name}.cml"
- if (defined(invoker.additional_manifest_fragments)) {
- _manifest_fragments +=
- filter_include(invoker.additional_manifest_fragments,
- [
- "*.cml",
- "*.test-cml",
- ])
- }
- # Generate the test component manifest from the specified elements.
- _test_component_manifest_target = "${target_name}_component-manifest"
- cmc_merge(_test_component_manifest_target) {
- sources = _manifest_fragments
- output_name = "${_merged_manifest_name}"
- deps = [ ":${_test_program_fragment_target}" ]
- }
- # Define the test component, dependent on the generated manifest, and the
- # test executable target.
- _test_component_target = "${target_name}_component"
- fuchsia_component(_test_component_target) {
- deps = [ ":$_test_component_manifest_target" ]
- data_deps = [ ":$_exec_target" ]
- manifest = _test_component_manifest
- visibility = [ ":*" ]
- }
- _test_component_targets += [ ":${_test_component_target}" ]
- }
- # Generate a CFv1 manifest unless the target opts-out via `use_cfv1=false`.
- if (!defined(invoker.use_cfv1) || invoker.use_cfv1) {
- # Generate a CMX fragment that provides the program name.
- _test_program_fragment_target_v1 = "${target_name}_program-fragment_v1"
- _test_program_fragment_v1 =
- "${target_out_dir}/${target_name}_program.test-cmx"
- generated_file(_test_program_fragment_target_v1) {
- contents = "{ \"program\": { \"binary\": \"${_program_name}\"}}"
- outputs = [ _test_program_fragment_v1 ]
- }
- # Collate the complete set of elements to include in the test component's
- # manifest.
- _manifest_fragments_v1 = [
- "//build/config/fuchsia/test/minimum_capabilities.test-cmx",
- _test_program_fragment_v1,
- ]
- _test_component_manifest_v1 = "${target_out_dir}/${target_name}.cmx"
- _merged_manifest_name_v1 = "${_output_name}.cmx"
- if (defined(invoker.additional_manifest_fragments)) {
- _manifest_fragments_v1 +=
- filter_include(invoker.additional_manifest_fragments,
- [
- "*.cmx",
- "*.test-cmx",
- ])
- }
- # Generate the test component manifest from the specified elements.
- _test_component_manifest_target_v1 =
- "${target_name}_component-manifest_v1"
- cmc_merge(_test_component_manifest_target_v1) {
- sources = _manifest_fragments_v1
- output_name = "${_merged_manifest_name_v1}"
- deps = [ ":${_test_program_fragment_target_v1}" ]
- }
- # Define the test component, dependent on the generated manifest, and the
- # test executable target.
- _test_component_target_v1 = "${target_name}_component_v1"
- fuchsia_component(_test_component_target_v1) {
- deps = [ ":$_test_component_manifest_target_v1" ]
- data_deps = [ ":$_exec_target" ]
- manifest = _test_component_manifest_v1
- visibility = [ ":*" ]
- }
- _test_component_targets += [ ":${_test_component_target_v1}" ]
- }
- # Define components for each entry in |additional_manifests|, if any. Since
- # manifests may themselves depend-on the outputs of |deps|, these components
- # must each individually depend on |invoker.deps|.
- if (defined(invoker.additional_manifests)) {
- foreach(filename, invoker.additional_manifests) {
- _additional_component_target =
- target_name + "_" + get_path_info(filename, "name")
- _test_component_targets += [ ":${_additional_component_target}" ]
- fuchsia_component(_additional_component_target) {
- forward_variables_from(invoker, [ "testonly" ])
- data_deps = [ ":$_exec_target" ]
- visibility = [ ":*" ]
- manifest = filename
- # Depend on |invoker.deps|, in case it includes a dependency that
- # creates this additional component's manifest.
- if (defined(invoker.deps)) {
- deps = invoker.deps
- }
- }
- }
- }
- # Define the package target that will bundle the test and additional
- # components and their data.
- fuchsia_package(_pkg_target) {
- forward_variables_from(invoker,
- [
- "excluded_files",
- "excluded_dirs",
- ])
- package_name = _output_name
- deps = _test_component_targets
- if (!defined(excluded_dirs)) {
- excluded_dirs = []
- }
- if (devtools_root_location != "") {
- excluded_dirs += [ devtools_root_location ]
- }
- }
- # |target_name| refers to the package-runner rule, so that building
- # "base_unittests" will build not only the executable, component, and
- # package, but also the script required to run them.
- fuchsia_test_runner(target_name) {
- forward_variables_from(invoker,
- [
- "data",
- "data_deps",
- "package_deps",
- "use_cfv2",
- "use_test_server",
- ])
- is_test_exe = true
- package = ":$_pkg_target"
- package_name = _output_name
- if (!defined(deps)) {
- deps = []
- }
- if (defined(invoker.deps)) {
- deps += invoker.deps
- }
- if (!defined(data)) {
- data = []
- }
- if (tests_have_location_tags) {
- data += [ "//testing/location_tags.json" ]
- }
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- if (use_rts) {
- data_deps += [ ":${target_name}__rts_filters" ]
- }
- }
- mixed_test(_exec_target) {
- target_type = "executable"
- forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
- output_name = _exec_target
- }
- } else if (is_ios) {
- assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
- _runtime_deps_file = "$root_out_dir/${target_name}.runtime_deps"
- declare_args() {
- # Keep the unittest-as-xctest functionality defaulted to off until the
- # bots are updated to handle it properly.
- # TODO(crbug.com/1001667): Remove this arg once the iOS test runner
- # supports running unittests with xctest.
- enable_run_ios_unittests_with_xctest = false
- }
- _test_target = target_name
- _output_name = target_name
- if (defined(invoker.output_name)) {
- _output_name = invoker.output_name
- }
- _wrapper_output_name = "run_${target_name}"
- ios_test_runner_wrapper(_wrapper_output_name) {
- forward_variables_from(invoker,
- [
- "data",
- "deps",
- "executable_args",
- "output_name",
- "retries",
- "shards",
- ])
- _root_build_dir = rebase_path("${root_build_dir}", root_build_dir)
- if (!defined(executable_args)) {
- executable_args = []
- }
- executable_args += [
- "--app",
- "@WrappedPath(${_root_build_dir}/${_test_target}.app)",
- ]
- wrapper_output_name = "${_wrapper_output_name}"
- if (!defined(data)) {
- data = []
- }
- if (tests_have_location_tags) {
- data += [ "//testing/location_tags.json" ]
- }
- }
- _resources_bundle_data = target_name + "_resources_bundle_data"
- bundle_data(_resources_bundle_data) {
- visibility = [ ":$_test_target" ]
- sources = [ "//testing/gtest_ios/Default.png" ]
- outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
- }
- force_xctest = enable_run_ios_unittests_with_xctest ||
- (defined(invoker.is_xctest) && invoker.is_xctest)
- if (force_xctest) {
- ios_test_target_type = "ios_xctest_test"
- } else {
- ios_test_target_type = "ios_app_bundle"
- }
- target(ios_test_target_type, _test_target) {
- testonly = true
- if (force_xctest && build_with_chromium) {
- xctest_module_target = "//base/test:google_test_runner"
- }
- forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
- # Provide sensible defaults in case invoker did not define any of those
- # required variables.
- if (!defined(info_plist) && !defined(info_plist_target)) {
- info_plist = "//testing/gtest_ios/unittest-Info.plist"
- }
- if (ios_use_shared_bundle_id_for_test_apps) {
- bundle_identifier = shared_bundle_id_for_test_apps
- not_needed([ "_output_name" ])
- } else {
- bundle_identifier = "$ios_app_bundle_id_prefix.chrome." +
- string_replace(_output_name, "_", "-")
- }
- if (!defined(bundle_deps)) {
- bundle_deps = []
- }
- bundle_deps += [ ":$_resources_bundle_data" ]
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- # Include the generate_wrapper as part of data_deps
- data_deps += [ ":${_wrapper_output_name}" ]
- write_runtime_deps = _runtime_deps_file
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- } else if ((is_chromeos_ash || (is_chromeos_lacros && is_chromeos_device)) &&
- cros_board != "") {
- assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
- # Building for a cros board (ie: not linux-chromeos or linux-lacros).
- _gen_runner_target = "${target_name}__runner"
- _runtime_deps_file =
- "$root_out_dir/gen.runtime/" + get_label_info(target_name, "dir") +
- "/" + get_label_info(target_name, "name") + ".runtime_deps"
- _generated_script = "$root_build_dir/bin/run_" + invoker.target_name
- if (is_skylab) {
- generate_skylab_deps(_gen_runner_target) {
- generated_script = _generated_script
- test_exe = invoker.target_name
- }
- } else {
- generate_runner_script(_gen_runner_target) {
- generated_script = _generated_script
- test_exe = invoker.target_name
- runtime_deps_file = _runtime_deps_file
- if (is_chromeos_lacros) {
- # 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
- }
- if (tests_have_location_tags) {
- data = [ "//testing/location_tags.json" ]
- }
- if (use_rts) {
- data_deps = [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- }
- mixed_test(target_name) {
- target_type = "executable"
- forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
- forward_variables_from(invoker, [ "visibility" ])
- if (!defined(deps)) {
- deps = []
- }
- if (!defined(data)) {
- data = []
- }
- # We use a special trigger script for CrOS hardware tests.
- data += [ "//testing/trigger_scripts/chromeos_device_trigger.py" ]
- output_name = target_name
- write_runtime_deps = _runtime_deps_file
- data += [ _runtime_deps_file ]
- deps += [ ":$_gen_runner_target" ]
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- } else if (is_chromeos_lacros && !is_chromeos_device) {
- _runtime_deps_file = "$root_out_dir/${target_name}.runtime_deps"
- _executable = target_name
- _gen_runner_target = "${target_name}__runner"
- if (defined(invoker.use_xvfb)) {
- _use_xvfb = invoker.use_xvfb
- } else {
- _use_xvfb = false
- }
- # When use_xvfb is set by the invoker, it indicates that running this test
- # target requires a window, and in lacros build, ash-chrome serves as the
- # display server. Note that even though the tests themselves do not require
- # xvfb anymore, xvfb.py is still needed to invoke the lacros test runner
- # because ash-chrome is based on x11.
- _use_ash_chrome = _use_xvfb
- generate_wrapper(_gen_runner_target) {
- wrapper_script = "$root_build_dir/bin/run_" + _executable
- data = []
- data_deps = [ "//testing:test_scripts_shared" ]
- if (_use_xvfb) {
- executable = "//testing/xvfb.py"
- data += [ "//.vpython3" ]
- } else {
- executable = "//testing/test_env.py"
- }
- if (tests_have_location_tags) {
- data += [ "//testing/location_tags.json" ]
- }
- executable_args = [
- "@WrappedPath(../../build/lacros/test_runner.py)",
- "test",
- "@WrappedPath(./${_executable})",
- "--test-launcher-bot-mode",
- ]
- if (_use_ash_chrome) {
- executable_args += [ "--ash-chrome-path" ]
- # Can't use --ash-chrome-path=path because WrappedPath
- # won't be expanded for that usage.
- executable_args += [ "@WrappedPath(./ash_clang_x64/test_ash_chrome)" ]
- }
- if (is_asan) {
- executable_args += [ "--asan=true" ]
- }
- if (is_msan) {
- executable_args += [ "--msan=true" ]
- }
- if (is_tsan) {
- executable_args += [ "--tsan=true" ]
- }
- if (use_cfi_diag) {
- executable_args += [ "--cfi-diag=true" ]
- }
- data += [ "//build/lacros/test_runner.py" ]
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- mixed_test(target_name) {
- target_type = "executable"
- forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
- forward_variables_from(invoker, [ "visibility" ])
- if (!defined(deps)) {
- deps = []
- }
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- write_runtime_deps = _runtime_deps_file
- deps += [ ":$_gen_runner_target" ]
- if (_use_ash_chrome && also_build_ash_chrome) {
- data_deps += [ "//chrome/test:test_ash_chrome(//build/toolchain/linux:ash_clang_x64)" ]
- }
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- } else if (!is_nacl) {
- if (is_mac || is_win) {
- assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
- }
- _runtime_deps_file = "$root_out_dir/${target_name}.runtime_deps"
- _executable = target_name
- _gen_runner_target = "${target_name}__runner"
- if ((is_linux || is_chromeos) && defined(invoker.use_xvfb)) {
- _use_xvfb = invoker.use_xvfb
- } else {
- _use_xvfb = false
- }
- generate_wrapper(_gen_runner_target) {
- wrapper_script = "$root_build_dir/bin/run_" + _executable
- data = []
- data_deps = [ "//testing:test_scripts_shared" ]
- if (_use_xvfb) {
- executable = "//testing/xvfb.py"
- } else {
- executable = "//testing/test_env.py"
- }
- if (tests_have_location_tags) {
- data += [ "//testing/location_tags.json" ]
- }
- executable_args = [
- "@WrappedPath(./${_executable})",
- "--test-launcher-bot-mode",
- ]
- if (is_asan) {
- executable_args += [ "--asan=true" ]
- }
- if (is_msan) {
- executable_args += [ "--msan=true" ]
- }
- if (is_tsan) {
- executable_args += [ "--tsan=true" ]
- }
- if (use_cfi_diag) {
- executable_args += [ "--cfi-diag=true" ]
- }
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- mixed_test(target_name) {
- target_type = "executable"
- forward_variables_from(invoker,
- "*",
- TESTONLY_AND_VISIBILITY + [ "use_xvfb" ])
- forward_variables_from(invoker, [ "visibility" ])
- if (!defined(deps)) {
- deps = []
- }
- deps += [
- # Give tests the default manifest on Windows (a no-op elsewhere).
- "//build/win:default_exe_manifest",
- ]
- write_runtime_deps = _runtime_deps_file
- deps += [ ":$_gen_runner_target" ]
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- } else {
- # This is a catch-all clause for NaCl toolchains and other random
- # configurations that might define tests; test() in these configs
- # will just define the underlying executables.
- assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb,
- "use_xvfb should not be defined for a non-linux configuration")
- mixed_test(target_name) {
- target_type = "executable"
- forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
- forward_variables_from(invoker, [ "visibility" ])
- if (!defined(deps)) {
- deps = []
- }
- if (!defined(data_deps)) {
- data_deps = []
- }
- data_deps += [ "//testing:test_scripts_shared" ]
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- }
- }
- # Defines a type of test that invokes a script to run, rather than
- # invoking an executable.
- #
- # The script must implement the
- # [test executable API](//docs/testing/test_executable_api.md).
- #
- # The template must be passed the `script` parameter, which specifies
- # the path to the script to run. It may optionally be passed a
- # `script_args` parameter, which can be used to include a list of
- # args to be specified by default. The template will produce
- # a `$root_build_dir/run_$target_name` wrapper and write the runtime_deps
- # for the target to $root_build_dir/${target_name}.runtime_deps, as per
- # the conventions listed in the
- # [test wrapper API](//docs/testing/test_wrapper_api.md).
- template("script_test") {
- if (use_rts) {
- action("${target_name}__rts_filters") {
- script = "//build/add_rts_filters.py"
- rts_file = "${root_build_dir}/gen/rts/${invoker.target_name}.filter"
- inverted_rts_file =
- "${root_build_dir}/gen/rts/${invoker.target_name}_inverted.filter"
- args = [
- rebase_path(rts_file, root_build_dir),
- rebase_path(inverted_rts_file, root_build_dir),
- ]
- outputs = [
- rts_file,
- inverted_rts_file,
- ]
- }
- }
- generate_wrapper(target_name) {
- testonly = true
- wrapper_script = "${root_build_dir}/bin/run_${target_name}"
- executable = "//testing/test_env.py"
- executable_args =
- [ "@WrappedPath(" + rebase_path(invoker.script, root_build_dir) + ")" ]
- if (defined(invoker.args)) {
- executable_args += invoker.args
- }
- data = [ invoker.script ]
- if (defined(invoker.data)) {
- data += invoker.data
- }
- if (tests_have_location_tags) {
- data += [ "//testing/location_tags.json" ]
- }
- data_deps = [ "//testing:test_scripts_shared" ]
- if (defined(invoker.data_deps)) {
- data_deps += invoker.data_deps
- }
- forward_variables_from(invoker,
- [ "*" ],
- TESTONLY_AND_VISIBILITY + [
- "data",
- "data_deps",
- "script",
- "script_args",
- ])
- forward_variables_from(invoker, [ "visibility" ])
- write_runtime_deps = "${root_build_dir}/${target_name}.runtime_deps"
- if (use_rts) {
- data_deps += [ ":${invoker.target_name}__rts_filters" ]
- }
- }
- }
- # Test defaults.
- set_defaults("test") {
- if (is_android) {
- configs = default_shared_library_configs
- configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
- configs += [ "//build/config/android:hide_all_but_jni" ]
- } else {
- configs = default_executable_configs
- if (is_mac) {
- # TODO(lgrey): Maybe restore this.
- # Don't strip tests for visibility into test crashes/hangs.
- # https://bugs.chromium.org/p/chromium/issues/detail?id=1244047#c49
- configs -= [ "//build/config/mac:strip_all" ]
- }
- }
- }
|