# Copyright 2017 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/test.gni")
import("//third_party/protobuf/proto_library.gni")
import("$cobalt_root/metrics_registry.gni")

declare_args() {
  extra_package_labels = []
}

config("cobalt_config") {
  include_dirs = [
    "$cobalt_root",
    "$root_gen_dir/third_party/cobalt",
  ]

  if (is_fuchsia_tree) {
    include_dirs += [
      "//garnet/public/lib/syslog/cpp",
      "//zircon/system/ulib/syslog/include",
    ]
  }
}

metrics_registry("registry") {
  global = true
}

group("tests") {
  testonly = true
  deps = [
    "keys:tests",
    "src:tests",
  ]
}

test("cobalt_core_unittests") {
  testonly = true

  output_name = "cobalt_core_tests"

  deps = [
    ":tests",
    "//third_party/boringssl:crypto",
    "//third_party/googletest:gtest_main",
  ]

  configs -= [ "//build/config:no_exceptions" ]
}

if (is_fuchsia_tree) {
  import("//build/test/test_package.gni")

  test_package("cobalt_core_tests") {
    deps = [
      ":cobalt_core_unittests",
    ]

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

testonly = true
group("default") {
  deps = [
    ":cobalt_core_unittests",
    "$cobalt_root/src/bin/config_change_validator/src:bin",
    "$cobalt_root/src/bin/test_app",
  ]

  deps += extra_package_labels
}
