# Copyright 2018 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")
import("//testing/libfuzzer/fuzzer_test.gni")

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

enable_built_in_dns = !is_ios

source_set("dns") {
  # Due to circular dependencies, should only be depended on through //net.
  visibility = [
    "//net",
    "//net/http:transport_security_state_generated_files",
  ]

  # Internals only intended for use inside network stack (and tests).
  friend = [
    "//chrome/browser:test_support",
    "//chrome/test/*",
    "//components/certificate_transparency:unit_tests",
    "//components/cronet/*",
    "//net/*",
    "//services/network/*",
  ]

  public = []
  sources = [
    "dns_util.cc",
    "dns_util.h",
  ]

  if (!is_nacl) {
    sources += [
      "address_info.cc",
      "address_info.h",
      "address_sorter.h",
      "address_sorter_win.cc",
      "context_host_resolver.cc",
      "context_host_resolver.h",
      "dns_config.cc",
      "dns_config_overrides.cc",
      "dns_config_service.cc",
      "dns_config_service.h",
      "dns_config_service_win.cc",
      "dns_config_service_win.h",
      "dns_config_watcher_mac.cc",
      "dns_config_watcher_mac.h",
      "dns_hosts.cc",
      "dns_hosts.h",
      "dns_query.cc",
      "dns_query.h",
      "dns_reloader.cc",
      "dns_reloader.h",
      "dns_response.cc",
      "dns_server_iterator.cc",
      "dns_server_iterator.h",
      "dns_session.cc",
      "dns_session.h",
      "dns_socket_allocator.cc",
      "dns_socket_allocator.h",
      "dns_transaction.cc",
      "dns_udp_tracker.cc",
      "dns_udp_tracker.h",
      "host_cache.cc",
      "host_resolver.cc",
      "host_resolver_manager.cc",
      "host_resolver_mdns_listener_impl.cc",
      "host_resolver_mdns_listener_impl.h",
      "host_resolver_mdns_task.cc",
      "host_resolver_mdns_task.h",
      "host_resolver_proc.cc",
      "host_resolver_proc.h",
      "httpssvc_metrics.cc",
      "httpssvc_metrics.h",
      "mapped_host_resolver.cc",
      "notify_watcher_mac.cc",
      "notify_watcher_mac.h",
      "record_parsed.cc",
      "record_rdata.cc",
      "resolve_context.cc",
      "resolve_context.h",
      "serial_worker.cc",
      "serial_worker.h",
      "system_dns_config_change_notifier.cc",
      "system_dns_config_change_notifier.h",
    ]

    if (is_fuchsia) {
      sources += [
        "dns_config_service_fuchsia.cc",
        "dns_config_service_fuchsia.h",
      ]
    }

    if (is_posix) {
      sources += [
        "dns_config_service_posix.cc",
        "dns_config_service_posix.h",
      ]
    }

    if (enable_built_in_dns) {
      sources += [ "dns_client.cc" ]

      if (is_posix || is_fuchsia) {
        sources += [
          "address_sorter_posix.cc",
          "address_sorter_posix.h",
        ]
      }
    }

    if (enable_mdns) {
      sources += [
        "mdns_cache.cc",
        "mdns_cache.h",
        "mdns_client.cc",
        "mdns_client_impl.cc",
        "mdns_client_impl.h",
      ]
    }
  }

  deps = [ "//net:net_deps" ]

  public_deps = [
    ":dns_client",
    ":host_resolver",
    ":host_resolver_manager",
    ":mdns_client",
    "//net:net_public_deps",
  ]

  allow_circular_includes_from = [
    ":dns_client",
    ":host_resolver",
    ":host_resolver_manager",
    ":mdns_client",
  ]
}

# The standard API of net/dns.
#
# Should typically only be used within the network service. Usage external to
# the network service should instead use network service Mojo IPCs for host
# resolution. See ResolveHost() in
# /services/network/public/mojom/network_context.mojom and
# /services/network/public/mojom/host_resolver.mojom.
source_set("host_resolver") {
  # Due to circular dependencies, should only be depended on through //net.
  # Limit visibility to //net and other source_sets with the same access
  # restriction.
  visibility = [
    ":dns",
    ":dns_client",
    ":host_resolver_manager",
    ":mdns_client",
    "//net",
  ]

  # Restricted access so we can keep track of all usage external to the
  # network stack and network service.
  friend = [
    # chromecast/browser/url_request_context_factory.cc
    # URLRequestContext creation for chromecast.
    "//chromecast/browser",

    # URLRequestContext and HttpNetworkSession::Context creation for iOS.
    "//ios/components/io_thread",
    "//ios/web/shell",
    "//ios/web_view:*",

    # Tests and test support.
    "//chrome/browser:test_support",
    "//chrome/test:browser_tests",
    "//chrome/test:unit_tests",
    "//components/grpc_support/test:unit_tests",
    "//content/shell:content_shell_lib",

    # Stand-alone tools.
    "//google_apis/gcm:mcs_probe",

    # Network stack/service.
    "//components/certificate_transparency/*",
    "//components/cronet/*",
    "//net/*",
    "//services/network/*",

    # The proxy resolution service uses its own host cache and HostResolver Mojo
    # wrapper.
    "//services/proxy_resolver/*",
  ]

  sources = []
  public = []

  if (!is_nacl) {
    sources += [
      "dns_config.h",
      "dns_config_overrides.h",
      "host_cache.h",
      "host_resolver.h",
      "host_resolver_source.h",
      "mapped_host_resolver.h",
    ]
  }

  deps = [
    "//net:net_deps",
    "//net/dns/public",
  ]
  public_deps = [ "//net:net_public_deps" ]
}

