# 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.

##########################################
# Though under //zircon, this build file #
# is meant to be used in the Fuchsia GN  #
# build.                                 #
# See fxbug.dev/36139.                   #
##########################################

assert(!defined(zx) || zx != "/",
       "This file can only be used in the Fuchsia GN build.")

import("//build/test.gni")
import("//build/testing/bootfs_test.gni")

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

test("zxtest") {
  output_name = "zxtest-test"
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }
  sources = [
    "assertion_test.cc",
    "event-broadcaster_test.cc",
    "main.cc",
    "reporter_test.cc",
    "runner_test.cc",
    "test-case_test.cc",
    "test-info_test.cc",
    "test_test.cc",
  ]
  deps = [
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/zircon:zircon-headers",
  ]
  if (is_fuchsia) {
    sources += [ "death-statement_test.cc" ]

    deps += [
      "//sdk/lib/fdio",
      "//zircon/public/lib/fit",
      "//zircon/public/lib/zx",
    ]
  }
}

bootfs_test("zxtest-bootfs-test") {
  name = "zxtest-test"
  deps = [ ":zxtest" ]
}
