# 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/cpp/fidl_cpp.gni")
import("//build/fuzzing/fuzzer.gni")

# Defines service provider for a generated FIDL fuzzer
#
# The fidl() template supports a list of `fuzzers` that contain a `protocol`
# string and optional list of `methods`. Each of the fidl()'s `fuzzers`
# generates a library target of the form:
#
# [fidl() target name]_libfuzzer_[protocol]_[method1 name]_[method2 name]...
#
# The target contains the core fuzzer logic, but relies on symbols that must be
# defined by the FIDL service implementer for providing an instance of the
# service to fuzz.
#
# This template is a helper for tying together the above-mentioned target and
# the sources and/or deps necessary to provide the above-mentioned symbols.
#
# NOTE: The `protocol` and `methods` passed to this template must _exactly_
# match one of the `fuzzers` defined on the corresponding fidl() rule.
#
# Parameters
#
#   fidl (required)
#     [label] The `fidl()` label that includes the protocol to be fuzzed.
#
#   protocol (required)
#     [fully-qualified FIDL protocol name] The fully-qualified name of the FIDL
#     protocol to be fuzzed.
#
#   methods (optional)
#     [list of strings] The names of the methods to be fuzzed, as they appear in
#     the FIDL file. These are translated into defines that enable fuzzing code
#     for the appropriate methods. Defaults to special define value for fuzzing
#     all methods of the specified protocol.
#
# Other parameters are precisely those of an `executable`, with their usual GN
# meanings; these parameters are forwarded to the generated fuzzer() template.
template("fidl_protocol_fuzzer") {
  assert(
      defined(invoker.protocol),
      "FIDL fuzzer service provider must set protocol: the fully-qualified name of the protocol to be fuzzed.")
  assert(
      defined(invoker.fidl),
      "FIDL fuzzer service provider must set fidl: the fidl() target defining the corresponding fuzzer.")

  protocol_suffix = string_replace(invoker.protocol, ".", "_")
  if (defined(invoker.methods)) {
    foreach(method, invoker.methods) {
      protocol_suffix = "${protocol_suffix}_${method}"
    }
  }

  if (defined(invoker.deps)) {
    fuzzer_deps = invoker.deps
  } else {
    fuzzer_deps = []
  }
  fuzzer_deps += [
    "${invoker.fidl}_libfuzzer_${protocol_suffix}",
    "//sdk/lib/fidl/cpp/fuzzing",
  ]

  fuzzer(target_name) {
    forward_variables_from(invoker,
                           [
                             "aliased_deps",
                             "all_dependent_configs",
                             "asmflags",
                             "cflags_c",
                             "cflags_cc",
                             "cflags_objc",
                             "cflags_objcc",
                             "cflags",
                             "check_includes",
                             "manifest",
                             "configs",
                             "crate_name",
                             "crate_root",
                             "data_deps",
                             "data",
                             "dictionary",
                             "edition",
                             "friend",
                             "include_dirs",
                             "inputs",
                             "inputs",
                             "ldflags",
                             "lib_dirs",
                             "libs",
                             "metadata",
                             "options",
                             "output_extension",
                             "output_name",
                             "precompiled_header",
                             "precompiled_source",
                             "public_configs",
                             "public_deps",
                             "public",
                             "rustenv",
                             "rustflags",
                             "sources",
                             "testonly",
                             "visibility",
                           ])
    deps = fuzzer_deps
  }
}
