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

import("//net/features.gni")

source_set("network_public") {
  sources = [
    "net/network_chromium.h",
  ]

  deps = [
    "//base",
  ]
}

source_set("network") {
  sources = [
    "net/network_impl.cc",
    "net/network_impl.h",
  ]

  visibility = [ ":*" ]

  deps = [
    ":network_public",
    "//base",
    "//net",
    "//services/network/public/cpp:cpp",
    "//url",
  ]
}

static_library("update_client") {
  sources = [
    "action_runner.cc",
    "action_runner.h",
    "action_runner_win.cc",
    "activity_data_service.h",
    "background_downloader_win.cc",
    "background_downloader_win.h",
    "command_line_config_policy.cc",
    "command_line_config_policy.h",
    "component.cc",
    "component.h",
    "component_patcher.cc",
    "component_patcher.h",
    "component_patcher_operation.cc",
    "component_patcher_operation.h",
    "component_unpacker.cc",
    "component_unpacker.h",
    "configurator.h",
    "crx_downloader.cc",
    "crx_downloader.h",
    "crx_update_item.h",
    "network.cc",
    "network.h",
    "persisted_data.cc",
    "persisted_data.h",
    "ping_manager.cc",
    "ping_manager.h",
    "protocol_definition.cc",
    "protocol_definition.h",
    "protocol_handler.cc",
    "protocol_handler.h",
    "protocol_parser.cc",
    "protocol_parser.h",
    "protocol_parser_json.cc",
    "protocol_parser_json.h",
    "protocol_parser_xml.cc",
    "protocol_parser_xml.h",
    "protocol_serializer.cc",
    "protocol_serializer.h",
    "protocol_serializer_json.cc",
    "protocol_serializer_json.h",
    "protocol_serializer_xml.cc",
    "protocol_serializer_xml.h",
    "request_sender.cc",
    "request_sender.h",
    "task.h",
    "task_send_uninstall_ping.cc",
    "task_send_uninstall_ping.h",
    "task_traits.h",
    "task_update.cc",
    "task_update.h",
    "update_checker.cc",
    "update_checker.h",
    "update_client.cc",
    "update_client.h",
    "update_client_errors.h",
    "update_client_internal.h",
    "update_engine.cc",
    "update_engine.h",
    "update_query_params.cc",
    "update_query_params.h",
    "update_query_params_delegate.cc",
    "update_query_params_delegate.h",
    "updater_state.cc",
    "updater_state.h",
    "updater_state_mac.mm",
    "updater_state_win.cc",
    "url_fetcher_downloader.cc",
    "url_fetcher_downloader.h",
    "utils.cc",
    "utils.h",
  ]

  # Allows callers to include the network factory through "update_client" deps.
  public_deps = [
    ":network_public",
  ]

  deps = [
    ":network",
    ":network_public",
    "//base",
    "//components/client_update_protocol",
    "//components/crx_file",
    "//components/data_use_measurement/core",
    "//components/prefs",
    "//components/services/patch/public/cpp",
    "//components/services/unzip/public/cpp",
    "//components/version_info:version_info",
    "//courgette:courgette_lib",
    "//crypto",
    "//third_party/libxml",
    "//url",
  ]

  allow_circular_includes_from = [
    ":network",
    ":network_public",
  ]
}

static_library("test_support") {
  testonly = true
  sources = [
    "net/url_loader_post_interceptor.cc",
    "net/url_loader_post_interceptor.h",
    "test_configurator.cc",
    "test_configurator.h",
    "test_installer.cc",
    "test_installer.h",
  ]

  public_deps = [
    ":update_client",
  ]

  deps = [
    "//base",
    "//components/prefs",
    "//components/services/patch:lib",
    "//components/services/unzip:lib",
    "//mojo/public/cpp/bindings",
    "//net:test_support",
    "//services/network:test_support",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp/test:test_support",
    "//services/service_manager/public/mojom",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]
}

bundle_data("unit_tests_bundle_data") {
  visibility = [ ":unit_tests" ]
  testonly = true
  sources = [
    "//components/test/data/update_client/binary_bsdiff_patch.bin",
    "//components/test/data/update_client/binary_courgette_patch.bin",
    "//components/test/data/update_client/binary_input.bin",
    "//components/test/data/update_client/binary_output.bin",
    "//components/test/data/update_client/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx",
    "//components/test/data/update_client/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx",
    "//components/test/data/update_client/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx",
    "//components/test/data/update_client/jebgalgnebhfojomionfpkfelancnnkf.crx",
    "//components/test/data/update_client/runaction_test_win.crx3",
    "//components/test/data/update_client/updatecheck_reply_1.json",
    "//components/test/data/update_client/updatecheck_reply_1.xml",
    "//components/test/data/update_client/updatecheck_reply_4.json",
    "//components/test/data/update_client/updatecheck_reply_4.xml",
    "//components/test/data/update_client/updatecheck_reply_noupdate.json",
    "//components/test/data/update_client/updatecheck_reply_noupdate.xml",
    "//components/test/data/update_client/updatecheck_reply_parse_error.json",
    "//components/test/data/update_client/updatecheck_reply_parse_error.xml",
    "//components/test/data/update_client/updatecheck_reply_unknownapp.json",
    "//components/test/data/update_client/updatecheck_reply_unknownapp.xml",
  ]
  outputs = [
    "{{bundle_resources_dir}}/" +
        "{{source_root_relative_dir}}/{{source_file_part}}",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "component_patcher_unittest.cc",
    "component_patcher_unittest.h",
    "component_unpacker_unittest.cc",
    "persisted_data_unittest.cc",
    "ping_manager_unittest.cc",
    "protocol_parser_json_unittest.cc",
    "protocol_parser_xml_unittest.cc",
    "protocol_serializer_json_unittest.cc",
    "protocol_serializer_unittest.cc",
    "protocol_serializer_xml_unittest.cc",
    "request_sender_unittest.cc",
    "update_checker_unittest.cc",
    "update_client_unittest.cc",
    "update_query_params_unittest.cc",
    "updater_state_unittest.cc",
    "utils_unittest.cc",
  ]

  if (!disable_file_support) {
    sources += [ "crx_downloader_unittest.cc" ]
  }

  deps = [
    ":network",
    ":test_support",
    ":unit_tests_bundle_data",
    ":update_client",
    "//base",
    "//components/crx_file",
    "//components/prefs",
    "//components/prefs:test_support",
    "//components/services/patch:lib",
    "//components/version_info:version_info",
    "//courgette:courgette_lib",
    "//net:test_support",
    "//services/network:test_support",
    "//services/network/public/cpp:cpp",
    "//services/network/public/cpp:cpp_base",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/libxml",
    "//third_party/re2",
  ]
}
