# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# TODO(crbug.com/932128): Fix the visibility on the shared lib.
# gnlint: disable=GnLintVisibilityFlags

import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":chromeos-pgmem",
    ":install_minijail_conf",
    ":libmetrics",
    ":libmetrics_daemon",
    ":libupload_service",
    ":metrics_client",
    "//metrics/structured:libstructuredmetrics",
    "//metrics/structured:libstructuredmetrics_pkg_config",
    "//metrics/structured:update_reset_counter",
  ]
  if (use.passive_metrics) {
    deps += [ ":metrics_daemon" ]
  }
  if (use.test) {
    deps += [
      ":cumulative_metrics_test",
      ":metrics_library_test",
      ":persistent_integer_test",
      ":process_meter_test",
      ":timer_test",
      ":upload_service_test",
    ]
  }
  if (use.passive_metrics && use.test) {
    deps += [ ":metrics_daemon_test" ]
  }
  if (use.fuzzer) {
    deps += [
      ":metrics_library_consent_id_fuzzer",
      ":metrics_serialization_utils_fuzzer",
    ]
  }
}

install_config("install_minijail_conf") {
  sources = [ "minijail/metrics_daemon.conf" ]
  install_path = "minijail_conf"
}

shared_library("libmetrics") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libsession_manager-client",
  ]
  sources = [
    "c_metrics_library.cc",
    "cumulative_metrics.cc",
    "metrics_library.cc",
    "metrics_writer.cc",
    "persistent_integer.cc",
    "serialization/metric_sample.cc",
    "serialization/serialization_utils.cc",
    "timer.cc",
  ]
  configs += [ "//common-mk:visibility_default" ]
  cflags_cc = [ "-fno-exceptions" ]
  libs = [ "policy" ]
  include_dirs = [ "." ]
  if (use.metrics_uploader) {
    defines = [ "USE_METRICS_UPLOADER=1" ]
  }
}

source_set("metrics_test_support") {
  sources = [ "fake_metrics_library.cc" ]
  configs += [ ":target_defaults" ]
  if (use.metrics_uploader) {
    defines = [ "USE_METRICS_UPLOADER=1" ]
  }
  include_dirs = [ "." ]
  public_deps = [ ":libmetrics" ]
}

pkg_config("target_defaults_pkg_deps") {
  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome",
    "re2",
  ]
}

config("target_defaults") {
  cflags_cc = [ "-fno-exceptions" ]
  configs = [ ":target_defaults_pkg_deps" ]
}

static_library("libmetrics_daemon") {
  sources = [
    "metrics_daemon.cc",
    "metrics_daemon_main.cc",
    "process_meter.cc",
    "vmlog_writer.cc",
  ]
  configs += [ ":target_defaults" ]
  libs = [
    "rootdev",
    "system_api-power_manager-protos",
  ]
  include_dirs = [ "." ]
  deps = [
    ":libmetrics",
    ":libupload_service",
    ":metrics_proto",
  ]
}

executable("metrics_client") {
  sources = [ "metrics_client.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libmetrics" ]
}

executable("chromeos-pgmem") {
  sources = [
    "pgmem.cc",
    "process_meter.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = []
}

static_library("libupload_service") {
  sources = [
    "uploader/metrics_hashes.cc",
    "uploader/metrics_log.cc",
    "uploader/metrics_log_base.cc",
    "uploader/sender_http.cc",
    "uploader/system_profile_cache.cc",
    "uploader/upload_service.cc",
  ]
  configs += [ ":target_defaults" ]
  include_dirs = [ "." ]
  deps = [
    ":libmetrics",
    ":metrics_proto",
  ]
  all_dependent_pkg_deps = [ "vboot_host" ]
  if (use.fuzzer) {
    all_dependent_pkg_deps += [ "protobuf" ]
  } else {
    all_dependent_pkg_deps += [ "protobuf-lite" ]
  }
}

proto_library("metrics_proto") {
  proto_in_dir = "uploader/proto"
  proto_out_dir = "include/metrics/uploader/proto"
  sources = [
    "${proto_in_dir}/chrome_user_metrics_extension.proto",
    "${proto_in_dir}/histogram_event.proto",
    "${proto_in_dir}/system_profile.proto",
    "${proto_in_dir}/user_action_event.proto",
  ]
}

if (use.passive_metrics) {
  executable("metrics_daemon") {
    configs += [ ":target_defaults" ]
    deps = [ ":libmetrics_daemon" ]
  }
}

if (use.test) {
  executable("persistent_integer_test") {
    sources = [
      "persistent_integer.cc",
      "persistent_integer_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "//common-mk/testrunner:testrunner" ]
  }
  executable("cumulative_metrics_test") {
    sources = [
      "cumulative_metrics.cc",
      "cumulative_metrics_test.cc",
      "persistent_integer.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "../common-mk/testrunner:testrunner" ]
  }
  executable("hold_lock_file") {
    sources = [ "serialization/hold_lock_file.cc" ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
  }
  executable("metrics_library_test") {
    sources = [
      "fake_metrics_library_test.cc",
      "metrics_library_test.cc",
      "metrics_writer_test.cc",
      "serialization/serialization_utils_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    libs = [ "policy" ]
    deps = [
      ":hold_lock_file",
      ":libmetrics",
      ":metrics_test_support",
      "../common-mk/testrunner:testrunner",
    ]
  }
  executable("process_meter_test") {
    sources = [
      "process_meter.cc",
      "process_meter_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "//common-mk/testrunner:testrunner" ]
  }
  executable("timer_test") {
    sources = [
      "timer.cc",
      "timer_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "../common-mk/testrunner:testrunner" ]
  }
  executable("upload_service_test") {
    sources = [
      "persistent_integer.cc",
      "uploader/metrics_hashes_test.cc",
      "uploader/metrics_log_base_test.cc",
      "uploader/mock/sender_mock.cc",
      "uploader/upload_service_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    include_dirs = [ "." ]
    deps = [
      ":libupload_service",
      "../common-mk/testrunner:testrunner",
    ]
  }
}

if (use.passive_metrics && use.test) {
  executable("metrics_daemon_test") {
    sources = [
      "metrics_daemon_test.cc",
      "vmlog_writer_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    include_dirs = [ "." ]
    deps = [ ":libmetrics_daemon" ]
  }
}

if (use.fuzzer) {
  executable("metrics_library_consent_id_fuzzer") {
    sources = [ "metrics_library_consent_id_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libmetrics" ]
  }
  executable("metrics_serialization_utils_fuzzer") {
    sources = [ "serialization/metrics_serialization_utils_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libmetrics" ]
  }
}
