# 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/components.gni")
import("//build/config.gni")
import("//build/type/config.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" ]
}

# Create build_type_* packages to include in different products.
build_type_config_data("build_type") {
  for_pkg = "cobalt"
}

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",
    "diagnostics_impl.cc",
    "diagnostics_impl.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 = [
    "//sdk/fidl/fuchsia.buildinfo",
    "//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/fostr/fidl/fuchsia.settings",
    "//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/public:diagnostics_interface",
    "//third_party/cobalt/src/public/lib:report_spec",
    "//third_party/cobalt/src/public/lib:status",
    "//third_party/cobalt/src/public/lib/statusor",
    "//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",
  ]
  deps = [ "//sdk/lib/fit-promise" ]
}

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",
  ]
}

# 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-v2") {
  component_name = "cobalt"
  manifest = "meta/cobalt.cml"
  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("cobalt_devel_environment") {
  testonly = true
  sources = [ "configs/devel_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-v2",
    ":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",
    "diagnostics_impl_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",
    "//sdk/fidl/fuchsia.cobalt",
    "//sdk/lib/inspect/testing/cpp",
    "//sdk/lib/sys/cpp/testing:unit",
    "//sdk/lib/sys/inspect/cpp",
    "//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",
    "//src/lib/testing/loop_fixture",
    "//third_party/cobalt/src/logger:fake_logger",
    "//third_party/cobalt/src/logger:logger_test_utils",
    "//third_party/cobalt/src/public/lib:report_spec",
    "//third_party/cobalt/src/public/testing:fake_cobalt_service",
    "//third_party/googletest:gmock",
  ]
}
