# 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") {
  visibility = [
    "../../../api:create_network_emulation_manager",
    ":*",
  ]
  if (rtc_include_tests) {
    visibility += [ "../:scenario" ]
  }
  testonly = true
  sources = [
    "cross_traffic.cc",
    "cross_traffic.h",
    "emulated_network_manager.cc",
    "emulated_network_manager.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:network_emulation_manager_api",
    "../../../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_tests_utils",
    "../../../rtc_base:rtc_task_queue",
    "../../../rtc_base:safe_minmax",
    "../../../rtc_base:task_queue_for_test",
    "../../../rtc_base/synchronization:sequence_checker",
    "../../../rtc_base/task_utils:repeating_task",
    "../../../rtc_base/third_party/sigslot",
    "../../../system_wrappers",
    "../../time_controller",
    "//third_party/abseil-cpp/absl/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",
    "../../../api/units:time_delta",
    "../../../call:simulated_network",
    "../../../rtc_base:gunit_helpers",
    "../../../rtc_base:logging",
    "../../../rtc_base:rtc_event",
    "../../../system_wrappers:system_wrappers",
    "../../../test:test_support",
    "//third_party/abseil-cpp/absl/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",
    "../../../rtc_base:gunit_helpers",
    "../../../rtc_base:logging",
    "../../../rtc_base:rtc_event",
    "../../../test:test_support",
    "//third_party/abseil-cpp/absl/memory",
  ]
}

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

rtc_source_set("feedback_generator") {
  testonly = true
  sources = [
    "feedback_generator.cc",
    "feedback_generator.h",
  ]
  deps = [
    "../../../api/transport:test_feedback_generator_interface",
    "../../../call:simulated_network",
    "../../../rtc_base:checks",
    "../../../test/scenario/network:emulated_network",
    "../../../test/time_controller",
    "//third_party/abseil-cpp/absl/memory",
  ]
}

rtc_source_set("feedback_generator_unittest") {
  testonly = true
  sources = [
    "feedback_generator_unittest.cc",
  ]
  deps = [
    "../../../api/transport:test_feedback_generator",
    "../../../test:test_support",
  ]
}

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