# Shared mostly-global handler of HostResolver requests.
#
# Typically should only be directly interacted with by NetworkService (or other
# mostly-global creators of request contexts), standalone tools, and tests. Host
# resolution should generally instead go through HostResolvers received from
# URLRequestContext or network service Mojo IPCs.
source_set("host_resolver_manager") {
  # Due to circular dependencies, should only be depended on through //net.
  # Limit visibility to //net and other source_sets with the same access
  # restriction.
  visibility = [
    ":dns",
    ":host_resolver",
    "//net",
  ]

  # Restricted access so we can keep track of all usage external to the
  # network stack and network service.
  friend = [
    # chromecast/browser/url_request_context_factory.cc
    # URLRequestContext creation for chromecast.
    "//chromecast/browser",

    # Tests and test support.
    "//components/cronet:cronet_common_unittests",

    # Network stack/service.
    "//net/*",
    "//services/network/*",
  ]

  sources = []
  public = []

  if (!is_nacl) {
    sources += [ "host_resolver_manager.h" ]
  }

  deps = [
    ":host_resolver",
    "//net:net_deps",
    "//net/dns/public",
  ]
  public_deps = [ "//net:net_public_deps" ]
}

# DnsClient interfaces. Primarily intended as part of the implementation of the
# standard HostResolver interface, but can be used as an alternative external
# interface for advanced usage.
source_set("dns_client") {
  # Due to circular dependencies, should only be depended on through //net.
  # Limit visibility to //net and other source_sets with the same access
  # restriction.
  visibility = [
    ":dns",
    ":mdns_client",
    "//net",
  ]

  # Restricted access so we can keep track of all usage external to the
  # network stack.
  friend = [
    # chrome/browser/local_discovery/service_discovery_client_impl.cc
    # Result parsing utilities for parsing results read through MdnsClient.
    # TODO(crbug.com/874662): Remove once migrated to network service.
    "//chrome/browser",

    # chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.cc
    # Result parsing for results read through MdnsClient.
    # TODO(crbug.com/902531): Remove once migrated to network service.
    "//chrome/browser/chromeos",

    # Tests and test support
    "//chrome/browser:test_support",
    "//chrome/test/*",

    # Network stack/service
    "//components/certificate_transparency/*",
    "//net/*",
    "//services/network/*",
  ]

  sources = []
  public = []

  if (!is_nacl) {
    sources += [
      "dns_client.h",
      "dns_response.h",
      "dns_transaction.h",
      "record_parsed.h",
      "record_rdata.h",
    ]
  }

  deps = [
    ":host_resolver",
    "//net:net_deps",
  ]
  public_deps = [
    "//net:net_public_deps",
    "//net/dns/public",
  ]
}

# MdnsClient interfaces.
source_set("mdns_client") {
  # Due to circular dependencies, should only be depended on through //net.
  # Limit visibility to //net and other source_sets with the same access
  # restriction.
  visibility = [
    ":dns",
    "//net",
  ]

  # Restricted access so we can keep track of all usage external to the
  # network stack.
  friend = [
    # chrome/browser/local_discovery/service_discovery_client_mdns.h
    # chrome/browser/local_discovery/service_discovery_client_impl.h
    # Makes MDNS queries using MDnsClient.
    # TODO(crbug.com/874662): Remove once migrated to network service.
    "//chrome/browser",

    # chrome/tools/service_discovery_sniffer/service_discovery_sniffer.cc
    # Creates MDnsClient instance and passes to ServiceDiscoveryClientImpl.
    # TODO(crbug.com/874662): Remove once discovery client migrated.
    "//chrome/tools/service_discovery_sniffer",

    # chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h
    # chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.cc
    # Makes MDNS queries using MDnsClient.
    # TODO(crbug.com/902531): Remove once migrated to network service.
    "//chrome/browser/chromeos",

    # Tests and test support
    "//chrome/browser:test_support",

    # Network stack/service
    "//net/*",
    "//services/network/*",
  ]

  public = []
  sources = []

  if (!is_nacl && enable_mdns) {
    sources += [ "mdns_client.h" ]
  }

  deps = [
    ":dns_client",
    ":host_resolver",
    "//net:net_deps",
  ]
  public_deps = [ "//net:net_public_deps" ]
}

