# 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/compiled_action.gni")
import("//build/fidl/toolchain.gni")
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_syzkaller/..."
  deps = [ "//tools/fidl/lib/fidlgen" ]
  sources = [
    "codegen/codegen.go",
    "codegen/description.tmpl.go",
    "codegen/ir.go",
    "codegen/protocol.tmpl.go",
    "codegen/struct.tmpl.go",
    "codegen/union.tmpl.go",
    "main.go",
  ]
}

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

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

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

fidl_testdata_info_filtered = []
foreach(info, fidl_testdata_info) {
  if (info.denylist + [ "fidlgen_syzkaller" ] - [ "fidlgen_syzkaller" ] ==
      info.denylist) {
    fidl_testdata_info_filtered += [ info ]
  }
}

compiled_action_foreach("generate_goldens") {
  testonly = true
  tool = ":fidlgen_syzkaller"
  deps = []
  sources = []
  foreach(info, fidl_testdata_info_filtered) {
    deps += [ "${info.target}($fidl_toolchain)" ]
    sources += [ "${info.fidl_gen_dir}/${info.target_name}.fidl.json" ]
  }
  args = [
    "-json",
    "{{source}}",
    "-output-syz",
    rebase_path(target_gen_dir, root_build_dir) +
        "/golden_{{source_name_part}}.syz.txt",
  ]
  outputs = [ "$target_gen_dir/golden_{{source_name_part}}.syz.txt" ]
}

golden_test("fidlgen_syzkaller_golden_tests") {
  goldens_dir = "goldens"
  deps = [ ":generate_goldens" ]
  entries = []
  foreach(info, fidl_testdata_info_filtered) {
    entries += [
      {
        golden = "${info.name}.syz.txt.golden"
        generated = "$target_gen_dir/golden_${info.target_name}.fidl.syz.txt"
      },
    ]
  }
}

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