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

if (is_android) {
  import("//build/config/android/rules.gni")
}

browser_sources = [
  "data_reduction_proxy_bypass_stats.cc",
  "data_reduction_proxy_bypass_stats.h",
  "data_reduction_proxy_compression_stats.cc",
  "data_reduction_proxy_compression_stats.h",
  "data_reduction_proxy_config.cc",
  "data_reduction_proxy_config.h",
  "data_reduction_proxy_config_service_client.cc",
  "data_reduction_proxy_config_service_client.h",
  "data_reduction_proxy_configurator.cc",
  "data_reduction_proxy_configurator.h",
  "data_reduction_proxy_data.cc",
  "data_reduction_proxy_data.h",
  "data_reduction_proxy_data_use_observer.cc",
  "data_reduction_proxy_data_use_observer.h",
  "data_reduction_proxy_delegate.cc",
  "data_reduction_proxy_delegate.h",
  "data_reduction_proxy_interceptor.cc",
  "data_reduction_proxy_interceptor.h",
  "data_reduction_proxy_io_data.cc",
  "data_reduction_proxy_io_data.h",
  "data_reduction_proxy_metrics.cc",
  "data_reduction_proxy_metrics.h",
  "data_reduction_proxy_mutable_config_values.cc",
  "data_reduction_proxy_mutable_config_values.h",
  "data_reduction_proxy_network_delegate.cc",
  "data_reduction_proxy_network_delegate.h",
  "data_reduction_proxy_pingback_client.h",
  "data_reduction_proxy_prefs.cc",
  "data_reduction_proxy_prefs.h",
  "data_reduction_proxy_request_options.cc",
  "data_reduction_proxy_request_options.h",
  "data_reduction_proxy_service.cc",
  "data_reduction_proxy_service.h",
  "data_reduction_proxy_service_observer.h",
  "data_reduction_proxy_settings.cc",
  "data_reduction_proxy_settings.h",
  "data_reduction_proxy_util.cc",
  "data_reduction_proxy_util.h",
  "data_store.cc",
  "data_store.h",
  "data_usage_store.cc",
  "data_usage_store.h",
  "db_data_owner.cc",
  "db_data_owner.h",
  "network_properties_manager.cc",
  "network_properties_manager.h",
  "secure_proxy_checker.cc",
  "secure_proxy_checker.h",
  "warmup_url_fetcher.cc",
  "warmup_url_fetcher.h",
]

if (is_android) {
  static_library("browser_small") {
    sources = browser_sources

    deps = [
      "//base",
      "//components/data_reduction_proxy/core/common",
      "//components/data_reduction_proxy/proto:data_reduction_proxy_proto",
      "//components/data_use_measurement/core",
      "//components/data_use_measurement/core:ascriber",
      "//components/pref_registry",
      "//components/prefs",
      "//components/variations",
      "//components/variations/net",
      "//content/public/browser",
      "//crypto",
      "//google_apis",
      "//net:net",
      "//services/network/public/cpp",
      "//url:url",
    ]
  }

  java_cpp_enum("data_reduction_proxy_savings_cleared_enum_java") {
    sources = [
      "data_reduction_proxy_compression_stats.h",
    ]
  }
}

static_library("browser") {
  sources = browser_sources
  sources += [
    "data_store_impl.cc",
    "data_store_impl.h",
  ]

  public_deps = [
    "//components/data_reduction_proxy/core/common",
    "//components/data_reduction_proxy/proto:data_reduction_proxy_proto",
  ]
  deps = [
    "//base",
    "//components/data_use_measurement/core",
    "//components/data_use_measurement/core:ascriber",
    "//components/pref_registry",
    "//components/prefs",
    "//components/variations",
    "//components/variations/net",
    "//content/public/browser",
    "//crypto",
    "//google_apis",
    "//net",
    "//services/network:network_service",
    "//services/network/public/cpp",
    "//third_party/leveldatabase",
    "//url",
  ]

  defines = [ "USE_GOOGLE_API_KEYS" ]
  if (!is_ios) {
    defines += [ "USE_GOOGLE_API_KEYS_FOR_AUTH_KEY" ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "data_reduction_proxy_config_service_client_test_utils.cc",
    "data_reduction_proxy_config_service_client_test_utils.h",
    "data_reduction_proxy_config_test_utils.cc",
    "data_reduction_proxy_config_test_utils.h",
    "data_reduction_proxy_settings_test_utils.cc",
    "data_reduction_proxy_settings_test_utils.h",
    "data_reduction_proxy_test_utils.cc",
    "data_reduction_proxy_test_utils.h",
  ]

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

  public_deps = [
    ":browser",
  ]
  deps = [
    "//base",
    "//components/data_reduction_proxy/core/common",
    "//components/data_reduction_proxy/core/common:test_support",
    "//components/prefs:test_support",
    "//components/previews/core:core",
    "//components/previews/core:test_support",
    "//net",
    "//net:test_support",
    "//services/network:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

bundle_data("unit_tests_bundle_data") {
  visibility = [ ":unit_tests" ]
  testonly = true
  sources = [
    "//components/test/data/data_reduction_proxy/direct/block10.html",
    "//components/test/data/data_reduction_proxy/direct/block10.html.mock-http-headers",
    "//components/test/data/data_reduction_proxy/direct/noblock.html",
    "//components/test/data/data_reduction_proxy/direct/noblock.html.mock-http-headers",
    "//components/test/data/data_reduction_proxy/proxy/block10.html",
    "//components/test/data/data_reduction_proxy/proxy/block10.html.mock-http-headers",
    "//components/test/data/data_reduction_proxy/proxy/noblock.html",
    "//components/test/data/data_reduction_proxy/proxy/noblock.html.mock-http-headers",
  ]
  outputs = [
    "{{bundle_resources_dir}}/" +
        "{{source_root_relative_dir}}/{{source_file_part}}",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "data_reduction_proxy_bypass_protocol_unittest.cc",
    "data_reduction_proxy_bypass_stats_unittest.cc",
    "data_reduction_proxy_compression_stats_unittest.cc",
    "data_reduction_proxy_config_service_client_unittest.cc",
    "data_reduction_proxy_config_unittest.cc",
    "data_reduction_proxy_configurator_unittest.cc",
    "data_reduction_proxy_data_unittest.cc",
    "data_reduction_proxy_delegate_unittest.cc",
    "data_reduction_proxy_interceptor_unittest.cc",
    "data_reduction_proxy_io_data_unittest.cc",
    "data_reduction_proxy_metrics_unittest.cc",
    "data_reduction_proxy_mutable_config_values_unittest.cc",
    "data_reduction_proxy_network_delegate_unittest.cc",
    "data_reduction_proxy_prefs_unittest.cc",
    "data_reduction_proxy_request_options_unittest.cc",
    "data_reduction_proxy_settings_unittest.cc",
    "data_reduction_proxy_util_unittest.cc",
    "data_usage_store_unittest.cc",
    "network_properties_manager_unittest.cc",
    "warmup_url_fetcher_unittest.cc",
  ]

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

  deps = [
    ":browser",
    ":test_support",
    ":unit_tests_bundle_data",
    "//base",
    "//base/test:test_support",
    "//components/data_reduction_proxy/core/common:test_support",
    "//components/data_reduction_proxy/proto:data_reduction_proxy_proto",
    "//components/data_use_measurement/core:ascriber",
    "//components/prefs:test_support",
    "//components/previews/core",
    "//components/previews/core:test_support",
    "//components/variations",
    "//content/public/browser",
    "//net:test_support",
    "//services/network:network_service",
    "//services/network:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
