# 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_source_set("rtc_stats") {
  cflags = []
  sources = [
    "rtcstats.cc",
    "rtcstats_objects.cc",
    "rtcstatsreport.cc",
  ]

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

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

if (rtc_include_tests) {
  # GYP version: webrtc/stats/stats.gyp:rtc_stats_unittests
  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",
      "../base:rtc_base_tests_utils",
      "../system_wrappers:metrics_default",
      "//testing/gmock",
    ]

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