# 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",
    "cli_util.cc",
    "cli_util.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_ice_connection.cc",
    "fake_ice_connection.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",
    "fake_webrtc_connection.cc",
    "fake_webrtc_connection.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_device_id_provider.cc",
    "test_device_id_provider.h",
    "test_oauth_token_getter.cc",
    "test_oauth_token_getter.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",
    "//remoting/base:authorization",
    "//remoting/base:test_support",
    "//services/network:network_service",
    "//services/network/public/mojom",
    "//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",
    ]
  }

  if (!is_win) {
    # A binary for starting an IT2ME host from command line.
    executable("it2me_cli_host") {
      testonly = true
      sources = [
        "it2me_cli_host.cc",
        "it2me_cli_host.h",
        "it2me_cli_host_main.cc",
      ]
      deps = [
        ":test_support",
        "//mojo/core/embedder",
        "//remoting/base",
        "//remoting/host",
        "//remoting/host/it2me:common",
        "//remoting/host/native_messaging",
      ]
    }
  }

  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 FTL services.
executable("ftl_services_playground") {
  testonly = true
  sources = [
    "ftl_services_playground.cc",
    "ftl_services_playground.h",
    "ftl_services_playground_main.cc",
  ]
  deps = [
    ":test_support",
    "//mojo/core/embedder",
    "//remoting/base",
    "//remoting/signaling",
  ]
}

# 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",
  ]
  deps = [
    ":test_support",
    "//mojo/core/embedder",
    "//remoting/base",
    "//remoting/signaling",
  ]
}

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