# Copyright (c) 2015 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("api") {
  deps = [
    ":libjingle_peerconnection",
  ]
}

config("libjingle_peerconnection_warnings_config") {
  # GN orders flags on a target before flags from configs. The default config
  # adds these flags so to cancel them out they need to come from a config and
  # cannot be on the target directly.
  if (!is_win && !is_clang) {
    cflags = [ "-Wno-maybe-uninitialized" ]  # Only exists for GCC.
  }
}

source_set("libjingle_peerconnection") {
  cflags = []
  sources = [
    "audiotrack.cc",
    "audiotrack.h",
    "datachannel.cc",
    "datachannel.h",
    "datachannelinterface.h",
    "dtlsidentitystore.h",
    "dtmfsender.cc",
    "dtmfsender.h",
    "dtmfsenderinterface.h",
    "jsep.h",
    "jsepicecandidate.cc",
    "jsepicecandidate.h",
    "jsepsessiondescription.cc",
    "jsepsessiondescription.h",
    "localaudiosource.cc",
    "localaudiosource.h",
    "mediaconstraintsinterface.cc",
    "mediaconstraintsinterface.h",
    "mediacontroller.cc",
    "mediacontroller.h",
    "mediastream.cc",
    "mediastream.h",
    "mediastreaminterface.h",
    "mediastreamobserver.cc",
    "mediastreamobserver.h",
    "mediastreamprovider.h",
    "mediastreamproxy.h",
    "mediastreamtrack.h",
    "mediastreamtrackproxy.h",
    "notifier.h",
    "peerconnection.cc",
    "peerconnection.h",
    "peerconnectionfactory.cc",
    "peerconnectionfactory.h",
    "peerconnectionfactoryproxy.h",
    "peerconnectioninterface.h",
    "peerconnectionproxy.h",
    "proxy.h",
    "remoteaudiosource.cc",
    "remoteaudiosource.h",
    "rtpparameters.h",
    "rtpreceiver.cc",
    "rtpreceiver.h",
    "rtpreceiverinterface.h",
    "rtpsender.cc",
    "rtpsender.h",
    "rtpsenderinterface.h",
    "sctputils.cc",
    "sctputils.h",
    "statscollector.cc",
    "statscollector.h",
    "statstypes.cc",
    "statstypes.h",
    "streamcollection.h",
    "videocapturertracksource.cc",
    "videocapturertracksource.h",
    "videosourceproxy.h",
    "videotrack.cc",
    "videotrack.h",
    "videotracksource.cc",
    "videotracksource.h",
    "webrtcsdp.cc",
    "webrtcsdp.h",
    "webrtcsession.cc",
    "webrtcsession.h",
    "webrtcsessiondescriptionfactory.cc",
    "webrtcsessiondescriptionfactory.h",
  ]

  configs += [
    "..:common_config",
    ":libjingle_peerconnection_warnings_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" ]
  }

  deps = [
    "../call",
    "../media",
    "../pc",
  ]

  if (rtc_use_quic) {
    sources += [
      "quicdatachannel.cc",
      "quicdatachannel.h",
      "quicdatatransport.cc",
      "quicdatatransport.h",
    ]
    deps += [ "//third_party/libquic" ]
    public_deps = [
      "//third_party/libquic",
    ]
  }
}

# Exclude the targets below from the Chromium build since they cannot be built
# due to incompability with Chromium's logging implementation.
if (is_android && !build_with_chromium) {
  config("libjingle_peerconnection_jni_warnings_config") {
    # The warnings below are enabled by default. Since GN orders compiler flags
    # for a target before flags from configs, the only way to disable such
    # warnings is by having them in a separate config, loaded from the target.
    if (!is_win) {
      cflags = [
        "-Wno-sign-compare",
        "-Wno-unused-variable",
      ]
    }
  }

  source_set("libjingle_peerconnection_jni") {
    sources = [
      "androidvideocapturer.cc",
      "androidvideocapturer.h",
      "java/jni/androidmediacodeccommon.h",
      "java/jni/androidmediadecoder_jni.cc",
      "java/jni/androidmediadecoder_jni.h",
      "java/jni/androidmediaencoder_jni.cc",
      "java/jni/androidmediaencoder_jni.h",
      "java/jni/androidmetrics_jni.cc",
      "java/jni/androidnetworkmonitor_jni.cc",
      "java/jni/androidnetworkmonitor_jni.h",
      "java/jni/androidvideocapturer_jni.cc",
      "java/jni/androidvideocapturer_jni.h",
      "java/jni/classreferenceholder.cc",
      "java/jni/classreferenceholder.h",
      "java/jni/jni_helpers.cc",
      "java/jni/jni_helpers.h",
      "java/jni/native_handle_impl.cc",
      "java/jni/native_handle_impl.h",
      "java/jni/peerconnection_jni.cc",
      "java/jni/surfacetexturehelper_jni.cc",
      "java/jni/surfacetexturehelper_jni.h",
    ]

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

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

    # TODO(jschuh): Bug 1348: fix this warning.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    if (is_win) {
      cflags += [
        "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
        "/wd4389",  # signed/unsigned mismatch.
      ]
    }

    deps = [
      ":libjingle_peerconnection",
      "../system_wrappers:field_trial_default",
      "../system_wrappers:metrics_default",
    ]

    if (rtc_build_libyuv) {
      deps += [ "$rtc_libyuv_dir" ]
      public_deps = [
        "$rtc_libyuv_dir",
      ]
    } else {
      # Need to add a directory normally exported by libyuv.
      include_dirs += [ "$rtc_libyuv_dir/include" ]
    }
  }
}

