# 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

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",
      "context_host_resolver.cc",
      "context_host_resolver.h",
      "dns_alias_utility.cc",
      "dns_alias_utility.h",
      "dns_config.cc",
      "dns_config_service.cc",
      "dns_config_service.h",
      "dns_hosts.cc",
      "dns_hosts.h",
      "dns_query.cc",
      "dns_query.h",
      "dns_reloader.cc",
      "dns_reloader.h",
      "dns_response.cc",
      "dns_response_result_extractor.cc",
      "dns_response_result_extractor.h",
      "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",
      "https_record_rdata.cc",
      "httpssvc_metrics.cc",
      "httpssvc_metrics.h",
      "mapped_host_resolver.cc",
      "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_win) {
      sources += [
        "address_sorter_win.cc",
        "dns_config_service_win.cc",
        "dns_config_service_win.h",
      ]
    }

    if (is_mac) {
      sources += [
        "dns_config_watcher_mac.cc",
        "dns_config_watcher_mac.h",
        "notify_watcher_mac.cc",
        "notify_watcher_mac.h",
      ]
    }

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

    if (is_android) {
      sources += [
        "dns_config_service_android.cc",
        "dns_config_service_android.h",
      ]
    } else if (is_linux) {
      sources += [
        "dns_config_service_linux.cc",
        "dns_config_service_linux.h",
      ]
    } else 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",
      "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" ]

  allow_circular_includes_from = [ "//net/dns/public" ]
}

# 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",
      "https_record_rdata.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" ]
}

source_set("tests") {
  testonly = true
  sources = [
    "address_info_unittest.cc",
    "context_host_resolver_unittest.cc",
    "dns_alias_utility_unittest.cc",
    "dns_config_service_unittest.cc",
    "dns_hosts_unittest.cc",
    "dns_query_unittest.cc",
    "dns_response_result_extractor_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",
    "https_record_rdata_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_win) {
    sources += [ "dns_config_service_win_unittest.cc" ]
  }

  if (is_android) {
    sources += [ "dns_config_service_android_unittest.cc" ]
  } else if (is_linux) {
    sources += [ "dns_config_service_linux_unittest.cc" ]
  } else 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_https_record_rdata_fuzzer") {
  sources = [ "https_record_rdata_fuzzer.cc" ]
  deps = [
    "//base",
    "//net",
    "//net:net_fuzzer_test_support",
  ]
  dict = "//net/data/fuzzer_dictionaries/net_dns_record_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"
  }
}
