# 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 = [
    "//garnet/go/src/fidl/compiler/backend/cpp",
    "//garnet/go/src/fidl/compiler/backend/types",
  ]
  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",
  ]
}
