# 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/host.gni")
import("//build/testing/golden_test.gni")
import("//zircon/tools/fidl/testdata/info.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/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" ]
}

golden_test("fidlgen_libfuzzer_golden_tests") {
  goldens_dir = "goldens"
  deps = []
  entries = []
  foreach(info, fidl_testdata_info) {
    if (info.denylist + [ "fidlgen_libfuzzer" ] - [ "fidlgen_libfuzzer" ] ==
        info.denylist) {
      deps += [ "${info.target}_libfuzzer_generate($fidl_toolchain)" ]
      gen_dir = "${info.fidl_gen_dir}/${info.target_name}"
      include_path = string_replace(info.library, ".", "/") + "/cpp"
      entries += [
        {
          golden = "${info.name}.h.golden"
          generated = "$gen_dir/$include_path/libfuzzer.h"
        },
        {
          golden = "${info.name}.cc.golden"
          generated = "$gen_dir/$include_path/libfuzzer.cc"
        },
      ]
    }
  }
}

group("goldens") {
  testonly = true

  deps = []
  foreach(info, fidl_testdata_info) {
    if (info.build_denylist + [ "fidlgen_libfuzzer" ] -
        [ "fidlgen_libfuzzer" ] == info.build_denylist) {
      deps += [ "${info.target}_libfuzzer" ]
    }
  }
}

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