# Copyright (c) 2018 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("../../../webrtc.gni")

rtc_source_set("emulated_network") {
  testonly = true
  sources = [
    "cross_traffic.cc",
    "cross_traffic.h",
    "fake_network_socket.cc",
    "fake_network_socket.h",
    "fake_network_socket_server.cc",
    "fake_network_socket_server.h",
    "network_emulation.cc",
    "network_emulation.h",
    "network_emulation_manager.cc",
    "network_emulation_manager.h",
    "traffic_route.cc",
    "traffic_route.h",
  ]
  deps = [
    "../:column_printer",
    "../../../api:simulated_network_api",
    "../../../api/units:data_rate",
    "../../../api/units:data_size",
    "../../../api/units:time_delta",
    "../../../api/units:timestamp",
    "../../../rtc_base:rtc_base",
    "../../../rtc_base:rtc_task_queue_api",
    "../../../rtc_base:safe_minmax",
    "../../../rtc_base/task_utils:repeating_task",
    "../../../rtc_base/third_party/sigslot:sigslot",
    "../../../system_wrappers:system_wrappers",
    "//third_party/abseil-cpp/absl/memory:memory",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("network_emulation_unittest") {
  testonly = true
  sources = [
    "network_emulation_unittest.cc",
  ]
  deps = [
    ":emulated_network",
    "../../../api:simulated_network_api",
    "../../../call:simulated_network",
    "../../../rtc_base:logging",
    "../../../rtc_base:rtc_event",
    "../../../test:test_support",
    "//third_party/abseil-cpp/absl/memory:memory",
  ]
}

rtc_source_set("network_emulation_pc_unittest") {
  testonly = true
  sources = [
    "network_emulation_pc_unittest.cc",
  ]
  deps = [
    ":emulated_network",
    "../../../api:callfactory_api",
    "../../../api:libjingle_peerconnection_api",
    "../../../api:scoped_refptr",
    "../../../api:simulated_network_api",
    "../../../api/audio_codecs:builtin_audio_decoder_factory",
    "../../../api/audio_codecs:builtin_audio_encoder_factory",
    "../../../api/video_codecs:builtin_video_decoder_factory",
    "../../../api/video_codecs:builtin_video_encoder_factory",
    "../../../call:simulated_network",
    "../../../logging:rtc_event_log_impl_base",
    "../../../media:rtc_audio_video",
    "../../../modules/audio_device:audio_device_impl",
    "../../../p2p:rtc_p2p",
    "../../../pc:pc_test_utils",
    "../../../pc:peerconnection_wrapper",
    "../../../rtc_base:gunit_helpers",
    "../../../rtc_base:logging",
    "../../../rtc_base:rtc_base",
    "../../../rtc_base:rtc_base_tests_utils",
    "../../../rtc_base:rtc_event",
    "../../../test:test_support",
    "//third_party/abseil-cpp/absl/memory:memory",
  ]

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

rtc_source_set("cross_traffic_unittest") {
  testonly = true
  sources = [
    "cross_traffic_unittest.cc",
  ]
  deps = [
    ":emulated_network",
    "../../../api:simulated_network_api",
    "../../../call:simulated_network",
    "../../../rtc_base:logging",
    "../../../rtc_base:rtc_event",
    "../../../test:test_support",
    "//third_party/abseil-cpp/absl/memory:memory",
  ]
}

rtc_source_set("network_emulation_unittests") {
  testonly = true
  deps = [
    ":cross_traffic_unittest",
    ":network_emulation_pc_unittest",
    ":network_emulation_unittest",
  ]
}
