# Copyright (c) 2017 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")
import("//third_party/protobuf/proto_library.gni")

if (rtc_enable_protobuf) {
  proto_library("network_tester_config_proto") {
    sources = [
      "network_tester_config.proto",
    ]
    proto_out_dir = "webrtc/tools/network_tester"
  }

  proto_library("network_tester_packet_proto") {
    sources = [
      "network_tester_packet.proto",
    ]
    proto_out_dir = "webrtc/tools/network_tester"
  }

  rtc_static_library("network_tester") {
    sources = [
      "config_reader.cc",
      "config_reader.h",
      "packet_logger.cc",
      "packet_logger.h",
      "packet_sender.cc",
      "packet_sender.h",
      "test_controller.cc",
      "test_controller.h",
    ]

    defines = [ "WEBRTC_NETWORK_TESTER_PROTO" ]

    deps = [
      ":network_tester_config_proto",
      ":network_tester_packet_proto",
      "../../base:protobuf_utils",
      "../../base:rtc_task_queue",
      "../../p2p",
    ]

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

  network_tester_unittests_resources = [
    "//resources/network_tester/client_config.dat",
    "//resources/network_tester/server_config.dat",
  ]

  if (is_ios) {
    bundle_data("network_tester_unittests_bundle_data") {
      testonly = true
      sources = network_tester_unittests_resources
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  rtc_source_set("network_tester_unittests") {
    testonly = true

    # Skip restricting visibility on mobile platforms since the tests on those
    # gets additional generated targets which would require many lines here to
    # cover (which would be confusing to read and hard to maintain).
    if (!is_android && !is_ios) {
      visibility = [ "//webrtc/tools:tools_unittests" ]
    }
    sources = [
      "network_tester_unittest.cc",
    ]

    deps = [
      ":network_tester",
      "//testing/gtest",
      "//webrtc/base:rtc_base_tests_utils",
      "//webrtc/test:test_support",
    ]

    if (is_ios) {
      deps += [ ":network_tester_unittests_bundle_data" ]
    }

    defines = [
      "GTEST_RELATIVE_PATH",
      "WEBRTC_NETWORK_TESTER_TEST_ENABLED",
    ]

    data = network_tester_unittests_resources

    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_executable("network_tester_server") {
    sources = [
      "server.cc",
    ]

    deps = [
      ":network_tester",
    ]

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

if (is_android) {
  android_apk("NetworkTesterMobile") {
    testonly = true
    apk_name = "NetworkTesterMobile"
    android_manifest = "androidapp/AndroidManifest.xml"

    deps = [
      ":NetworkTesterMobile_javalib",
      ":NetworkTesterMobile_resources",
      "//base:base_java",
      "//webrtc/base:base_java",
    ]

    shared_libraries = [ "//webrtc/tools/network_tester:network_tester_so" ]
  }

  android_library("NetworkTesterMobile_javalib") {
    testonly = true
    android_manifest = "androidapp/AndroidManifest.xml"

    java_files = [
      "androidapp/src/com/google/media/networktester/MainActivity.java",
      "androidapp/src/com/google/media/networktester/NetworkTester.java",
    ]

    deps = [
      ":NetworkTesterMobile_resources",
      "//webrtc/base:base_java",
    ]
  }

  android_resources("NetworkTesterMobile_resources") {
    testonly = true
    resource_dirs = [ "androidapp/res" ]
    custom_package = "com.google.media.networktester"
  }

  rtc_shared_library("network_tester_so") {
    sources = [
      "jni.cpp",
    ]

    deps = [
      ":network_tester",
      "../../system_wrappers:field_trial_default",
    ]

    suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
    configs += [ "//build/config/android:hide_all_but_jni" ]

    output_extension = "so"
  }
}
