# Copyright 2020 The Chromium OS 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("//common-mk/pkg_config.gni")

# Library that provides system-level utilities used by cros_healthd.
pkg_config("libcros_healthd_system_pkg_deps") {
  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libcros_config",
    "libdebugd-client",
    "libmojo-${libbase_ver}",
    "system_api",
  ]
}

source_set("libcros_healthd_system") {
  configs += [ ":libcros_healthd_system_pkg_deps" ]
  deps = [
    "//diagnostics/common:libcommon",
    "//diagnostics/cros_healthd/executor:libcros_healthd_executor",
    "//diagnostics/cros_healthd/network:libnetwork_health_adapter",
  ]
  sources = [
    "context.cc",
    "system_config.cc",
    "system_config_constants.cc",
    "system_utilities_constants.cc",
    "system_utilities_impl.cc",
  ]
}

if (use.test || use.fuzzer) {
  # Libraries for unit tests and fuzzers.
  pkg_config("libcros_healthd_system_test_utils_pkg_deps") {
    pkg_deps = [
      "dbus-1",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
      "libcros_config",
      "libdebugd-client",
      "libdebugd-client-test",
      "system_api",
    ]
  }

  source_set("libcros_healthd_system_test_utils") {
    configs += [
      ":libcros_healthd_system_test_utils_pkg_deps",
      "//common-mk:test",
    ]
    deps = [
      ":libcros_healthd_system",
      "//diagnostics/common:libcommon_test_utils",
      "//diagnostics/cros_healthd/executor:libcros_healthd_executor_test_utils",
      "//diagnostics/cros_healthd/network:libnetwork_health_adapter_test_utils",
    ]
    sources = [
      "fake_system_config.cc",
      "fake_system_utilities.cc",
      "mock_context.cc",
    ]
  }
}

if (use.test) {
  pkg_config("system_config_test_pkg_deps") {
    pkg_deps = [
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
      "libcros_config",
    ]
  }

  executable("system_config_test") {
    configs += [
      ":system_config_test_pkg_deps",
      "//common-mk:test",
    ]
    deps = [
      ":libcros_healthd_system",
      "//common-mk/testrunner:testrunner",
      "//diagnostics/common:libcommon_test_utils",
    ]
    sources = [ "system_config_test.cc" ]
  }
}
