Index: net/dns/host_resolver_impl_unittest.cc |
diff --git a/net/dns/host_resolver_impl_unittest.cc b/net/dns/host_resolver_impl_unittest.cc |
index 9ff359f14b35ca424bb62452350467fbd584b9df..a26213152621ae37745e76990f9c5873e9f437fc 100644 |
--- a/net/dns/host_resolver_impl_unittest.cc |
+++ b/net/dns/host_resolver_impl_unittest.cc |
@@ -177,6 +177,16 @@ class MockHostResolverProc : public HostResolverProc { |
DISALLOW_COPY_AND_ASSIGN(MockHostResolverProc); |
}; |
+bool AddressListContains(const AddressList& list, const std::string& address, |
+ int port) { |
+ IPAddressNumber ip; |
+ bool rv = ParseIPLiteralToNumber(address, &ip); |
+ DCHECK(rv); |
+ return std::find(list.begin(), |
+ list.end(), |
+ IPEndPoint(ip, port)) != list.end(); |
+} |
+ |
// A wrapper for requests to a HostResolver. |
class Request { |
public: |
@@ -231,12 +241,7 @@ class Request { |
bool pending() const { return handle_ != NULL; } |
bool HasAddress(const std::string& address, int port) const { |
- IPAddressNumber ip; |
- bool rv = ParseIPLiteralToNumber(address, &ip); |
- DCHECK(rv); |
- return std::find(list_.begin(), |
- list_.end(), |
- IPEndPoint(ip, port)) != list_.end(); |
+ return AddressListContains(list_, address, port); |
} |
// Returns the number of addresses in |list_|. |
@@ -1482,4 +1487,67 @@ TEST_F(HostResolverImplDnsTest, DontDisableDnsClientOnSporadicFailure) { |
EXPECT_EQ(OK, req->WaitForResult()); |
} |
+// Confirm that resolving "localhost" is unrestricted even if there are no |
+// global IPv6 address. See SystemHostResolverCall for rationale. |
+// Test both the DnsClient and system host resolver paths. |
+TEST_F(HostResolverImplDnsTest, DualFamilyLocalhost) { |
+ // Use regular SystemHostResolverCall! |
+ scoped_refptr<HostResolverProc> proc(new SystemHostResolverProc()); |
+ resolver_.reset(new HostResolverImpl(HostCache::CreateDefaultCache(), |
+ DefaultLimits(), |
+ DefaultParams(proc), |
+ NULL)); |
+ resolver_->SetDnsClient(CreateMockDnsClient(DnsConfig(), dns_rules_)); |
+ resolver_->SetDefaultAddressFamily(ADDRESS_FAMILY_IPV4); |
+ |
+ // Get the expected output. |
+ AddressList addrlist; |
+ int rv = proc->Resolve("localhost", ADDRESS_FAMILY_UNSPECIFIED, 0, &addrlist, |
+ NULL); |
+ if (rv != OK) |
+ return; |
+ |
+ for (unsigned i = 0; i < addrlist.size(); ++i) |
+ LOG(WARNING) << addrlist[i].ToString(); |
+ |
+ bool saw_ipv4 = AddressListContains(addrlist, "127.0.0.1", 0); |
+ bool saw_ipv6 = AddressListContains(addrlist, "::1", 0); |
+ if (!saw_ipv4 && !saw_ipv6) |
+ return; |
+ |
+ HostResolver::RequestInfo info(HostPortPair("localhost", 80)); |
+ info.set_address_family(ADDRESS_FAMILY_UNSPECIFIED); |
+ info.set_host_resolver_flags(HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6); |
+ |
+ // Try without DnsClient. |
+ ChangeDnsConfig(DnsConfig()); |
+ Request* req = CreateRequest(info); |
+ // It is resolved via getaddrinfo, so expect asynchronous result. |
+ EXPECT_EQ(ERR_IO_PENDING, req->Resolve()); |
+ EXPECT_EQ(OK, req->WaitForResult()); |
+ |
+ EXPECT_EQ(saw_ipv4, req->HasAddress("127.0.0.1", 80)); |
+ EXPECT_EQ(saw_ipv6, req->HasAddress("::1", 80)); |
+ |
+ // Configure DnsClient with dual-host HOSTS file. |
+ DnsConfig config = CreateValidDnsConfig(); |
+ DnsHosts hosts; |
+ IPAddressNumber local_ipv4, local_ipv6; |
+ ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &local_ipv4)); |
+ ASSERT_TRUE(ParseIPLiteralToNumber("::1", &local_ipv6)); |
+ if (saw_ipv4) |
+ hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] = local_ipv4; |
+ if (saw_ipv6) |
+ hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV6)] = local_ipv6; |
+ config.hosts = hosts; |
+ |
+ ChangeDnsConfig(config); |
+ req = CreateRequest(info); |
+ // Expect synchronous resolution from DnsHosts. |
+ EXPECT_EQ(OK, req->Resolve()); |
+ |
+ EXPECT_EQ(saw_ipv4, req->HasAddress("127.0.0.1", 80)); |
+ EXPECT_EQ(saw_ipv6, req->HasAddress("::1", 80)); |
+} |
+ |
} // namespace net |