# 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")
import("//testing/test.gni")

group("pc") {
  deps = [
    ":rtc_pc",
  ]
}

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

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" ]
  }

  configs += [ "..:common_config" ]
  public_configs = [
    "..:common_inherited_config",
    ":rtc_pc_config",
  ]

  if (is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    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.
    }
  }

  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 += [
      "..:common_config",
      ":rtc_pc_unittests_config",
    ]
    public_configs = [ "..:common_inherited_config" ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      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" ]
    }
  }
}
