# 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") {
  deps = [
    ":rtc_stats",
  ]
}

# GYP version: webrtc/stats/stats.gyp:rtc_stats
rtc_source_set("rtc_stats") {
  cflags = []
  sources = [
    "rtcstats.cc",
    "rtcstats_objects.cc",
    "rtcstatscollector.cc",
    "rtcstatscollector.h",
    "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:libjingle_peerconnection",
  ]
}

if (rtc_include_tests) {
  # GYP version: webrtc/stats/stats.gyp:rtc_stats_unittests
  rtc_test("rtc_stats_unittests") {
    testonly = true
    sources = [
      "rtcstats_unittest.cc",
      "rtcstatscollector_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" ]
    }
  }
}
