# 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_files.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

if (is_host) {
  go_library("codegen") {
    source_dir = "codegen"
    deps = [ "//tools/fidl/lib/fidlgen_cpp" ]
    sources = [
      "bits.tmpl",
      "codegen.go",
      "decoder_encoder.tmpl",
      "decoder_encoder_header.tmpl",
      "decoder_encoder_source.tmpl",
      "enum.tmpl",
      "header.tmpl",
      "source.tmpl",
      "struct.tmpl",
      "table.tmpl",
      "union.tmpl",
    ]
  }

  go_library("main") {
    deps = [
      ":codegen",
      "//tools/fidl/lib/fidlgen_cpp",
    ]
    sources = [ "main.go" ]
  }

  go_binary("fidlgen_libfuzzer") {
    library = ":main"
    sdk_category = "partner"
  }

  golden_files("fidlgen_libfuzzer_golden_tests") {
    testonly = true

    formatter = {
      script = "$root_out_dir/clang-format-wrapper"
      inputs = [ "${clang_prefix}/clang-format" ]
      args = [ rebase_path(inputs[0], root_build_dir) ]
      deps = [ "//tools/fidl/clang-format-wrapper" ]
    }

    deps = []
    comparisons = []
    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"
        comparisons += [
          {
            golden = "goldens/${info.name}.h.golden"
            candidate = "$gen_dir/$include_path/libfuzzer.h"
          },
          {
            golden = "goldens/${info.name}.cc.golden"
            candidate = "$gen_dir/$include_path/libfuzzer.cc"
          },
          {
            golden = "goldens/${info.name}_decode_encode.h.golden"
            candidate = "$gen_dir/$include_path/libfuzzer_decode_encode.h"
          },
          {
            golden = "goldens/${info.name}_decode_encode.cc.golden"
            candidate = "$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__golden" ]
    }
  }
}

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