# Copyright 2019 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/go_test.gni")

go_library("lib") {
  sources = [
    "nsjail.go",
    "nsjail_test.go",
    "outputs.go",
    "outputs_test.go",
    "result.go",
    "tester.go",
    "tester_test.go",
  ]

  deps = [
    ":constants",
    "//third_party/golibs:github.com/pkg/sftp",
    "//third_party/golibs:golang.org/x/crypto",
    "//tools/botanist:constants",
    "//tools/build",
    "//tools/debug/elflib",
    "//tools/integration/testsharder:testsharder_lib",
    "//tools/lib/clock",
    "//tools/lib/environment",
    "//tools/lib/ffxutil",
    "//tools/lib/iomisc",
    "//tools/lib/logger",
    "//tools/lib/osmisc",
    "//tools/lib/retry",
    "//tools/lib/serial",
    "//tools/lib/subprocess",
    "//tools/net/sshutil",
    "//tools/testing/runtests",
    "//tools/testing/tap",
  ]
}

go_library("constants") {
  source_dir = "constants"
  sources = [ "constants.go" ]
}

go_library("main") {
  source_dir = "cmd"

  sources = [
    "main.go",
    "main_test.go",
  ]

  deps = [
    ":lib",
    "//tools/botanist:constants",
    "//tools/botanist:targets",
    "//tools/lib/color",
    "//tools/lib/environment",
    "//tools/lib/streams",
    "//tools/testing/testparser",
  ]
}

go_binary("testrunner") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/testing/testrunner/cmd"
  deps = [ ":main" ]
}

go_test("testrunner_main_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/tools/testing/testrunner/cmd" ]
  deps = [
    ":main",
    "//third_party/golibs:github.com/google/go-cmp",
  ]
}

go_test("testrunner_lib_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/tools/testing/testrunner" ]
  deps = [
    ":lib",
    "//third_party/golibs:github.com/google/go-cmp",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":testrunner_lib_tests",
    ":testrunner_main_tests",
  ]
}
