# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//build/util/version.gni")
import("//remoting/remoting_enable.gni")
import("//remoting/remoting_options.gni")
import("//remoting/remoting_version.gni")
import("//testing/test.gni")

# TODO(nicholss): Move this and other defines to version.h.in.
# Various remoting targets need this version definition.
config("version") {
  defines = [ "VERSION=$chrome_version_full" ]
}

config("enable_webrtc_remoting_client") {
  if (!is_official_build && !is_nacl) {
    defines = [ "ENABLE_WEBRTC_REMOTING_CLIENT=1" ]
  }
}

group("remoting_all") {
  testonly = true

  deps = [
    "//remoting:remoting_unittests",
    "//remoting/test:chromoting_test_driver",
    "//remoting/webapp:browser_test_resources",
    "//remoting/webapp:unit_tests",
  ]

  if ((is_linux && !is_chromeos) || is_win || is_mac) {
    deps += [ "//remoting/webapp" ]
  }

  if (is_win) {
    deps += [
      "//remoting:remoting_breakpad_tester",
      "//remoting/host:remoting_console",
      "//remoting/host:remoting_desktop",
    ]

    if (is_chrome_branded) {
      deps += [ "//remoting/host:remoting_host_installation" ]
    }
  }

  if (is_android) {
    deps += [
      "//remoting/android:remoting_apk",
      "//remoting/android:remoting_test_apk",
    ]
  }

  if (enable_remoting_host) {
    deps += [
      "//remoting:remoting_perftests",
      "//remoting/host",
    ]

    if (!is_chromeos && !is_android) {
      deps += [
        "//remoting/host:remoting_native_messaging_manifests",
        "//remoting/host:remoting_start_host",
        "//remoting/host/it2me:remote_assistance_host",
      ]
    }

    # The same target is called differently on Linux.
    # TODO(sergeyu): Rename it to remoting_native_messaging_host on all
    # platforms.
    if (is_win) {
      deps += [ "//remoting/host:remoting_native_messaging_host" ]
    } else if (!is_chromeos && !is_android) {
      deps += [ "//remoting/host:native_messaging_host" ]
    }

    if (is_linux && !is_chromeos) {
      deps += [ "//remoting/host:remoting_dev_me2me_host" ]
    }
  }

  if (enable_me2me_host) {
    deps += [ "//remoting/host:remoting_me2me_host" ]
    if (is_chrome_branded) {
      deps += [ "//remoting/host:remoting_me2me_host_archive" ]
    }
  }

  if (enable_nacl) {
    deps += [ "//remoting/tools/javascript_key_tester" ]
  }
}

if (is_win) {
  # GYP version: remoting/remoting_host_win.gypi:remoting_breakpad_tester
  executable("remoting_breakpad_tester") {
    deps = [
      "//base",
      "//build/win:default_exe_manifest",
      "//remoting/host",
    ]

    configs += [ "//build/config/compiler:wexit_time_destructors" ]

    sources = [
      "tools/breakpad_tester_win.cc",
    ]
  }
}

# GYP version: remoting/remoting_test.gypi:remoting_test_support
source_set("test_support") {
  testonly = true

  deps = [
    "//base",
    "//net",
    "//remoting/base",
    "//remoting/client",
    "//remoting/codec",
    "//remoting/protocol:test_support",
    "//remoting/resources",
    "//remoting/signaling:test_support",
    "//remoting/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]

  if (enable_configuration_policy) {
    deps += [
      "//components/policy:test_support",

      # TODO(zijiehe): This should belong to //components/policy:test_support
      "//components/prefs",
    ]
  }

  if (enable_remoting_host) {
    deps += [ "//remoting/host:test_support" ]
  }
}

test("remoting_unittests") {
  defines = []
  libs = []

  configs += [
    ":version",

    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
  ]

  deps = [
    ":test_support",
    "//base",
    "//google_apis",
    "//remoting/base:unit_tests",
    "//remoting/client:unit_tests",
    "//remoting/protocol:unit_tests",
    "//remoting/signaling:unit_tests",
    "//remoting/test:unit_tests",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/webrtc",
  ]

  if (enable_remoting_host) {
    deps += [
      "//remoting/codec:unit_tests",
      "//remoting/host:unit_tests",
      "//ui/gfx",
    ]
  }

  if (enable_webrtc) {
    deps += [ "//third_party/libjingle:libjingle_webrtc" ]
  }

  if (is_android) {
    deps += [ "//net/android:net_java" ]
  }

  if (is_win) {
    defines += [ "_ALT_NO_EXCEPTIONS" ]

    libs += [
      "rpcrt4.lib",
      "wtsapi32.lib",
    ]
  }

  if (enable_configuration_policy) {
    deps += [ "//components/policy:policy_component_test_support" ]
  }
}

if (enable_remoting_host) {
  test("remoting_perftests") {
    sources = [
      "test/codec_perftest.cc",
      "test/protocol_perftest.cc",
    ]

    configs += [ ":version" ]

    deps = [
      ":test_support",
      "//base",
      "//base/test:run_all_unittests",
      "//base/test:test_support",
      "//net:test_support",
      "//remoting/base",
      "//testing/gtest",
      "//third_party/libjingle",
      "//third_party/webrtc/modules/desktop_capture",
    ]

    if (enable_webrtc) {
      deps += [ "//third_party/libjingle:libjingle_webrtc" ]
    }
  }
}
