# 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/toolchain.gni")
import("//build/host.gni")
import("//build/testing/golden_files.gni")
import("//tools/fidl/fidlc/testdata/info.gni")
import("//tools/fidl/lib/fidlgentest/fidlgentest_go_test.gni")

if (is_host) {
  go_library("codegen") {
    source_dir = "codegen"
    deps = [ "//tools/fidl/lib/fidlgen" ]
    sources = [
      "bits.tmpl",
      "codegen.go",
      "enum.tmpl",
      "ir.go",
      "ir_test.go",
      "library.tmpl",
      "protocol.tmpl",
      "struct.tmpl",
      "table.tmpl",
      "union.tmpl",
    ]
  }

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

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

  fidlgentest_go_test("fidlgen_go_lib_tests") {
    library = ":codegen"
  }

  golden_files("fidlgen_go_golden_tests") {
    testonly = true

    formatter = {
      script = "//prebuilt/third_party/go/$host_platform/bin/gofmt"
    }

    deps = []
    comparisons = []
    foreach(info, fidl_testdata_info) {
      if (info.denylist + [ "fidlgen_go" ] - [ "fidlgen_go" ] ==
          info.denylist) {
        deps += [ "${info.target}_go_generate($go_toolchain)" ]
        comparisons += [
          {
            golden = "goldens/${info.name}.go.golden"
            candidate = "${info.fidl_gen_dir}/${info.target_name}/go/${info.library}.fidl/impl.go"
          },
        ]
      }
    }
  }
}

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

# Test that the generated Go library compiles.
#
# Go libraries can only be compiled inside the context of some binary.
# The following is modeled from a similar template in
# /zircon/tools/zither/BUILD.gn.
# We create a simple main file that imports the generated package, which
# will feed into our compilation check.
template("fidlgen_go_golden_compilation_test") {
  info = invoker.info
  compilation_check_target = target_name
  output_dir = "${target_gen_dir}/${target_name}"
  create_main_target = "${compilation_check_target}.create_main"
  main_file = "$output_dir/main.go"

  # Something like "fidl/test/foobar"
  go_package_under_test = "fidl/" + string_replace(info.library, ".", "/")
  generated_file(create_main_target) {
    visibility = [ ":*" ]
    testonly = true

    contents = [
      "package main",
      "",
      "import (",

      # It is necessary to import the generated bindings library.
      # Otherwise, the tree-shaking build optimization from Go will
      # avoid actually compiling the library.
      # `_` to avoid usage complaints.
      "  _ \"${go_package_under_test}\"",

      # Without this import, there are undefined symbol errors at link time.
      "  _ \"syscall/zx\"",
      ")",
      "",
      "func main() {}",
      "",
    ]
    outputs = [ main_file ]
  }

  # The generated main file now needs to be declared in a package/library.
  main_library_target = "${compilation_check_target}.main_library"
  main_pkg_name = rebase_path(output_dir, root_build_dir)
  go_library(main_library_target) {
    visibility = [ ":*" ]
    testonly = true

    name = main_pkg_name
    source_dir = output_dir
    sources = [ rebase_path(main_file, source_dir) ]
    deps = [ info.target + "_go($go_toolchain)" ]
    non_go_deps = [ ":$create_main_target" ]
  }

  go_binary(compilation_check_target) {
    library = ":$main_library_target"
    visibility = [ ":*" ]
    testonly = true
    sdk_category = "excluded"
  }
}

golden_compilation_test_deps = []

if (is_fuchsia) {
  foreach(testdata_info, fidl_testdata_info) {
    if (testdata_info.build_denylist + [ "fidlgen_go" ] - [ "fidlgen_go" ] ==
        testdata_info.build_denylist) {
      compilation_check_target = "${testdata_info.name}_go_compilation_test"
      fidlgen_go_golden_compilation_test(compilation_check_target) {
        info = testdata_info
      }
      golden_compilation_test_deps += [ ":${compilation_check_target}" ]
    }
  }
}

group("goldens") {
  testonly = true
  deps = golden_compilation_test_deps
}

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