# 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("//remoting/remoting_options.gni")

static_library("test_support") {
  testonly = true

  sources = [
    "access_token_fetcher.cc",
    "access_token_fetcher.h",
    "chromoting_test_driver_environment.cc",
    "chromoting_test_driver_environment.h",
    "connection_setup_info.cc",
    "connection_setup_info.h",
    "connection_time_observer.cc",
    "connection_time_observer.h",
    "cyclic_frame_generator.cc",
    "cyclic_frame_generator.h",
    "fake_access_token_fetcher.cc",
    "fake_access_token_fetcher.h",
    "fake_host_list_fetcher.cc",
    "fake_host_list_fetcher.h",
    "fake_network_dispatcher.cc",
    "fake_network_dispatcher.h",
    "fake_network_manager.cc",
    "fake_network_manager.h",
    "fake_port_allocator.cc",
    "fake_port_allocator.h",
    "fake_socket_factory.cc",
    "fake_socket_factory.h",
    "fake_test_token_storage.cc",
    "fake_test_token_storage.h",
    "frame_generator_util.cc",
    "frame_generator_util.h",
    "host_info.cc",
    "host_info.h",
    "host_list_fetcher.cc",
    "host_list_fetcher.h",
    "mock_access_token_fetcher.cc",
    "mock_access_token_fetcher.h",
    "remote_connection_observer.h",
    "remote_host_info.cc",
    "remote_host_info.h",
    "rgb_value.cc",
    "rgb_value.h",
    "scroll_frame_generator.cc",
    "scroll_frame_generator.h",
    "test_chromoting_client.cc",
    "test_chromoting_client.h",
    "test_token_storage.cc",
    "test_token_storage.h",
    "test_video_renderer.cc",
    "test_video_renderer.h",
    "video_frame_writer.cc",
    "video_frame_writer.h",
  ]

  public_deps = [
    "//base",
    "//mojo/core/embedder",
    "//net",
    "//remoting/base",
    "//remoting/client",
    "//remoting/client/audio",
    "//remoting/codec:decoder",
    "//remoting/codec:encoder",
    "//remoting/protocol",
    "//remoting/signaling",
    "//services/network:test_support",
    "//third_party/webrtc/modules/desktop_capture",
    "//ui/gfx",
  ]

  deps = [
    "//google_apis",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/webrtc_overrides",
  ]
}

executable("chromoting_test_driver") {
  testonly = true

  sources = [
    "chromoting_test_driver.cc",
    "chromoting_test_driver_tests.cc",
    "chromoting_test_fixture.cc",
    "chromoting_test_fixture.h",
  ]

  deps = [
    ":test_support",
    "//base/test:test_support",
    "//build/win:default_exe_manifest",
    "//testing/gtest",
  ]
}

if (enable_remoting_host && !is_android && !is_chromeos) {
  static_library("fake_connection_event_logger") {
    testonly = true

    sources = [
      "fake_connection_event_logger.cc",
      "fake_connection_event_logger.h",
    ]

    deps = [
      "//remoting/host:common",
      "//remoting/protocol:test_support",
    ]
  }

  static_library("it2me_standalone_host") {
    testonly = true

    sources = [
      "it2me_standalone_host.cc",
      "it2me_standalone_host.h",
    ]

    deps = [
      ":fake_connection_event_logger",
      "//base/test:test_support",
      "//third_party/webrtc/modules/desktop_capture",
    ]

    public_deps = [
      "//remoting/host:test_support",
      "//testing/gmock",
    ]
  }

  executable("it2me_standalone_host_main") {
    testonly = true
    defines = []
    libs = []

    sources = [
      "it2me_standalone_host_main.cc",
    ]

    deps = [
      ":it2me_standalone_host",
    ]

    if (is_desktop_linux) {
      deps += [ "//build/config/linux/gtk" ]
    }

    if (is_win) {
      defines += [ "_ALT_NO_EXCEPTIONS" ]
      deps += [ "//remoting/host/win:dpi_aware_exe_manifest" ]
      libs += [
        "rpcrt4.lib",
        "wtsapi32.lib",
      ]
    }
  }

  # A binary with a specific version of EvaluateCapabilityLocally() for test
  # purpose only.
  executable("capability_test_stub") {
    testonly = true
    sources = [
      "capability_test_stub_main.cc",
    ]

    deps = [
      "//base",
    ]
  }
}

# A binary for testing and fiddling the FTL signaling process.
executable("ftl_signaling_playground") {
  testonly = true
  sources = [
    "ftl_signaling_playground.cc",
    "ftl_signaling_playground.h",
    "ftl_signaling_playground_main.cc",
    "test_oauth_token_factory.cc",
    "test_oauth_token_factory.h",
    "test_token_storage.cc",
    "test_token_storage.h",
  ]
  deps = [
    "//google_apis",
    "//mojo/core/embedder",
    "//remoting/base",
    "//remoting/base:authorization",
    "//remoting/base:test_support",
    "//remoting/signaling",
    "//services/network:network_service",
    "//services/network/public/mojom",
  ]
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "access_token_fetcher_unittest.cc",
    "chromoting_test_driver_environment_unittest.cc",
    "connection_time_observer_unittest.cc",
    "host_list_fetcher_unittest.cc",
    "test_chromoting_client_unittest.cc",
    "test_video_renderer_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//base",
    "//net:test_support",
    "//services/network:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/libyuv",
    "//third_party/webrtc/modules/desktop_capture",
  ]
}
