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

source_set("cobalt_config") {
  sources = [
    "cobalt_config.cc",
    "cobalt_config.h",
  ]

  configs += [ "$cobalt_root:cobalt_config" ]

  public_deps = [
    ":activity_listener_interface",
    "$cobalt_root/src/lib/clearcut",
    "$cobalt_root/src/lib/util:file_system",
    "$cobalt_root/src/local_aggregation_1_1/local_aggregate_storage",
    "$cobalt_root/src/logger:project_context",
    "$cobalt_root/src/registry:cobalt_registry_proto",
    "$cobalt_root/src/system_data:client_secret",
    "$cobalt_root/src/system_data:configuration_data",
  ]
}

source_set("activity_listener_interface") {
  sources = [ "activity_listener_interface.h" ]
  configs += [ "$cobalt_root:cobalt_config" ]
}

source_set("cobalt_service_interface") {
  sources = [ "cobalt_service_interface.h" ]

  configs += [ "$cobalt_root:cobalt_config" ]

  deps = [
    ":activity_listener_interface",
    "$cobalt_root/src/lib/util:clock",
    "$cobalt_root/src/logger:logger_interface",
    "$cobalt_root/src/logger:project_context",
    "$cobalt_root/src/observation_store",
    "$cobalt_root/src/system_data",
  ]
}

source_set("cobalt_service") {
  sources = [
    "cobalt_service.cc",
    "cobalt_service.h",
  ]

  configs += [ "$cobalt_root:cobalt_config" ]

  deps = [
    ":cobalt_config",
    ":cobalt_service_interface",
    "$cobalt_root/src/local_aggregation:event_aggregator_mgr",
    "$cobalt_root/src/local_aggregation_1_1:local_aggregation",
    "$cobalt_root/src/local_aggregation_1_1/aggregation_procedures",
    "$cobalt_root/src/logger",
    "$cobalt_root/src/logger:project_context_factory",
    "$cobalt_root/src/logger:undated_event_manager",
    "$cobalt_root/src/observation_store",
    "$cobalt_root/src/pb:metadata_builder",
    "$cobalt_root/src/system_data",
    "$cobalt_root/src/system_data:client_secret",
    "$cobalt_root/src/system_data:configuration_data",
  ]

  public_deps = [ "$cobalt_root/src/uploader:shipping_manager" ]
}

source_set("cobalt_config_test") {
  testonly = true

  sources = [ "cobalt_config_test.cc" ]

  configs += [ "$cobalt_root:cobalt_config" ]

  deps = [
    ":cobalt_config",
    "//third_party/googletest:gtest",
  ]
}

source_set("cobalt_service_test") {
  testonly = true
  sources = [ "cobalt_service_test.cc" ]
  configs += [ "$cobalt_root:cobalt_config" ]
  deps = [
    ":cobalt_service",
    "$cobalt_root/src/lib/util:posix_file_system",
    "//third_party/googletest:gtest",
  ]
}

group("tests") {
  testonly = true

  deps = [
    ":cobalt_config_test",
    ":cobalt_service_test",
  ]
}
