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

config("rtc_pc_config") {
  defines = [
    "SRTP_RELATIVE_PATH",
    "HAVE_SCTP",
    "HAVE_SRTP",
  ]
}

rtc_source_set("rtc_pc") {
  defines = []
  sources = [
    "audiomonitor.cc",
    "audiomonitor.h",
    "bundlefilter.cc",
    "bundlefilter.h",
    "channel.cc",
    "channel.h",
    "channelmanager.cc",
    "channelmanager.h",
    "currentspeakermonitor.cc",
    "currentspeakermonitor.h",
    "mediamonitor.cc",
    "mediamonitor.h",
    "mediasession.cc",
    "mediasession.h",
    "mediasink.h",
    "rtcpmuxfilter.cc",
    "rtcpmuxfilter.h",
    "srtpfilter.cc",
    "srtpfilter.h",
    "voicechannel.h",
  ]

  deps = [
    "../api:call_api",
    "../base:rtc_base",
    "../media",
  ]

  if (build_with_chromium) {
    sources += [
      "externalhmac.cc",
      "externalhmac.h",
    ]
  }
  if (rtc_build_libsrtp) {
    deps += [ "//third_party/libsrtp" ]
  }

  public_configs = [ ":rtc_pc_config" ]

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

if (rtc_include_tests) {
  config("rtc_pc_unittests_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds -Wall, and this flag have to be after -Wall -- so they need to
    # come from a config and can't be on the target directly.
    if (!is_win && !is_clang) {
      cflags = [ "-Wno-maybe-uninitialized" ]  # Only exists for GCC.
    }
  }

  rtc_test("rtc_pc_unittests") {
    testonly = true

    sources = [
      "bundlefilter_unittest.cc",
      "channel_unittest.cc",
      "channelmanager_unittest.cc",
      "currentspeakermonitor_unittest.cc",
      "mediasession_unittest.cc",
      "rtcpmuxfilter_unittest.cc",
      "srtpfilter_unittest.cc",
    ]

    include_dirs = [ "//third_party/libsrtp/srtp" ]

    configs += [ ":rtc_pc_unittests_config" ]

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

    if (is_win) {
      libs = [ "strmiids.lib" ]
    }

    deps = [
      ":rtc_pc",
      "../api:libjingle_peerconnection",
      "../base:rtc_base_tests_utils",
      "../media:rtc_unittest_main",
      "../system_wrappers:metrics_default",
    ]

    if (rtc_build_libsrtp) {
      deps += [ "//third_party/libsrtp" ]
    }

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