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

# 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",
    ":libmetrics",
    ":libmetrics_daemon",
    ":libupload_service",
    ":metrics_client",
    "//metrics/structured",
  ]
  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",
    ]
  }
}

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

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

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

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

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

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

static_library("libupload_service") {
  configs += [ ":target_defaults" ]
  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" ]
  }
  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",
  ]
  include_dirs = [ "." ]
}

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") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "//common-mk/testrunner:testrunner" ]
    sources = [
      "persistent_integer.cc",
      "persistent_integer_test.cc",
    ]
  }
  executable("cumulative_metrics_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "../common-mk/testrunner:testrunner" ]
    sources = [
      "cumulative_metrics.cc",
      "cumulative_metrics_test.cc",
      "persistent_integer.cc",
    ]
  }
  executable("metrics_library_test") {
    deps = [
      ":libmetrics",
      "../common-mk/testrunner:testrunner",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    sources = [
      "metrics_library_test.cc",
      "serialization/serialization_utils_test.cc",
    ]
    libs = [ "policy" ]
  }
  executable("process_meter_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "//common-mk/testrunner:testrunner" ]
    sources = [
      "process_meter.cc",
      "process_meter_test.cc",
    ]
  }
  executable("timer_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ "../common-mk/testrunner:testrunner" ]
    sources = [
      "timer.cc",
      "timer_test.cc",
    ]
  }
  executable("upload_service_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    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",
    ]
    deps = [
      ":libupload_service",
      "../common-mk/testrunner:testrunner",
    ]
    include_dirs = [ "." ]
  }
}

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

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