# 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/config.gni")
import("//src/sys/build/components.gni")
import("//third_party/cobalt/metrics_registry.gni")

declare_args() {
  # Selects the Cobalt environment to send data to. Choices:
  #   "LOCAL" - record log data locally to a file
  #   "DEVEL" - the non-prod environment for use in testing
  #   "PROD" - the production environment
  cobalt_environment = "PROD"
}

# Generates the global_metrics_registry.pb file.
metrics_registry("global_metrics_registry") {
  global = true
}

# Include the global_metrics_registry.pb in the config data for Cobalt.
config_data("cobalt_registry") {
  for_pkg = "cobalt"
  deps = [ ":global_metrics_registry" ]
  sources = [ "$target_gen_dir/global_metrics_registry.pb" ]
  outputs = [ "global_metrics_registry.pb" ]
}

source_set("lib") {
  sources = [
    "activity_listener_impl.cc",
    "activity_listener_impl.h",
    "cobalt_app.cc",
    "cobalt_app.h",
    "cobalt_controller_impl.cc",
    "cobalt_controller_impl.h",
    "configuration_data.cc",
    "configuration_data.h",
    "logger_factory_impl.cc",
    "logger_factory_impl.h",
    "logger_impl.cc",
    "logger_impl.h",
    "metric_event_logger_factory_impl.cc",
    "metric_event_logger_factory_impl.h",
    "metric_event_logger_impl.cc",
    "metric_event_logger_impl.h",
    "process_lifecycle_impl.h",
    "system_data_updater_impl.cc",
    "system_data_updater_impl.h",
    "timer_manager.cc",
    "timer_manager.h",
    "user_consent_watcher.cc",
    "user_consent_watcher.h",
    "utils.cc",
    "utils.h",
  ]

  public_deps = [
    "//garnet/public/lib/fostr/fidl/fuchsia.settings",
    "//sdk/fidl/fuchsia.cobalt",
    "//sdk/fidl/fuchsia.metrics",
    "//sdk/fidl/fuchsia.process.lifecycle",
    "//sdk/fidl/fuchsia.ui.activity",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/inspect/cpp",
    "//sdk/lib/syslog/cpp",
    "//src/cobalt/bin/utils:clock",
    "//src/cobalt/bin/utils:fuchsia_http_client",
    "//src/connectivity/wlan/lib/mlme/cpp:mlme",
    "//src/lib/backoff",
    "//src/lib/fsl",
    "//src/lib/fxl",
    "//src/lib/json_parser",
    "//third_party/cobalt/src/lib/util:file_util",
    "//third_party/cobalt/src/lib/util:pem_util",
    "//third_party/cobalt/src/lib/util:posix_file_system",
    "//third_party/cobalt/src/logger",
    "//third_party/cobalt/src/public:activity_listener_interface",
    "//third_party/cobalt/src/public:cobalt_config",
    "//third_party/cobalt/src/public:cobalt_service",
    "//third_party/cobalt/src/public:cobalt_service_interface",
    "//third_party/cobalt/src/system_data",
    "//third_party/cobalt/src/system_data:configuration_data",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]
}

executable("app") {
  output_name = "cobalt"

  sources = [ "cobalt_main.cc" ]

  deps = [
    ":lib",
    "//sdk/fidl/fuchsia.scheduler",
    "//sdk/fidl/fuchsia.sysinfo",
    "//zircon/system/ulib/trace",
    "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
  ]
}

# In the default config, Cobalt will upload all metrics (including max_release_stage=DEBUG metrics)
config_data("config") {
  for_pkg = "cobalt"

  sources = [ "configs/default_config.json" ]
  outputs = [ "config.json" ]
}

# In the "user" config, Cobalt will behave like it will on an end-user device, meaning it will only
# upload metrics marked with max_release_stage=GA.
config_data("user_config") {
  for_pkg = "cobalt"

  sources = [ "configs/user_config.json" ]
  outputs = [ "config.json" ]
}