if (is_android) {
  java_cpp_enum("secure_dns_mode_generated_enum") {
    sources = [ "dns_config.h" ]
  }
}

source_set("tests") {
  testonly = true
  sources = [
    "address_info_unittest.cc",
    "context_host_resolver_unittest.cc",
    "dns_config_service_unittest.cc",
    "dns_config_service_win_unittest.cc",
    "dns_hosts_unittest.cc",
    "dns_query_unittest.cc",
    "dns_response_unittest.cc",
    "dns_socket_allocator_unittest.cc",
    "dns_transaction_unittest.cc",
    "dns_udp_tracker_unittest.cc",
    "dns_util_unittest.cc",
    "host_cache_unittest.cc",
    "host_resolver_manager_unittest.cc",
    "httpssvc_metrics_unittest.cc",
    "mapped_host_resolver_unittest.cc",
    "record_parsed_unittest.cc",
    "record_rdata_unittest.cc",
    "resolve_context_unittest.cc",
    "serial_worker_unittest.cc",
    "system_dns_config_change_notifier_unittest.cc",
  ]

  if (is_posix) {
    sources += [ "dns_config_service_posix_unittest.cc" ]
  }

  if (enable_built_in_dns) {
    sources += [
      "address_sorter_unittest.cc",
      "dns_client_unittest.cc",
    ]
    if (is_posix || is_fuchsia) {
      sources += [ "address_sorter_posix_unittest.cc" ]
    }
  }

  if (enable_mdns) {
    sources += [
      "mdns_cache_unittest.cc",
      "mdns_client_unittest.cc",
    ]
  }

  deps = [
    "//base",
    "//net",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

source_set("test_support") {
  visibility = [ "//net:test_support" ]
  testonly = true
  sources = [
    "address_info_test_util.cc",
    "dns_test_util.cc",
    "mock_host_resolver.cc",
    "test_dns_config_service.cc",
  ]
  public = [
    "address_info_test_util.h",
    "dns_test_util.h",
    "mock_host_resolver.h",
    "test_dns_config_service.h",
  ]

  if (enable_mdns) {
    sources += [
      "mock_mdns_client.cc",
      "mock_mdns_socket_factory.cc",
    ]
    public += [
      "mock_mdns_client.h",
      "mock_mdns_socket_factory.h",
    ]
  }

  deps = [
    "//base",
    "//net",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

if (use_fuzzing_engine) {
  # fuzzer_test targets are no-op when |use_fuzzing_engine| is false. Fuzzer
  # support targets should be disabled too.
  source_set("fuzzer_test_support") {
    testonly = true
    sources = [
      "fuzzed_host_resolver_util.cc",
      "fuzzed_host_resolver_util.h",
    ]
    deps = [
      "//base",
      "//base/test:test_support",
      "//net",
    ]
  }
}

fuzzer_test("net_dns_host_cache_fuzzer") {
  sources = [ "host_cache_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
  dict = "//testing/libfuzzer/fuzzers/dicts/json.dict"
}

fuzzer_test("net_dns_hosts_parse_fuzzer") {
  sources = [ "dns_hosts_parse_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
  dict = "//net/data/fuzzer_dictionaries/net_dns_hosts_parse_fuzzer.dict"
}

fuzzer_test("net_dns_integrity_record_fuzzer") {
  sources = [ "integrity_record_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
}

fuzzer_test("net_dns_record_fuzzer") {
  sources = [ "dns_record_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
  dict = "//net/data/fuzzer_dictionaries/net_dns_record_fuzzer.dict"
}

fuzzer_test("net_dns_query_parse_fuzzer") {
  sources = [ "dns_query_parse_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
  dict = "//net/data/fuzzer_dictionaries/net_dns_record_fuzzer.dict"
}

fuzzer_test("net_dns_response_fuzzer") {
  sources = [ "dns_response_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
  dict = "//net/data/fuzzer_dictionaries/net_dns_record_fuzzer.dict"
}

fuzzer_test("net_host_resolver_manager_fuzzer") {
  sources = [ "host_resolver_manager_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
    "//net:test_support",
  ]
  dict = "//net/data/fuzzer_dictionaries/net_host_resolver_manager_fuzzer.dict"
}

if (is_win) {
  fuzzer_test("net_dns_parse_domain_ascii_win_fuzzer") {
    sources = [ "dns_parse_domain_ascii_win_fuzzer.cc" ]
    deps = [
      "//base",
      "//net",
      "//net:net_fuzzer_test_support",
    ]
    dict = "//net/data/fuzzer_dictionaries/net_dns_hosts_parse_fuzzer.dict"
    seed_corpus = "//net/data/fuzzer_data/dns_parse_domain_ascii_win_fuzzer"
  }
}
