# 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_impl") {
  sources = [
    "net/network_chromium.h",
    "net/network_impl.cc",
    "net/network_impl.h",
  ]

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

source_set("unzip_impl") {
  sources = [
    "unzip/unzip_impl.cc",
    "unzip/unzip_impl.h",
  ]
  deps = [
    ":update_client",
    "//components/services/unzip/public/cpp",
  ]
}

source_set("patch_impl") {
  sources = [
    "patch/patch_impl.cc",
    "patch/patch_impl.h",
  ]
  deps = [
    ":update_client",
    "//components/services/patch/public/cpp",
    "//components/services/patch/public/mojom",
    "//mojo/public/cpp/bindings",
  ]
}

group("common_impl") {
  public_deps = [
    ":network_impl",
    ":patch_impl",
    ":unzip_impl",
  ]
}

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",
    "patcher.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_serializer.cc",
    "protocol_serializer.h",
    "protocol_serializer_json.cc",
    "protocol_serializer_json.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",
    "unzipper.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",
  ]

  deps = [
    "//base",
    "//components/client_update_protocol",
    "//components/crx_file",
    "//components/prefs",
    "//components/version_info:version_info",
    "//courgette:courgette_lib",
    "//crypto",
    "//url",
  ]
}

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 = [
    ":network_impl",
    ":patch_impl",
    ":unzip_impl",
    "//base",
    "//components/prefs",
    "//components/services/patch:in_process",
    "//components/services/unzip:in_process",
    "//mojo/public/cpp/bindings",
    "//net:test_support",
    "//services/network:test_support",
    "//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_4.json",
    "//components/test/data/update_client/updatecheck_reply_noupdate.json",
    "//components/test/data/update_client/updatecheck_reply_parse_error.json",
    "//components/test/data/update_client/updatecheck_reply_unknownapp.json",
  ]
  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_serializer_json_unittest.cc",
    "protocol_serializer_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_impl",
    ":patch_impl",
    ":test_support",
    ":unit_tests_bundle_data",
    ":unzip_impl",
    ":update_client",
    "//base",
    "//components/crx_file",
    "//components/prefs",
    "//components/prefs:test_support",
    "//components/services/patch:in_process",
    "//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",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/re2",
  ]
}
