# 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",
    "rate_counter.cc",
    "rate_counter.h",
    "rsa_key_pair.cc",
    "rsa_key_pair.h",
    "running_samples.cc",
    "running_samples.h",
    "scoped_sc_handle_win.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",
  ]

  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",
    "//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",
      "telemetry_log_writer.cc",
      "url_request_context_getter.cc",
    ]
  }
}

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

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

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

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 += [ "//breakpad" ]
  } else if (is_win) {
    deps += [ "//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_helper_unittest.cc",
    "rate_counter_unittest.cc",
    "rsa_key_pair_unittest.cc",
    "run_all_unittests.cc",
    "running_samples_unittest.cc",
    "telemetry_log_writer_unittest.cc",
    "typed_buffer_unittest.cc",
    "util_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//mojo/edk/system",
    "//net:test_support",
    "//third_party/libyuv",
    "//third_party/webrtc/modules/desktop_capture:primitives",
  ]

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

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