# 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("column_printer") {
  testonly = true
  sources = [
    "column_printer.cc",
    "column_printer.h",
  ]
  deps = [
    "../../rtc_base:macromagic",
    "../../rtc_base:stringutils",
    "../logging:log_writer",
  ]
}

if (is_ios || rtc_include_tests) {
  scenario_resources = [
    "../../resources/difficult_photo_1850_1110.yuv",
    "../../resources/photo_1850_1110.yuv",
    "../../resources/presentation_1850_1110.yuv",
    "../../resources/web_screenshot_1850_1110.yuv",
  ]
  scenario_unittest_resources = [ "../../resources/foreman_cif.yuv" ]
}

if (is_ios) {
  bundle_data("scenario_resources_bundle_data") {
    testonly = true
    sources = scenario_resources
    outputs = [
      "{{bundle_resources_dir}}/{{source_file_part}}",
    ]
  }
  bundle_data("scenario_unittest_resources_bundle_data") {
    testonly = true
    sources = scenario_unittest_resources
    outputs = [
      "{{bundle_resources_dir}}/{{source_file_part}}",
    ]
  }
}
if (rtc_include_tests) {
  rtc_source_set("scenario") {
    testonly = true
    sources = [
      "audio_stream.cc",
      "audio_stream.h",
      "call_client.cc",
      "call_client.h",
      "hardware_codecs.cc",
      "hardware_codecs.h",
      "network_node.cc",
      "network_node.h",
      "quality_info.h",
      "quality_stats.cc",
      "quality_stats.h",
      "scenario.cc",
      "scenario.h",
      "scenario_config.cc",
      "scenario_config.h",
      "simulated_time.cc",
      "simulated_time.h",
      "video_stream.cc",
      "video_stream.h",
    ]
    deps = [
      ":column_printer",
      "../:fake_video_codecs",
      "../:fileutils",
      "../:test_common",
      "../:test_support",
      "../:video_test_common",
      "../../api:fec_controller_api",
      "../../api:libjingle_peerconnection_api",
      "../../api:transport_api",
      "../../api/audio_codecs:builtin_audio_decoder_factory",
      "../../api/audio_codecs:builtin_audio_encoder_factory",
      "../../api/test/video:function_video_factory",
      "../../api/transport:network_control",
      "../../api/units:data_rate",
      "../../api/units:data_size",
      "../../api/units:time_delta",
      "../../api/units:timestamp",
      "../../api/video:builtin_video_bitrate_allocator_factory",
      "../../api/video:video_frame",
      "../../api/video:video_frame_i420",
      "../../api/video_codecs:video_codecs_api",
      "../../audio",
      "../../call",
      "../../call:call_interfaces",
      "../../call:rtp_sender",
      "../../call:simulated_network",
      "../../call:video_stream_api",
      "../../common_video",
      "../../logging:rtc_event_log_api",
      "../../logging:rtc_event_log_impl_base",
      "../../logging:rtc_event_log_impl_output",
      "../../media:rtc_audio_video",
      "../../media:rtc_internal_video_codecs",
      "../../media:rtc_media_base",
      "../../modules/audio_device",
      "../../modules/audio_device:audio_device_impl",
      "../../modules/audio_device:mock_audio_device",
      "../../modules/audio_mixer:audio_mixer_impl",
      "../../modules/audio_processing",
      "../../modules/congestion_controller:test_controller_printer",
      "../../modules/congestion_controller/goog_cc:test_goog_cc_printer",
      "../../modules/rtp_rtcp",
      "../../modules/rtp_rtcp:mock_rtp_rtcp",
      "../../modules/rtp_rtcp:rtp_rtcp_format",
      "../../modules/video_coding:video_codec_interface",
      "../../modules/video_coding:video_coding_utility",
      "../../modules/video_coding:webrtc_h264",
      "../../modules/video_coding:webrtc_multiplex",
      "../../modules/video_coding:webrtc_vp8",
      "../../modules/video_coding:webrtc_vp9",
      "../../rtc_base",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
      "../../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",
      "../../system_wrappers",
      "../../system_wrappers:field_trial",
      "../../video",
      "../logging:log_writer",
      "../time_controller",
      "network:emulated_network",
      "//third_party/abseil-cpp/absl/memory",
      "//third_party/abseil-cpp/absl/types:optional",
    ]
    if (is_android) {
      deps += [ "../../modules/video_coding:android_codec_factory_helper" ]
    } else if (is_ios || is_mac) {
      deps += [ "../../modules/video_coding:objc_codec_factory_helper" ]
    }
    if (rtc_enable_protobuf) {
      deps += [ "../../modules/audio_coding:ana_config_proto" ]
    }
    data = scenario_resources
    if (is_ios) {
      deps += [ ":scenario_resources_bundle_data" ]
    }
  }
  rtc_source_set("scenario_unittests") {
    testonly = true
    sources = [
      "quality_stats_unittest.cc",
      "scenario_unittest.cc",
      "video_stream_unittest.cc",
    ]
    deps = [
      ":scenario",
      "../../logging:mocks",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
      "../../system_wrappers",
      "../../system_wrappers:field_trial",
      "../../test:field_trial",
      "../../test:test_support",
      "//testing/gmock",
      "//third_party/abseil-cpp/absl/memory",
    ]
    data = scenario_unittest_resources
    if (is_ios) {
      deps += [ ":scenario_unittest_resources_bundle_data" ]
    }
  }
}
