# 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:libstructuredmetrics",
  ]
  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",
  ]
  sources = [
    "c_metrics_library.cc",
    "cumulative_metrics.cc",
    "metrics_library.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" ]
  }
}

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("metrics_library_test") {
    sources = [
      "metrics_library_test.cc",
      "serialization/serialization_utils_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    libs = [ "policy" ]
    deps = [
      ":libmetrics",
      "../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" ]
  }
}