# In the "userdebug" config, Cobalt will behave like it will on an end-user device, except that it
# will upload DEBUG metrics.
config_data("userdebug_config") {
  for_pkg = "cobalt"

  sources = [ "configs/userdebug_config.json" ]
  outputs = [ "config.json" ]
}

fuchsia_component("component") {
  component_name = "cobalt"
  manifest = "meta/cobalt.cmx"
  deps = [ ":app" ]
}

resource("cobalt_environment") {
  # Environment selection for cobalt.
  if (cobalt_environment == "PROD") {
    sources = [ "configs/prod_environment" ]
  } else if (cobalt_environment == "DEVEL") {
    sources = [ "configs/devel_environment" ]
  } else if (cobalt_environment == "LOCAL") {
    sources = [ "configs/local_environment" ]
  } else {
    assert(false, "Unknown cobalt_environment: $cobalt_environment")
  }
  outputs = [ "data/cobalt_environment" ]
}

resource("analyzer_devel_public") {
  # Cobalt 1.0 analyzer public key for devel environment.
  sources =
      [ rebase_path("//third_party/cobalt/keys/analyzer_public.cobalt_key") ]
  outputs = [ "data/keys/analyzer_devel_public" ]
}

resource("shuffler_devel_public") {
  # Cobalt 1.0 shuffler public key for devel environment.
  sources =
      [ rebase_path("//third_party/cobalt/keys/shuffler_public.cobalt_key") ]
  outputs = [ "data/keys/shuffler_devel_public" ]
}

resource("analyzer_prod_public") {
  # Cobalt 1.0 analyzer public key for prod environment.
  sources = [ rebase_path(
          "//third_party/cobalt/keys/analyzer_prod_public.cobalt_key") ]
  outputs = [ "data/keys/analyzer_prod_public" ]
}

resource("shuffler_prod_public") {
  # Cobalt 1.0 shuffler public key for prod environment.
  sources = [ rebase_path(
          "//third_party/cobalt/keys/shuffler_prod_public.cobalt_key") ]
  outputs = [ "data/keys/shuffler_prod_public" ]
}

fuchsia_package("cobalt") {
  deps = [
    ":analyzer_devel_public",
    ":analyzer_prod_public",
    ":cobalt_environment",
    ":component",
    ":shuffler_devel_public",
    ":shuffler_prod_public",
  ]
}

metrics_registry("testapp_metrics_registry") {
  # This must match the ID of the test_app2 Cobalt project as specified in:
  # third_party/cobalt_config/projects.yaml
  project_id = 657579885
  namespace = "testapp_registry"
  generate_cc = true
  generate_binarypb = true
}

executable("cobalt_app_unittests") {
  testonly = true
  sources = [
    "activity_listener_impl_test.cc",
    "cobalt_app_test.cc",
    "cobalt_controller_impl_test.cc",
    "configuration_data_test.cc",
    "logger_impl_test.cc",
    "metric_event_logger_impl_test.cc",
    "system_data_updater_impl_test.cc",
    "timer_manager_test.cc",
    "user_consent_watcher_test.cc",
  ]
  deps = [
    ":lib",
    ":testapp_metrics_registry_cc",
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.cobalt",
    "//sdk/lib/sys/cpp/testing:unit",
    "//sdk/lib/sys/cpp/testing:unit",
    "//src/cobalt/bin/testing:fake_clock_lib",
    "//src/cobalt/bin/testing:fake_http_loader",
    "//src/lib/cobalt/cpp:cobalt_event_builder",
    "//src/lib/cobalt/cpp:metric_event_builder",
    "//src/lib/fsl",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/cobalt/src/logger:fake_logger",
    "//third_party/cobalt/src/logger:logger_test_utils",
    "//third_party/cobalt/src/public/testing:fake_cobalt_service",
    "//third_party/googletest:gmock",
  ]
}
