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

static_library("test_support") {
  testonly = true

  sources = [
    "cli_util.cc",
    "cli_util.h",
    "cyclic_frame_generator.cc",
    "cyclic_frame_generator.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",
    "remote_connection_observer.h",
    "rgb_value.cc",
    "rgb_value.h",
    "scroll_frame_generator.cc",
    "scroll_frame_generator.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",
    "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_overrides:webrtc_component",
    "//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:webrtc_component",
  ]
}

if (enable_remoting_host && !is_android && !is_chromeos_ash &&
    !is_chromeos_lacros) {
  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_overrides:webrtc_component",
    ]

    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_linux || is_chromeos_lacros) {
      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",
  ]
}
