# Copyright 2014 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.

source_set("base") {
  sources = [
    "auto_thread.cc",
    "auto_thread.h",
    "auto_thread_task_runner.cc",
    "auto_thread_task_runner.h",
    "buffered_socket_writer.cc",
    "buffered_socket_writer.h",
    "capabilities.cc",
    "capabilities.h",
    "chromium_url_request.cc",
    "chromium_url_request.h",
    "chromoting_event.cc",
    "chromoting_event.h",
    "compound_buffer.cc",
    "compound_buffer.h",
    "constants.cc",
    "constants.h",
    "leaky_bucket.cc",
    "leaky_bucket.h",
    "name_value_map.h",
    "platform_details.cc",
    "platform_details.h",
    "rate_counter.cc",
    "rate_counter.h",
    "remoting_bot.cc",
    "remoting_bot.h",
    "result.h",
    "rsa_key_pair.cc",
    "rsa_key_pair.h",
    "running_samples.cc",
    "running_samples.h",
    "scoped_sc_handle_win.h",
    "service_urls.cc",
    "service_urls.h",
    "session_options.cc",
    "session_options.h",
    "socket_reader.cc",
    "socket_reader.h",
    "telemetry_log_writer.cc",
    "telemetry_log_writer.h",
    "typed_buffer.h",
    "url_request.h",
    "url_request_context_getter.cc",
    "url_request_context_getter.h",
    "util.cc",
    "util.h",
    "vlog_net_log.cc",
    "vlog_net_log.h",
    "weighted_samples.cc",
    "weighted_samples.h",
  ]

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

  public_deps = [
    "//base",
    "//net",
    "//remoting/proto",
    "//third_party/protobuf:protobuf_lite",
  ]
  deps = [
    "//base/third_party/dynamic_annotations",
    "//google_apis",
    "//third_party/libvpx",
    "//third_party/libyuv",
    "//third_party/webrtc/modules/desktop_capture:primitives",
    "//url",
  ]
  if (is_nacl) {
    sources -= [
      "chromium_url_request.cc",
      "chromoting_event.cc",
      "platform_details.cc",
      "telemetry_log_writer.cc",
      "url_request_context_getter.cc",
    ]
    deps -= [ "//google_apis" ]
  }
}

source_set("authorization") {
  sources = [
    "gaia_oauth_client.cc",
    "gaia_oauth_client.h",
    "oauth_client.h",
    "oauth_token_exchanger.cc",
    "oauth_token_exchanger.h",
    "oauth_token_getter.cc",
    "oauth_token_getter.h",
    "oauth_token_getter_impl.cc",
    "oauth_token_getter_impl.h",
    "oauth_token_getter_proxy.cc",
    "oauth_token_getter_proxy.h",
  ]

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

  public_deps = [
    "//base",
    "//google_apis",
    "//net",
  ]

  deps = [
    "//remoting/proto/remoting/v1:directory_grpc_library",
  ]
}

source_set("breakpad") {
  sources = [
    "breakpad.h",
    "breakpad_linux.cc",
    "breakpad_mac.mm",
    "breakpad_win.cc",
  ]

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

  deps = [
    "//base",
  ]

  if (is_mac) {
    deps += [ "//third_party/breakpad" ]
  } else if (is_win) {
    deps += [ "//third_party/breakpad:breakpad_handler" ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "fake_oauth_token_getter.cc",
    "fake_oauth_token_getter.h",
    "mock_oauth_client.cc",
    "mock_oauth_client.h",
    "test_rsa_key_pair.h",
  ]

  deps = [
    "//remoting/proto",
  ]
  public_deps = [
    ":authorization",
    ":base",
    ":breakpad",
    "//base",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/protobuf:protobuf_lite",
  ]
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "auto_thread_task_runner_unittest.cc",
    "auto_thread_unittest.cc",
    "breakpad_win_unittest.cc",
    "buffered_socket_writer_unittest.cc",
    "capabilities_unittest.cc",
    "compound_buffer_unittest.cc",
    "oauth_token_getter_proxy_unittest.cc",
    "rate_counter_unittest.cc",
    "result_unittest.cc",
    "rsa_key_pair_unittest.cc",
    "run_all_unittests.cc",
    "running_samples_unittest.cc",
    "session_options_unittest.cc",
    "telemetry_log_writer_unittest.cc",
    "typed_buffer_unittest.cc",
    "util_unittest.cc",
    "weighted_samples_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//base",
    "//mojo/core/embedder",
    "//net:test_support",
    "//third_party/libyuv",
    "//third_party/webrtc/modules/desktop_capture:primitives",
  ]

  if (is_win || is_mac || is_chromeos) {
    deps += [ "//third_party/breakpad:client" ]
  }

  if (is_win) {
    libs = [ "rpcrt4.lib" ]  # For UuidCreate in breakpad_win_unittest.cc.
  }
}
