# 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/base:logging",
    "//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 = [
    "//components/webrtc:net_address_utils",
    "//components/webrtc:thread_wrapper",
    "//google_apis",
    "//remoting/base:authorization",
    "//remoting/base:test_support",
    "//services/network:network_service",
    "//services/network/public/mojom",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/abseil-cpp:absl",
  ]
}

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",
        "//extensions/browser/api/messaging:native_messaging",
        "//mojo/core/embedder",
        "//remoting/base",
        "//remoting/base:authorization",
        "//remoting/base:logging",
        "//remoting/host",
        "//remoting/host:resources",
        "//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",
      "//remoting/protocol:protocol",
      "//remoting/protocol: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",
      "//remoting/host:resources",
    ]

    if ((is_linux || is_chromeos_lacros) && remoting_use_x11) {
      deps += [
        "//build/config/linux/gtk",
        "//ui/events/platform/x11:x11",
      ]
    }

    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",
      "//remoting/host/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/base:authorization",
    "//remoting/base:logging",
    "//remoting/proto/ftl/v1:ftl_messages",
    "//remoting/signaling",
    "//services/network:network_service",
  ]
}

# 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",
    "//components/webrtc:thread_wrapper",
    "//mojo/core/embedder",
    "//remoting/base",
    "//remoting/base:authorization",
    "//remoting/base:logging",
    "//remoting/signaling",
    "//services/network:network_service",
  ]
}
