| # 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("fuchsia_component.gni") | 
 | import("fuchsia_test_component_manifest.gni") | 
 |  | 
 | # Defines a component that launches a test. | 
 | # See: https://fuchsia.dev/fuchsia-src/development/components/build | 
 | # | 
 | # This template is a useful shortcut for defining classic unit tests for target | 
 | # devices, but (unlike fuchsia_unittest_package) where you have multiple test | 
 | # targets and want to bundle them in a single test package. | 
 | # Pure unit tests don't require any special capabilities, so their component | 
 | # manifest can be generated by the template if a manifest is not specified. | 
 | # | 
 | # Example: | 
 | # ``` | 
 | # executable("rot13_encoder_test") { | 
 | #   sources = [ "rot13_encoder_test.cc" ] | 
 | #   testonly = true | 
 | # } | 
 | # | 
 | # fuchsia_unittest_component("rot13-encoder-test") { | 
 | #   deps = [ ":rot13_encoder_decoder_test" ] | 
 | # } | 
 | # | 
 | # executable("rot13_decoder_test") { | 
 | #   sources = [ "rot13_decoder_test.cc" ] | 
 | #   testonly = true | 
 | # } | 
 | # | 
 | # fuchsia_unittest_component("rot13-decoder-test") { | 
 | #   deps = [ ":rot13_decoder_test" ] | 
 | # } | 
 | # | 
 | # fuchsia_test_package("rot13-tests") { | 
 | #   test_components = [ | 
 | #     ":rot13-encoder-test", | 
 | #     ":rot13-decoder-test", | 
 | #   ] | 
 | # } | 
 | # ``` | 
 | # | 
 | # The above will generate a manifest for each test and include both components in a single package, | 
 | # which can be run with the launch URLs: | 
 | # fuchsia-pkg://fuchsia.com/rot13-tests#meta/rot13-encoder-test.cmx | 
 | # fuchsia-pkg://fuchsia.com/rot13-tests#meta/rot13-decoder-test.cmx | 
 | # | 
 | # Parameters | 
 | # | 
 | #   manifest (optional) | 
 | #     Specify a component manifest for the test. | 
 | #     If a manifest is not specified, a trivial manifest will be generated. | 
 | #     The generated manifest requests no special capabilities, which is good | 
 | #     enough for "pure" unit tests. | 
 | #     To view the generated manifest, see: | 
 | #     `fx gn outputs out/default path/to/your:<target_name>_generated_manifest` | 
 | #     Type: path | 
 | # | 
 | #   component_name (optional) | 
 | #     The name of the component. | 
 | #     Type: string | 
 | #     Default: target_name | 
 | # | 
 | #   v2 (optional) | 
 | #     If specified and set to false, will generate a CFv1 (.cmx) manifest. | 
 | #     If `manifest` is specified then this is ignored. | 
 | #     Type: boolean | 
 | # | 
 | #   unstable_features (optional) | 
 | #     The set of unstable CML features to allow. Only applicable to v2 components. | 
 | #     The set of features is allowlisted here: //tools/cmc/build/unstable_features/BUILD.gn | 
 | #     where each feature name is represented by a group of the same name. | 
 | #     Type: list of strings | 
 | #     Default: [] | 
 | # | 
 | #   deprecated_legacy_test_execution (optional) | 
 | #     If set for a v2 test, the test will be forced to use ELF runner, | 
 | #     which sacrifices isolation for higher performance. | 
 | #     Type: boolean | 
 | # | 
 | #   deps | 
 | #   visibility | 
 | template("fuchsia_unittest_component") { | 
 |   assert( | 
 |       !(defined(invoker.deprecated_legacy_test_execution) && | 
 |             invoker.deprecated_legacy_test_execution && | 
 |             (defined(invoker.manifest) || (defined(invoker.v2) && !invoker.v2))), | 
 |       "cannot specify both deprecated_legacy_test_execution with either v2 = false or an explicit manifest") | 
 |   if (!defined(invoker.manifest)) { | 
 |     generated_target = "${target_name}_generated_manifest" | 
 |     fuchsia_test_component_manifest(generated_target) { | 
 |       forward_variables_from(invoker, | 
 |                              [ | 
 |                                "deps", | 
 |                                "v2", | 
 |                              ]) | 
 |       visibility = [ ":*" ] | 
 |     } | 
 |     manifest = get_target_outputs(":$generated_target") | 
 |     manifest = manifest[0] | 
 |   } | 
 |  | 
 |   fuchsia_component(target_name) { | 
 |     forward_variables_from(invoker, | 
 |                            [ | 
 |                              "deps", | 
 |                              "manifest", | 
 |                              "unstable_features", | 
 |                              "visibility", | 
 |                            ]) | 
 |     if (defined(invoker.deprecated_legacy_test_execution) && | 
 |         invoker.deprecated_legacy_test_execution) { | 
 |       experimental_force_runner = "elf_test_runner" | 
 |     } | 
 |     component_name = target_name | 
 |     if (defined(invoker.component_name)) { | 
 |       component_name = invoker.component_name | 
 |     } | 
 |     testonly = true | 
 |  | 
 |     if (defined(generated_target)) { | 
 |       if (!defined(deps)) { | 
 |         deps = [] | 
 |       } | 
 |       deps += [ ":$generated_target" ] | 
 |     } | 
 |   } | 
 | } |