# 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/components.gni")

# Defines a Fuchsia component for a fuzzer test.
# See: https://fuchsia.dev/fuchsia-src/development/components/build
#
# This template extends `fuchsia_component` by automatically generating a fuzzer test manifest to
# act as the component manifest. These tests are generated for each accompanying fuzzer. Unlike the
# fuzzers, they loop over only a small, fixed set of inputs.
#
# See also the closely related `fuzzer_component` template in //build/fuzzing/fuzzer_component.gni.
#
# Parameters:
#
#   fuzzer (required)
#     [string] The name of the fuzzer being tested.
#
#   label (required)
#     [label] The GN label of the associated fuzzer.
#
#   deps (required)
#     [list of labels] Same meaning as for `fuchsia_component`, but required. This typically
#       includes the fuzzer test binary. It should also include the fuzzer corpus, when present.
#
#   corpus (optional)
#     [label] If present, includes program arguments in the component manifest
#       to use the corpus when testing.
#
template("fuzzer_test_component") {
  if (current_toolchain == default_toolchain) {
    assert(defined(invoker.fuzzer),
           "missing 'fuzzer' for fuzzer_test_component($target_name)")
    assert(defined(invoker.label),
           "missing 'label' for fuzzer_test_component($target_name)")
    assert(defined(invoker.deps),
           "missing 'deps' for fuzzer_test_component($target_name)")
    fuzzer_test = "${invoker.fuzzer}_test"

    meta_target_name = "${target_name}_metadata"

    fuchsia_unittest_component(target_name) {
      forward_variables_from(invoker, [ "visibility" ])
      component_name = fuzzer_test
      deps = invoker.deps + [ ":$meta_target_name" ]
    }

    group(meta_target_name) {
      testonly = true
      deps = invoker.deps + [ "//build/fuzzing:includes_cml" ]
      metadata = {
        test_component_manifest_cml = [
          {
            forward_variables_from(invoker, [ "include" ])
            program = {
              args = [ "-q" ]
              if (defined(invoker.corpus)) {
                corpus_path = get_label_info(invoker.corpus, "dir")
                corpus_name = get_label_info(invoker.corpus, "name")
                if (corpus_name != get_path_info(corpus_path, "file")) {
                  corpus_path += "/" + corpus_name
                }
                args += [ "pkg/data/" + rebase_path(corpus_path, "//") ]
              }
              args += [ "data/corpus" ]
            }
          },
        ]
        fuzz_spec = [
          {
            label = invoker.label
            fuzzer_test = fuzzer_test
            test_manifest = get_target_outputs(":${invoker.target_name}")
            test_manifest = get_path_info(test_manifest[0], "file")
          },
        ]
      }
    }
  } else {
    group(target_name) {
      testonly = true
      deps = [ ":$target_name($default_toolchain)" ]
    }
    not_needed(invoker, "*")
  }
}
