# 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/components.gni")

fuchsia_unittest_component("kcounter_inspect_unittest_component") {
  deps = [ ":kcounter_inspect_unittest" ]
}

fuchsia_test_component("kcounter_inspect_integration_test_component") {
  manifest = "meta/kcounter_inspect_integration_test.cmx"
  deps = [ ":kcounter_inspect_integration_test" ]
}

fuchsia_test_package("kcounter_inspect_tests") {
  test_components = [
    ":kcounter_inspect_unittest_component",
    ":kcounter_inspect_integration_test_component",
  ]
}

executable("kcounter_inspect_unittest") {
  testonly = true

  sources = [ "vmo_file_with_update_test.cc" ]

  deps = [
    "../:lib",
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.kernel",
    "//sdk/lib/sys/cpp/testing:unit",
    "//sdk/lib/syslog/cpp",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gtest",
    "//zircon/public/lib/zx",
  ]
}

executable("kcounter_inspect_integration_test") {
  testonly = true

  sources = [ "kcounter_inspect_integration_test.cc" ]

  deps = [
    "//sdk/fidl/fuchsia.kernel",
    "//sdk/fidl/fuchsia.mem",
    "//sdk/lib/inspect/service/cpp",
    "//sdk/lib/inspect/testing/cpp",
    "//sdk/lib/sys/cpp",
    "//src/lib/fxl",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gtest",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]
}
