# 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/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/host.gni")
import("//build/testing/host_test_data.gni")
import("//zircon/tools/fidl/testdata/targets.gni")

go_library("gopkg") {
  name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_libfuzzer/..."
  deps = [
    "//tools/fidl/lib/fidlgen",
    "//tools/fidl/lib/fidlgen_cpp",
  ]
  sources = [
    "codegen/bits.tmpl.go",
    "codegen/codegen.go",
    "codegen/codegen_test.go",
    "codegen/enum.tmpl.go",
    "codegen/header.tmpl.go",
    "codegen/source.tmpl.go",
    "codegen/struct.tmpl.go",
    "codegen/table.tmpl.go",
    "codegen/union.tmpl.go",
    "main.go",
  ]
}

go_binary("fidlgen_libfuzzer") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_libfuzzer"

  sdk_category = "partner"
  deps = [ ":gopkg" ]
}

install_host_tools("host") {
  deps = [ ":fidlgen_libfuzzer" ]
  outputs = [ "fidlgen_libfuzzer" ]
}

if (is_host) {
  go_test("fidlgen_libfuzzer_test") {
    gopackages =
        [ "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_libfuzzer/codegen" ]
    args = [
      "--test_data_dir",
      rebase_path("$root_out_dir/test_data/fidlgen", root_build_dir),
      "--clang-format",
      rebase_path("$root_out_dir/test_data/fidlgen_libfuzzer", root_build_dir),
    ]
    deps = [
      ":gopkg",
      "//garnet/go/src/fidl/compiler/backend/typestest",
    ]
    non_go_deps = [ ":clang_format" ]
  }

  host_test_data("clang_format") {
    sources = [ "//prebuilt/third_party/clang/$host_platform/bin/clang-format" ]
    outputs =
        [ "$root_out_dir/test_data/fidlgen_libfuzzer/{{source_file_part}}" ]
  }
}

group("goldens") {
  testonly = true

  # This is needed because libfuzzer depends on HLCPP bindings.
  hlcpp_denylist = [
    # TODO(fxbug.dev/62520): Insert enum/bits <-> primitive conversions.
    "//zircon/tools/fidl/testdata:fidl.test.consts",

    # TODO(fxbug.dev/62533): Fix many issues.
    "//zircon/tools/fidl/testdata:fidl.test.handles",
  ]

  deps = []
  foreach(target, fidl_testdata_targets - hlcpp_denylist) {
    deps += [ "${target}_libfuzzer" ]
  }
}

group("tests") {
  testonly = true
  deps = [
    ":fidlgen_libfuzzer_test($host_toolchain)",
    ":goldens",
  ]
}
