# 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")

enable_built_in_dns = !is_ios && !is_proto_quic

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_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_session.cc",
      "dns_session.h",
      "dns_socket_pool.cc",
      "dns_socket_pool.h",
      "dns_transaction.cc",
      "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",
      "host_resolver_source.h",
      "mapped_host_resolver.cc",
      "notify_watcher_mac.cc",
      "notify_watcher_mac.h",
      "record_parsed.cc",
      "record_rdata.cc",
      "serial_worker.cc",
      "serial_worker.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",
    ":host_resolver_manager",
    ":mdns_client",
    "//net",
  ]

  # Whitelist-only 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",
      "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",
  ]

  # Whitelist-only 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",
  ]

  # Whitelist-only 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",
      "dns_util.h",
      "record_parsed.h",
      "record_rdata.h",
    ]
  }

  deps = [
    "//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",
  ]

  # Whitelist-only 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",
  ]
}

source_set("tests") {
  testonly = true
  sources = [
    "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_session_unittest.cc",
    "dns_socket_pool_unittest.cc",
    "dns_transaction_unittest.cc",
    "dns_util_unittest.cc",
    "host_cache_unittest.cc",
    "host_resolver_manager_unittest.cc",
    "mapped_host_resolver_unittest.cc",
    "record_parsed_unittest.cc",
    "record_rdata_unittest.cc",
    "serial_worker_unittest.cc",
  ]

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

  if (enable_built_in_dns) {
    sources += [ "address_sorter_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") {
  testonly = true
  sources = [
    "dns_test_util.cc",
    "mock_host_resolver.cc",
  ]
  public = [
    "dns_test_util.h",
    "mock_host_resolver.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",
  ]
}

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_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_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",
    ]
  }
}
