# Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("../../../webrtc.gni")
if (rtc_enable_protobuf) {
  import("//third_party/protobuf/proto_library.gni")
}

group("metrics") {
  testonly = true
  deps = [
    ":global_metrics_logger_and_exporter",
    ":metric",
    ":metrics_accumulator",
    ":metrics_exporter",
    ":metrics_logger",
  ]
  if (!build_with_chromium) {
    deps += [ ":stdout_metrics_exporter" ]
  }
}

rtc_library("metric") {
  visibility = [ "*" ]
  sources = [
    "metric.cc",
    "metric.h",
  ]
  deps = [
    "../../units:timestamp",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

rtc_library("metrics_logger") {
  visibility = [ "*" ]
  sources = [
    "metrics_logger.cc",
    "metrics_logger.h",
  ]
  deps = [
    ":metric",
    ":metrics_accumulator",
    "../../../rtc_base:macromagic",
    "../../../rtc_base/synchronization:mutex",
    "../../../system_wrappers",
    "../../numerics",
    "../../units:timestamp",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

rtc_library("metrics_accumulator") {
  visibility = [ "*" ]
  sources = [
    "metrics_accumulator.cc",
    "metrics_accumulator.h",
  ]
  deps = [
    ":metric",
    "../../../rtc_base:macromagic",
    "../../../rtc_base/synchronization:mutex",
    "../../numerics",
    "../../units:timestamp",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

rtc_library("metrics_exporter") {
  visibility = [ "*" ]
  sources = [ "metrics_exporter.h" ]
  deps = [ ":metric" ]
}

if (!build_with_chromium) {
  # Hidden from the Chromium build because it depends on absl flags which
  # cannot be compiled in Chromium.
  rtc_library("stdout_metrics_exporter") {
    visibility = [ "*" ]
    testonly = true
    sources = [
      "stdout_metrics_exporter.cc",
      "stdout_metrics_exporter.h",
    ]
    deps = [
      ":metric",
      ":metrics_exporter",
      "../../../rtc_base:stringutils",
      "../../../test:test_flags",
      "//third_party/abseil-cpp/absl/flags:flag",
      "//third_party/abseil-cpp/absl/strings",
    ]
  }
}

rtc_library("chrome_perf_dashboard_metrics_exporter") {
  visibility = [ "*" ]
  testonly = true
  sources = [
    "chrome_perf_dashboard_metrics_exporter.cc",
    "chrome_perf_dashboard_metrics_exporter.h",
  ]
  deps = [
    ":metric",
    ":metrics_exporter",
    "../../../test:fileutils",
    "../../../test:perf_test",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

if (rtc_enable_protobuf) {
  proto_library("metric_proto") {
    visibility = [ "*" ]
    sources = [ "proto/metric.proto" ]
    proto_out_dir = "api/test/metrics/proto"
    cc_generator_options = "lite"
  }
}

rtc_library("metrics_set_proto_file_exporter") {
  visibility = [ "*" ]
  testonly = true
  sources = [
    "metrics_set_proto_file_exporter.cc",
    "metrics_set_proto_file_exporter.h",
  ]
  deps = [
    ":metric",
    ":metrics_exporter",
    "../../../rtc_base:logging",
    "../../../test:fileutils",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]

  if (rtc_enable_protobuf) {
    deps += [ ":metric_proto" ]
  }
}

rtc_library("print_result_proxy_metrics_exporter") {
  visibility = [ "*" ]
  testonly = true
  sources = [
    "print_result_proxy_metrics_exporter.cc",
    "print_result_proxy_metrics_exporter.h",
  ]
  deps = [
    ":metric",
    ":metrics_exporter",
    "../../../test:perf_test",
    "../../numerics",
  ]
}

rtc_library("global_metrics_logger_and_exporter") {
  visibility = [ "*" ]
  sources = [
    "global_metrics_logger_and_exporter.cc",
    "global_metrics_logger_and_exporter.h",
  ]
  deps = [
    ":metric",
    ":metrics_exporter",
    ":metrics_logger",
    "../../../system_wrappers",
  ]
}

if (rtc_include_tests) {
  rtc_cc_test("metrics_logger_test") {
    sources = [ "metrics_logger_test.cc" ]
    deps = [
      ":metric",
      ":metrics_logger",
      "../../../system_wrappers",
      "../../../test:test_support",
      "../../numerics",
      "../../units:timestamp",
    ]
  }

  rtc_cc_test("metrics_accumulator_test") {
    sources = [ "metrics_accumulator_test.cc" ]
    deps = [
      ":metric",
      ":metrics_accumulator",
      "../../../test:test_support",
      "../../units:timestamp",
    ]
  }

  rtc_cc_test("stdout_metrics_exporter_test") {
    sources = [ "stdout_metrics_exporter_test.cc" ]
    deps = [
      ":metric",
      ":stdout_metrics_exporter",
      "../../../test:test_flags",
      "../../../test:test_support",
      "../../units:timestamp",
      "//third_party/abseil-cpp/absl/flags:flag",
    ]
  }

  rtc_cc_test("print_result_proxy_metrics_exporter_test") {
    sources = [ "print_result_proxy_metrics_exporter_test.cc" ]
    deps = [
      ":metric",
      ":print_result_proxy_metrics_exporter",
      "../../../test:test_support",
      "../../units:timestamp",
    ]
  }

  rtc_cc_test("global_metrics_logger_and_exporter_test") {
    sources = [ "global_metrics_logger_and_exporter_test.cc" ]
    deps = [
      ":global_metrics_logger_and_exporter",
      ":metric",
      ":metrics_exporter",
      ":metrics_logger",
      "../../../system_wrappers",
      "../../../test:test_support",
    ]
  }

  if (rtc_enable_protobuf) {
    rtc_cc_test("metrics_set_proto_file_exporter_test") {
      sources = [ "metrics_set_proto_file_exporter_test.cc" ]
      deps = [
        ":metric",
        ":metric_proto",
        ":metrics_set_proto_file_exporter",
        "../../../rtc_base:protobuf_utils",
        "../../../test:fileutils",
        "../../../test:test_support",
        "../../units:timestamp",
      ]
    }

    rtc_cc_test("chrome_perf_dashboard_metrics_exporter_test") {
      sources = [ "chrome_perf_dashboard_metrics_exporter_test.cc" ]
      deps = [
        ":chrome_perf_dashboard_metrics_exporter",
        ":metric",
        "../../../test:fileutils",
        "../../../test:test_support",
        "../../units:timestamp",
        "//third_party/catapult/tracing/tracing:histogram",
      ]
    }
  }
}
