# 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("//build/package.gni")
import("//build/fidl/fidl.gni")

if (current_toolchain == target_toolchain) {
  _go_root = "$host_tools_dir/goroot"
  _bootstrap_goroot = "//buildtools/${host_platform}/go"

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

    inputs = [ "makeroot.go" ]

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

    script = rebase_path(_bootstrap_goroot + "/bin/go")
    args = [
      "run",
      rebase_path("makeroot.go", root_build_dir),
      "-source-goroot",
      rebase_path(".", root_build_dir),
      "-target-goroot",
      rebase_path(_go_root, root_build_dir),

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

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

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

    script = rebase_path(_bootstrap_goroot + "/bin/go")
    args = [
      "run",
      rebase_path("makefuchsia.go", root_build_dir),
      "-bootstrap-goroot",
      rebase_path(_bootstrap_goroot),
      "-goroot",
      rebase_path(_go_root, root_build_dir),

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

group("go_runtime") {
  public_deps = [
    ":makefuchsia(${target_toolchain})",
  ]
}

go_test("go_dispatch_test") {
  gopackage = "syscall/zx/dispatch"
}

go_test("go_fidl_test") {
  gopackage = "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.
  #deps = [
  #  "src/syscall/zx/fidl/bindingstest($go_toolchain)",
  #]
}

go_test("go_zxwait_test") {
  gopackage = "syscall/zx/zxwait"
}

go_test("go_os_test") {
  gopackage = "os"
}

go_test("go_net_test") {
  gopackage = "net"
}

go_test("go_pprof_test") {
  gopackage = "runtime/pprof"
  skip_vet = true
}

package("go_stdlib_tests") {
  testonly = true

  deps = [
    ":go_dispatch_test",
    ":go_os_test",
    ":go_net_test",
    ":go_zxwait_test",
    ":go_pprof_test",
  ]

  tests = [
    {
      name = "go_dispatch_test"
    },
    {
      name = "go_net_test"
    },
    {
      name = "go_os_test"
    },
    {
      name = "go_zxwait_test"
    },
    {
      name = "go_pprof_test"
    },
  ]
}

package("go_fidl_tests") {
  testonly = true

  deps = [
    ":go_fidl_test",
  ]

  tests = [
    {
      name = "go_fidl_test"
    },
  ]
}
