# 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")

# 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") {
#   executable_path = "bin/rot13_encoder_decoder_test"
#   deps = [ ":rot13_encoder_decoder_test" ]
# }
#
# executable("rot13_decoder_test") {
#   sources = [ "rot13_decoder_test.cc" ]
#   testonly = true
# }
#
# fuchsia_unittest_component("rot13-decoder-test") {
#   executable_path = "bin/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 (required if `executable_path` is not specified)
#     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
#
#   executable_path (required if `manifest` is not specified)
#     Specify the packaged path of the test executable.
#     Example: "test/my_executable"
#     This executable must be generated by one of the `deps`.
#     This is used in generating the manifest.
#     Type: string
#
#   executable_args (ignored if `manifest` is specified)
#     Specify the args to be passed to test executable.
#     Example: ["--foo", "bar"]
#     This is used in generating the manifest.
#     Type: list of string
#
#   component_name (optional)
#     The name of the component.
#     Type: string
#     Default: target_name
#
#   v2_test_runner (optional)
#     If specified and no manifest is specified, a trivial Components v2
#     manifest will be generated using the specified test runner. The
#     generated manifest will include temporary storage at /tmp but no other
#     special capabilities. Typical values: "rust_test_runner",
#     "gtest_runner" or "go_test_runner".
#     Type: string
#
#   deps
#   visibility
template("fuchsia_unittest_component") {
  if (defined(invoker.manifest)) {
    assert(
        !defined(invoker.executable_path),
        "Either `manifest` or `executable_path` must be specified when calling fuchsia_unittest_component($target_name)")
    assert(
        !defined(invoker.executable_args),
        "Specifying `executable_args` has no effect when specifying `manifest` when calling fuchsia_unittest_component($target_name)")
  } else {
    generated_target = "${target_name}_generated_manifest"
    generated_file(generated_target) {
      program_stanza = {
        binary = invoker.executable_path
        if (defined(invoker.executable_args)) {
          args = invoker.executable_args
        }
      }
      if (defined(invoker.v2_test_runner)) {
        contents = {
          include = [ "sdk/lib/diagnostics/syslog/client.shard.cml" ]
          program = program_stanza
          capabilities = [
            {
              protocol = "fuchsia.test.Suite"
            },
          ]
          use = [
            {
              runner = invoker.v2_test_runner
            },
            {
              storage = "temp"
              path = "/tmp"
            },
          ]
          expose = [
            {
              protocol = "fuchsia.test.Suite"
              from = "self"
            },
          ]
        }
        outputs = [ "$target_out_dir/${generated_target}.cml" ]
      } else {
        contents = {
          include = [ "sdk/lib/diagnostics/syslog/client.shard.cmx" ]
          program = program_stanza
        }
        outputs = [ "$target_out_dir/${generated_target}.cmx" ]
      }
      output_conversion = "json"
      testonly = true
      visibility = [ ":*" ]
    }

    manifest = get_target_outputs(":$generated_target")
    manifest = manifest[0]
  }

  fuchsia_component(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "manifest",
                             "visibility",
                           ])
    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" ]
    }
  }
}
