|  | # Copyright 2020 The Fuchsia 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/testing/host_test_data.gni") | 
|  | import("//build/testing/test_spec.gni") | 
|  |  | 
|  | # Declares a host test. | 
|  | # | 
|  | # Since the testing infrastructure doesn't handle tests with arguments, this | 
|  | # template will generate a script that encapsulates the arguments and build the | 
|  | # relevant test_spec target. This can be used to build data driven tests by | 
|  | # invoking a host tool with a test specification. | 
|  | # | 
|  | # Note: The tool and any data dependencies it has (including files referred to | 
|  | # by the arguments) MUST be declared by using the host_test_data template. | 
|  | # | 
|  | # Parameters | 
|  | # | 
|  | #   binary_path (required) | 
|  | #     [path]: Path to the binary the test should invoke. | 
|  | # | 
|  | #   args (optional) | 
|  | #     [list of strings]: Arguments to pass to the tool. | 
|  | # | 
|  | #   target (optional) | 
|  | #     [label]: The test target. Defaults to target_name. | 
|  | # | 
|  | #   deps, environments, data_deps, public_deps, visibility | 
|  | #     Forwarded from invoker. | 
|  | # | 
|  | template("host_test") { | 
|  | assert(defined(invoker.binary_path), "Requires a binary_path") | 
|  |  | 
|  | _test_path = invoker.binary_path | 
|  |  | 
|  | if (defined(invoker.args)) { | 
|  | _test_data_target = "${target_name}_script_data" | 
|  | _script_file = "${target_out_dir}/${target_name}.sh" | 
|  | _test_path = _script_file | 
|  | _test_script_target = "${target_name}_script" | 
|  |  | 
|  | host_test_data(_test_data_target) { | 
|  | sources = [ | 
|  | _script_file, | 
|  | invoker.binary_path, | 
|  | ] | 
|  | visibility = [ ":*" ] | 
|  | } | 
|  |  | 
|  | action(_test_script_target) { | 
|  | testonly = true | 
|  | script = "//build/testing/create_test.sh" | 
|  | args = [ | 
|  | rebase_path(_script_file, root_build_dir), | 
|  | rebase_path(invoker.binary_path, root_build_dir), | 
|  | ] | 
|  | args += invoker.args | 
|  | outputs = [ "${_script_file}" ] | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | # The infra currently uses ninja to build host tests, specifying the | 
|  | # test_spec.path field as the target. Thus we have to ensure that | 
|  | # this target has all the dependencies neede to actually build the test. | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "data_deps", | 
|  | "deps", | 
|  | "public_deps", | 
|  | ]) | 
|  | deps += [ ":${_test_data_target}" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | test_spec(target_name) { | 
|  | if (defined(invoker.target)) { | 
|  | target = "${invoker.target}" | 
|  | } else { | 
|  | target = "${target_name}" | 
|  | } | 
|  | path = _test_path | 
|  |  | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "environments", | 
|  | "visibility", | 
|  | ]) | 
|  |  | 
|  | # If we have args, we put most deps on the script target, | 
|  | # and here just depend on that. | 
|  | if (defined(invoker.args)) { | 
|  | deps = [ ":${_test_script_target}" ] | 
|  | } else { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "data_deps", | 
|  | "deps", | 
|  | "public_deps", | 
|  | ]) | 
|  | } | 
|  | } | 
|  | } |