Modernize host resolution in NetworkQualityEstimatorUtil

Also improved MockHostResolver's handling of LOCAL_ONLY requests.

Bug: 922699
Change-Id: Ib5c94c1212ff06ddcbe97132993702b668e3ece7
Reviewed-on: https://chromium-review.googlesource.com/c/1457464
Commit-Queue: Eric Orth <ericorth@chromium.org>
Auto-Submit: Eric Orth <ericorth@chromium.org>
Reviewed-by: Asanka Herath <asanka@chromium.org>
Cr-Commit-Position: refs/heads/master@{#631841}
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc
index 87a4692..dbb22b3 100644
--- a/net/dns/mock_host_resolver.cc
+++ b/net/dns/mock_host_resolver.cc
@@ -453,6 +453,7 @@
       next_request_id_(1),
       num_resolve_(0),
       num_resolve_from_cache_(0),
+      num_non_local_resolves_(0),
       tick_clock_(base::DefaultTickClock::GetInstance()) {
   rules_map_[HostResolverSource::ANY] = CreateCatchAllHostResolverProc();
   rules_map_[HostResolverSource::SYSTEM] = CreateCatchAllHostResolverProc();
@@ -478,8 +479,10 @@
       request->parameters().cache_usage, &addresses, &stale_info);
   if (rv == OK && !request->parameters().is_speculative)
     request->set_address_results(addresses, std::move(stale_info));
-  if (rv != ERR_DNS_CACHE_MISS)
+  if (rv != ERR_DNS_CACHE_MISS ||
+      request->parameters().source == HostResolverSource::LOCAL_ONLY) {
     return rv;
+  }
 
   // Just like the real resolver, refuse to do anything with invalid
   // hostnames.
@@ -543,7 +546,11 @@
       cache_usage ==
           HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
   if (cache_.get() && cache_allowed) {
-    HostCache::Key key(host.host(), dns_query_type, flags, source);
+    // Local-only requests search the cache for non-local-only results.
+    HostResolverSource effective_source =
+        source == HostResolverSource::LOCAL_ONLY ? HostResolverSource::ANY
+                                                 : source;
+    HostCache::Key key(host.host(), dns_query_type, flags, effective_source);
     const HostCache::Entry* entry;
     HostCache::EntryStaleness stale_info = HostCache::kNotStale;
     if (cache_usage ==
@@ -570,6 +577,7 @@
                                       HostResolverSource source,
                                       AddressList* addresses) {
   DCHECK(rules_map_.find(source) != rules_map_.end());
+  ++num_non_local_resolves_;
 
   AddressList addr;
   int rv = rules_map_[source]->Resolve(host.host(), requested_address_family,
diff --git a/net/dns/mock_host_resolver.h b/net/dns/mock_host_resolver.h
index 9baa3f7..79c4dcf 100644
--- a/net/dns/mock_host_resolver.h
+++ b/net/dns/mock_host_resolver.h
@@ -177,6 +177,9 @@
     return num_resolve_from_cache_;
   }
 
+  // The number of times resolve was attempted non-locally.
+  size_t num_non_local_resolves() const { return num_non_local_resolves_; }
+
   // Returns the RequestPriority of the last call to Resolve() (or
   // DEFAULT_PRIORITY if Resolve() hasn't been called yet).
   RequestPriority last_request_priority() const {
@@ -250,6 +253,7 @@
 
   size_t num_resolve_;
   size_t num_resolve_from_cache_;
+  size_t num_non_local_resolves_;
 
   const base::TickClock* tick_clock_;
 
diff --git a/net/nqe/network_quality_estimator_util.cc b/net/nqe/network_quality_estimator_util.cc
index 91f5fd1b..d12934f 100644
--- a/net/nqe/network_quality_estimator_util.cc
+++ b/net/nqe/network_quality_estimator_util.cc
@@ -4,12 +4,16 @@
 
 #include "net/nqe/network_quality_estimator_util.h"
 
-#include "net/base/address_list.h"
+#include <memory>
+
+#include "base/bind.h"
+#include "base/logging.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
 #include "net/dns/host_resolver.h"
+#include "net/dns/host_resolver_source.h"
 #include "net/log/net_log_with_source.h"
 
 namespace net {
@@ -21,18 +25,20 @@
 bool IsPrivateHost(HostResolver* host_resolver,
                    const HostPortPair& host_port_pair) {
   // Try resolving |host_port_pair.host()| synchronously.
-  HostResolver::RequestInfo resolve_info(host_port_pair);
-  resolve_info.set_allow_cached_response(true);
-  AddressList addresses;
-  // Resolve synchronously using the resolver's cache.
-  int rv = host_resolver->ResolveFromCache(resolve_info, &addresses,
-                                           NetLogWithSource());
+  HostResolver::ResolveHostParameters parameters;
+  parameters.source = HostResolverSource::LOCAL_ONLY;
+  std::unique_ptr<HostResolver::ResolveHostRequest> request =
+      host_resolver->CreateRequest(host_port_pair, NetLogWithSource(),
+                                   parameters);
 
+  int rv = request->Start(base::BindOnce([](int error) { NOTREACHED(); }));
   DCHECK_NE(rv, ERR_IO_PENDING);
-  if (rv == OK && !addresses.empty()) {
+
+  if (rv == OK && request->GetAddressResults() &&
+      !request->GetAddressResults().value().empty()) {
     // Checking only the first address should be sufficient.
-    IPEndPoint ip_end_point = addresses.front();
-    net::IPAddress ip_address = ip_end_point.address();
+    IPEndPoint ip_endpoint = request->GetAddressResults().value().front();
+    IPAddress ip_address = ip_endpoint.address();
     if (!ip_address.IsPubliclyRoutable())
       return true;
   }
diff --git a/net/nqe/network_quality_estimator_util_unittest.cc b/net/nqe/network_quality_estimator_util_unittest.cc
index 0cc8daa..0f464f9 100644
--- a/net/nqe/network_quality_estimator_util_unittest.cc
+++ b/net/nqe/network_quality_estimator_util_unittest.cc
@@ -72,30 +72,25 @@
     EXPECT_EQ(OK, callback.WaitForResult());
   }
 
-  EXPECT_EQ(2u, mock_host_resolver.num_resolve());
+  EXPECT_EQ(2u, mock_host_resolver.num_non_local_resolves());
 
   EXPECT_FALSE(IsPrivateHost(&mock_host_resolver,
                              HostPortPair("2607:f8b0:4006:819::200e", 80)));
-  EXPECT_EQ(1u, mock_host_resolver.num_resolve_from_cache());
 
   EXPECT_TRUE(
       IsPrivateHost(&mock_host_resolver, HostPortPair("192.168.0.1", 443)));
-  EXPECT_EQ(2u, mock_host_resolver.num_resolve_from_cache());
 
   EXPECT_FALSE(
       IsPrivateHost(&mock_host_resolver, HostPortPair("92.168.0.1", 443)));
-  EXPECT_EQ(3u, mock_host_resolver.num_resolve_from_cache());
 
   EXPECT_TRUE(
       IsPrivateHost(&mock_host_resolver, HostPortPair("example1.com", 443)));
-  EXPECT_EQ(4u, mock_host_resolver.num_resolve_from_cache());
 
   EXPECT_FALSE(
       IsPrivateHost(&mock_host_resolver, HostPortPair("example2.com", 443)));
-  EXPECT_EQ(5u, mock_host_resolver.num_resolve_from_cache());
 
   // IsPrivateHost() should have queried only the resolver's cache.
-  EXPECT_EQ(2u, mock_host_resolver.num_resolve());
+  EXPECT_EQ(2u, mock_host_resolver.num_non_local_resolves());
 }
 
 // Verify that IsPrivateHost() returns false for a hostname whose DNS
@@ -118,8 +113,7 @@
   // Not in DNS host cache, so should not be marked as private.
   EXPECT_FALSE(
       IsPrivateHost(&mock_host_resolver, HostPortPair("example3.com", 443)));
-  EXPECT_EQ(0u, mock_host_resolver.num_resolve());
-  EXPECT_EQ(1u, mock_host_resolver.num_resolve_from_cache());
+  EXPECT_EQ(0u, mock_host_resolver.num_non_local_resolves());
 
   {
     // Resolve example3.com so that the resolution entry is cached.
@@ -132,14 +126,13 @@
         NetLogWithSource());
     EXPECT_EQ(ERR_IO_PENDING, rv);
     EXPECT_EQ(OK, callback.WaitForResult());
-    EXPECT_EQ(1u, mock_host_resolver.num_resolve());
+    EXPECT_EQ(1u, mock_host_resolver.num_non_local_resolves());
   }
   EXPECT_TRUE(
       IsPrivateHost(&mock_host_resolver, HostPortPair("example3.com", 443)));
 
   // IsPrivateHost() should have queried only the resolver's cache.
-  EXPECT_EQ(1u, mock_host_resolver.num_resolve());
-  EXPECT_EQ(2u, mock_host_resolver.num_resolve_from_cache());
+  EXPECT_EQ(1u, mock_host_resolver.num_non_local_resolves());
 }
 
 // Verify that IsPrivateHost() returns correct results for local hosts.