# Copyright 2016 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/config/sysroot.gni")
import("//build/go/go_test.gni")
import("//build/host.gni")
import("//src/sys/build/components.gni")

if (is_host && current_toolchain == toolchain_variant.base) {
  _go_root = "$host_tools_dir/goroot"

  compiled_action("makeroot") {
    visibility = [ ":makefuchsia" ]

    depfile = "$target_gen_dir/$target_name.d"
    outputs = [ "$target_gen_dir/$target_name.stamp" ]

    tool = "makeroot"
    args = [
      "--source-goroot",
      rebase_path(".", root_build_dir),
      "--target-goroot",
      rebase_path(_go_root, root_build_dir),

      "--depfile",
      rebase_path(depfile, root_build_dir),
      "--stamp-file",
      rebase_path(outputs[0], root_build_dir),
    ]
  }

  compiled_action("makefuchsia") {
    visibility = [ ":go_runtime" ]
    deps = [ ":makeroot" ]

    depfile = "$target_gen_dir/$target_name.d"
    outputs = [ "$target_gen_dir/$target_name.stamp" ]

    tool = "makefuchsia"
    args = [
      "--cc",
      rebase_path("${clang_prefix}/clang"),
      "--cxx",
      rebase_path("${clang_prefix}/clang++"),
      "--gocache",
      gocache_dir,
      "--goroot",
      rebase_path(_go_root, root_build_dir),
      "--goroot-bootstrap",
      rebase_path("//prebuilt/third_party/go/${host_platform}"),
      "--sysroot",
      rebase_path(sysroot),

      "--depfile",
      rebase_path(depfile, root_build_dir),
      "--stamp-file",
      rebase_path(outputs[0], root_build_dir),
    ]
  }
}

group("go_runtime") {
  if (is_host) {
    public_deps = [ ":makefuchsia(${toolchain_variant.base})" ]
  } else {
    public_deps = [ ":$target_name(${host_toolchain})" ]
  }
}

go_test("go_exec_test") {
  gopackages = [ "os/exec" ]
}

go_test("go_net_test") {
  gopackages = [ "net" ]
}

go_test("go_os_test") {
  gopackages = [ "os" ]
}

go_test("go_pprof_test") {
  gopackages = [ "runtime/pprof" ]
}

go_test("go_zx_test") {
  gopackages = [ "syscall/zx" ]
}

go_test("go_zxwait_test") {
  gopackages = [ "syscall/zx/zxwait" ]
}

fuchsia_component("go-exec-test") {
  testonly = true
  manifest = "meta/go_exec_test.cmx"
  deps = [
    ":go_exec_test",
    "//third_party/sbase:cat",
    "//third_party/sbase:echo",
  ]
}

fuchsia_component("go-net-test") {
  testonly = true
  manifest = "meta/go_net_test.cmx"
  deps = [ ":go_net_test" ]
}

fuchsia_component("go-os-test") {
  testonly = true
  manifest = "meta/go_os_test.cmx"
  deps = [ ":go_os_test" ]
}

fuchsia_component("go-pprof-test") {
  testonly = true
  manifest = "meta/go_pprof_test.cmx"
  deps = [ ":go_pprof_test" ]
}

fuchsia_component("go-zx-test") {
  testonly = true
  manifest = "meta/go_zx_test.cmx"
  deps = [ ":go_zx_test" ]
}

fuchsia_component("go-zxwait-test") {
  testonly = true
  manifest = "meta/go_zxwait_test.cmx"
  deps = [ ":go_zxwait_test" ]
}

fuchsia_test_package("go-stdlib-tests") {
  test_components = [
    ":go-exec-test",
    ":go-net-test",
    ":go-pprof-test",
    ":go-zx-test",
    ":go-zxwait-test",
    ":go-os-test",
  ]

  deps = [ "//src/connectivity/network/netstack:component-debug" ]

  test_specs = {
    environments = [ emu_env ]
  }
}

go_test("go_unsafevalue_test") {
  gopackages = [ "syscall/zx/fidl/internal/unsafevalue" ]

  # This runs both on target device and as a host test.
  # In both cases, it needs to build a go toolchain rather than using a prebuilt because
  # it is testing the fidl package, which is implemented in the toolcahin itself.
  use_prebuilt_go = false
}

go_test("go_fidl_test") {
  gopackages = [ "syscall/zx/fidl" ]
}

go_test("go_extended_fidl_test") {
  # N.B. these tests are not in the fidl package to avoid having to rebuild the
  # go toolchain while iterating on them.
  gopackages = [ "syscall/zx/fidl/fidl_test" ]
  # TODO(pascallouis): Currently, while we take a dependency, the output of
  # this FIDL rule is not directly used, rather the generated bindings were
  # copied and checked in.
  #
  # Not being able to depend on automated generation is due to where code is
  # placed, and how this relates to the tree structure of the toolchain.
  # Disabling while fidlgen table generation is pending.
  # Use regen-fidl to generate this file.
  # deps = [
  #   "src/syscall/zx/fidl/internal/bindingstest($go_toolchain)",
  # ]
}

fuchsia_component("go-unsafevalue-test") {
  testonly = true
  manifest = "meta/go_unsafevalue_test.cmx"
  deps = [ ":go_unsafevalue_test" ]
}

fuchsia_component("go-fidl-test") {
  testonly = true
  manifest = "meta/go_fidl_test.cmx"
  deps = [ ":go_fidl_test" ]
}

fuchsia_component("go-extended-fidl-test") {
  testonly = true
  manifest = "meta/go_extended_fidl_test.cmx"
  deps = [ ":go_extended_fidl_test" ]
}

fuchsia_test_package("go-fidl-tests") {
  test_components = [
    ":go-unsafevalue-test",
    ":go-extended-fidl-test",
    ":go-fidl-test",
  ]

  test_specs = {
    environments = [ emu_env ]
  }
}

group("fidl-tests") {
  testonly = true
  deps = [
    ":go-fidl-tests",
    ":go_extended_fidl_test($host_toolchain)",
    ":go_unsafevalue_test($host_toolchain)",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":fidl-tests",
    ":go-stdlib-tests",
  ]
}