if (rtc_include_tests) {
  config("peerconnection_unittests_config") {
    # The warnings below are enabled by default. Since GN orders compiler flags
    # for a target before flags from configs, the only way to disable such
    # warnings is by having them in a separate config, loaded from the target.
    # TODO(kjellander): Make the code compile without disabling these flags.
    # See https://bugs.webrtc.org/3307.
    if (is_clang && is_win) {
      cflags = [ "-Wno-unused-function" ]
    }

    if (!is_win) {
      cflags = [ "-Wno-sign-compare" ]
      cflags_cc = [ "-Wno-overloaded-virtual" ]
    }
  }

  test("peerconnection_unittests") {
    testonly = true
    sources = [
      "datachannel_unittest.cc",
      "dtmfsender_unittest.cc",
      "fakemetricsobserver.cc",
      "fakemetricsobserver.h",
      "jsepsessiondescription_unittest.cc",
      "localaudiosource_unittest.cc",
      "mediaconstraintsinterface_unittest.cc",
      "mediastream_unittest.cc",
      "peerconnection_unittest.cc",
      "peerconnectionendtoend_unittest.cc",
      "peerconnectionfactory_unittest.cc",
      "peerconnectioninterface_unittest.cc",
      "proxy_unittest.cc",
      "rtpsenderreceiver_unittest.cc",
      "statscollector_unittest.cc",
      "test/fakeaudiocapturemodule.cc",
      "test/fakeaudiocapturemodule.h",
      "test/fakeaudiocapturemodule_unittest.cc",
      "test/fakeconstraints.h",
      "test/fakedatachannelprovider.h",
      "test/fakeperiodicvideocapturer.h",
      "test/fakertccertificategenerator.h",
      "test/fakevideotrackrenderer.h",
      "test/mockpeerconnectionobservers.h",
      "test/peerconnectiontestwrapper.cc",
      "test/peerconnectiontestwrapper.h",
      "test/testsdpstrings.h",
      "videocapturertracksource_unittest.cc",
      "videotrack_unittest.cc",
      "webrtcsdp_unittest.cc",
      "webrtcsession_unittest.cc",
    ]

    defines = [ "HAVE_SCTP" ]

    configs += [
      "..:common_config",
      ":peerconnection_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" ]
    }

    # TODO(jschuh): Bug 1348: fix this warning.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    if (is_win) {
      cflags = [
        "/wd4245",  # conversion from int to size_t, signed/unsigned mismatch.
        "/wd4389",  # signed/unsigned mismatch.
      ]
    }

    if (rtc_use_quic) {
      public_deps = [
        "//third_party/libquic",
      ]
      sources += [
        "quicdatachannel_unittest.cc",
        "quicdatatransport_unittest.cc",
      ]
    }

    deps = []
    if (is_android) {
      sources += [
        "test/androidtestinitializer.cc",
        "test/androidtestinitializer.h",
      ]
      deps += [
        ":libjingle_peerconnection_jni",
        "//testing/android/native_test:native_test_support",
      ]
    }

    deps += [
      ":libjingle_peerconnection",
      "..:webrtc_common",
      "../base:rtc_base_tests_utils",
      "../media:rtc_unittest_main",
      "../pc:rtc_pc",
      "../system_wrappers:metrics_default",
      "//testing/gmock",
    ]

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