# 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/config/clang/clang.gni")
import("//build/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/host.gni")
import("//build/testing/golden_test.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

if (is_host) {
  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/decoder_encoder.tmpl.go",
      "codegen/decoder_encoder_header.tmpl.go",
      "codegen/decoder_encoder_source.tmpl.go",
      "codegen/enum.tmpl.go",
      "codegen/header.tmpl.go",
      "codegen/protocol_decoder_encoders.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" ]
  }

  golden_test("fidlgen_libfuzzer_golden_tests") {
    goldens_dir = "goldens"
    reformat_goldens_bin =
        rebase_path("${clang_prefix}/clang-format", "", root_build_dir)
    reformat_goldens_args = [ "--style=google" ]
    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}/libfuzzer"
        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"
          },
          {
            golden = "${info.name}_decode_encode.h.golden"
            generated = "$gen_dir/$include_path/libfuzzer_decode_encode.h"
          },
          {
            golden = "${info.name}_decode_encode.cc.golden"
            generated = "$gen_dir/$include_path/libfuzzer_decode_encode.cc"
          },
        ]
      }
    }
  }
}

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

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",
  ]
}
