# Copyright (c) 2016 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("../build/webrtc.gni")

group("stats") {
  public_deps = [
    ":rtc_stats",
  ]
}

# GYP version: webrtc/stats/stats.gyp:rtc_stats
rtc_static_library("rtc_stats") {
  cflags = []
  sources = [
    "rtcstats.cc",
    "rtcstats_objects.cc",
    "rtcstatsreport.cc",
  ]

  deps = [
    "../api:rtc_stats_api",
    "../base:rtc_base_approved",
  ]
}

rtc_source_set("rtc_stats_test_utils") {
  cflags = []
  sources = [
    "test/rtcteststats.cc",
    "test/rtcteststats.h",
  ]

  deps = [
    ":rtc_stats",
    "../api:rtc_stats_api",
  ]
}

if (rtc_include_tests) {
  rtc_test("rtc_stats_unittests") {
    testonly = true
    sources = [
      "rtcstats_unittest.cc",
      "rtcstatsreport_unittest.cc",
    ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    deps = [
      ":rtc_stats",
      ":rtc_stats_test_utils",
      "../base:rtc_base_tests_utils",
      "../system_wrappers:metrics_default",
      "//testing/gmock",
    ]

    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_native_code" ]
    }
  }
}
