Commit 43c160ff authored by Eric Orth's avatar Eric Orth Committed by Commit Bot

Add source support to mock resolver.

In order to avoid incompatible changes to RulesBasedHostResolverProc,
which is used all over the place (see crbug.com/878838), created
separate internal rules procs to handle those requests specifying
different sources.

Updated tests for the one piece of code currently specifying SYSTEM
source (via flag through the old API).

Bug: 846423
Change-Id: I1b92384d831579fe119817afc3e0cb92cfdf4565
Reviewed-on: https://chromium-review.googlesource.com/1195547
Commit-Queue: Eric Orth <ericorth@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#587746}
parent 116b2f29
...@@ -63,23 +63,10 @@ class MockHostResolverBase::RequestImpl ...@@ -63,23 +63,10 @@ class MockHostResolverBase::RequestImpl
RequestImpl(const HostPortPair& request_host, RequestImpl(const HostPortPair& request_host,
const base::Optional<ResolveHostParameters>& optional_parameters, const base::Optional<ResolveHostParameters>& optional_parameters,
base::WeakPtr<MockHostResolverBase> resolver) base::WeakPtr<MockHostResolverBase> resolver)
: RequestImpl(request_host,
optional_parameters,
0 /* host_resolver_flags */,
true /* allow_cached_response */,
resolver) {}
RequestImpl(const HostPortPair& request_host,
const base::Optional<ResolveHostParameters>& optional_parameters,
HostResolverFlags host_resolver_flags,
bool allow_cached_response,
base::WeakPtr<MockHostResolverBase> resolver)
: request_host_(request_host), : request_host_(request_host),
allow_cached_response_(allow_cached_response),
parameters_(optional_parameters ? optional_parameters.value() parameters_(optional_parameters ? optional_parameters.value()
: ResolveHostParameters()), : ResolveHostParameters()),
host_resolver_flags_(host_resolver_flags | host_resolver_flags_(ParametersToHostResolverFlags(parameters_)),
ParametersToHostResolverFlags(parameters_)),
id_(0), id_(0),
resolver_(resolver), resolver_(resolver),
complete_(false) {} complete_(false) {}
...@@ -143,8 +130,6 @@ class MockHostResolverBase::RequestImpl ...@@ -143,8 +130,6 @@ class MockHostResolverBase::RequestImpl
const HostPortPair& request_host() const { return request_host_; } const HostPortPair& request_host() const { return request_host_; }
bool allow_cached_response() const { return allow_cached_response_; }
const ResolveHostParameters& parameters() const { return parameters_; } const ResolveHostParameters& parameters() const { return parameters_; }
int host_resolver_flags() const { return host_resolver_flags_; } int host_resolver_flags() const { return host_resolver_flags_; }
...@@ -162,7 +147,6 @@ class MockHostResolverBase::RequestImpl ...@@ -162,7 +147,6 @@ class MockHostResolverBase::RequestImpl
private: private:
const HostPortPair request_host_; const HostPortPair request_host_;
bool allow_cached_response_;
const ResolveHostParameters parameters_; const ResolveHostParameters parameters_;
int host_resolver_flags_; int host_resolver_flags_;
...@@ -259,7 +243,7 @@ int MockHostResolverBase::Resolve(const RequestInfo& info, ...@@ -259,7 +243,7 @@ int MockHostResolverBase::Resolve(const RequestInfo& info,
auto request = std::make_unique<RequestImpl>( auto request = std::make_unique<RequestImpl>(
info.host_port_pair(), RequestInfoToResolveHostParameters(info, priority), info.host_port_pair(), RequestInfoToResolveHostParameters(info, priority),
info.host_resolver_flags(), info.allow_cached_response(), AsWeakPtr()); AsWeakPtr());
auto wrapped_request = auto wrapped_request =
std::make_unique<LegacyRequestImpl>(std::move(request)); std::make_unique<LegacyRequestImpl>(std::move(request));
...@@ -284,7 +268,7 @@ int MockHostResolverBase::ResolveFromCache(const RequestInfo& info, ...@@ -284,7 +268,7 @@ int MockHostResolverBase::ResolveFromCache(const RequestInfo& info,
next_request_id_++; next_request_id_++;
int rv = ResolveFromIPLiteralOrCache( int rv = ResolveFromIPLiteralOrCache(
info.host_port_pair(), info.address_family(), info.host_resolver_flags(), info.host_port_pair(), info.address_family(), info.host_resolver_flags(),
info.allow_cached_response(), addresses); HostResolverSource::ANY, info.allow_cached_response(), addresses);
return rv; return rv;
} }
...@@ -298,7 +282,7 @@ int MockHostResolverBase::ResolveStaleFromCache( ...@@ -298,7 +282,7 @@ int MockHostResolverBase::ResolveStaleFromCache(
next_request_id_++; next_request_id_++;
int rv = ResolveFromIPLiteralOrCache( int rv = ResolveFromIPLiteralOrCache(
info.host_port_pair(), info.address_family(), info.host_resolver_flags(), info.host_port_pair(), info.address_family(), info.host_resolver_flags(),
info.allow_cached_response(), addresses); HostResolverSource::ANY, info.allow_cached_response(), addresses);
return rv; return rv;
} }
...@@ -340,7 +324,9 @@ MockHostResolverBase::MockHostResolverBase(bool use_caching) ...@@ -340,7 +324,9 @@ MockHostResolverBase::MockHostResolverBase(bool use_caching)
next_request_id_(1), next_request_id_(1),
num_resolve_(0), num_resolve_(0),
num_resolve_from_cache_(0) { num_resolve_from_cache_(0) {
rules_ = CreateCatchAllHostResolverProc(); rules_map_[HostResolverSource::ANY] = CreateCatchAllHostResolverProc();
rules_map_[HostResolverSource::SYSTEM] = CreateCatchAllHostResolverProc();
rules_map_[HostResolverSource::DNS] = CreateCatchAllHostResolverProc();
if (use_caching) { if (use_caching) {
cache_.reset(new HostCache(kMaxCacheEntries)); cache_.reset(new HostCache(kMaxCacheEntries));
...@@ -356,8 +342,8 @@ int MockHostResolverBase::Resolve(RequestImpl* request) { ...@@ -356,8 +342,8 @@ int MockHostResolverBase::Resolve(RequestImpl* request) {
int rv = ResolveFromIPLiteralOrCache( int rv = ResolveFromIPLiteralOrCache(
request->request_host(), request->request_host(),
DnsQueryTypeToAddressFamily(request->parameters().dns_query_type), DnsQueryTypeToAddressFamily(request->parameters().dns_query_type),
request->host_resolver_flags(), request->allow_cached_response(), request->host_resolver_flags(), request->parameters().source,
&addresses); request->parameters().allow_cached_response, &addresses);
if (rv == OK && !request->parameters().is_speculative) if (rv == OK && !request->parameters().is_speculative)
request->set_address_results(addresses); request->set_address_results(addresses);
if (rv != ERR_DNS_CACHE_MISS) if (rv != ERR_DNS_CACHE_MISS)
...@@ -372,7 +358,8 @@ int MockHostResolverBase::Resolve(RequestImpl* request) { ...@@ -372,7 +358,8 @@ int MockHostResolverBase::Resolve(RequestImpl* request) {
int rv = ResolveProc( int rv = ResolveProc(
request->request_host(), request->request_host(),
DnsQueryTypeToAddressFamily(request->parameters().dns_query_type), DnsQueryTypeToAddressFamily(request->parameters().dns_query_type),
request->host_resolver_flags(), &addresses); request->host_resolver_flags(), request->parameters().source,
&addresses);
if (rv == OK && !request->parameters().is_speculative) if (rv == OK && !request->parameters().is_speculative)
request->set_address_results(addresses); request->set_address_results(addresses);
return rv; return rv;
...@@ -396,6 +383,7 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache( ...@@ -396,6 +383,7 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
const HostPortPair& host, const HostPortPair& host,
AddressFamily requested_address_family, AddressFamily requested_address_family,
HostResolverFlags flags, HostResolverFlags flags,
HostResolverSource source,
bool allow_cache, bool allow_cache,
AddressList* addresses, AddressList* addresses,
HostCache::EntryStaleness* stale_info) { HostCache::EntryStaleness* stale_info) {
...@@ -414,7 +402,7 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache( ...@@ -414,7 +402,7 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
} }
int rv = ERR_DNS_CACHE_MISS; int rv = ERR_DNS_CACHE_MISS;
if (cache_.get() && allow_cache) { if (cache_.get() && allow_cache) {
HostCache::Key key(host.host(), requested_address_family, flags); HostCache::Key key(host.host(), requested_address_family, flags, source);
const HostCache::Entry* entry; const HostCache::Entry* entry;
if (stale_info) if (stale_info)
entry = cache_->LookupStale(key, base::TimeTicks::Now(), stale_info); entry = cache_->LookupStale(key, base::TimeTicks::Now(), stale_info);
...@@ -432,12 +420,15 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache( ...@@ -432,12 +420,15 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
int MockHostResolverBase::ResolveProc(const HostPortPair& host, int MockHostResolverBase::ResolveProc(const HostPortPair& host,
AddressFamily requested_address_family, AddressFamily requested_address_family,
HostResolverFlags flags, HostResolverFlags flags,
HostResolverSource source,
AddressList* addresses) { AddressList* addresses) {
DCHECK(rules_map_.find(source) != rules_map_.end());
AddressList addr; AddressList addr;
int rv = rules_->Resolve(host.host(), requested_address_family, flags, &addr, int rv = rules_map_[source]->Resolve(host.host(), requested_address_family,
nullptr); flags, &addr, nullptr);
if (cache_.get()) { if (cache_.get()) {
HostCache::Key key(host.host(), requested_address_family, flags); HostCache::Key key(host.host(), requested_address_family, flags, source);
// Storing a failure with TTL 0 so that it overwrites previous value. // Storing a failure with TTL 0 so that it overwrites previous value.
base::TimeDelta ttl; base::TimeDelta ttl;
if (rv == OK) if (rv == OK)
...@@ -460,10 +451,10 @@ void MockHostResolverBase::ResolveNow(size_t id) { ...@@ -460,10 +451,10 @@ void MockHostResolverBase::ResolveNow(size_t id) {
requests_.erase(it); requests_.erase(it);
AddressList addresses; AddressList addresses;
int error = int error = ResolveProc(
ResolveProc(req->request_host(), req->request_host(),
DnsQueryTypeToAddressFamily(req->parameters().dns_query_type), DnsQueryTypeToAddressFamily(req->parameters().dns_query_type),
req->host_resolver_flags(), &addresses); req->host_resolver_flags(), req->parameters().source, &addresses);
if (error == OK && !req->parameters().is_speculative) if (error == OK && !req->parameters().is_speculative)
req->set_address_results(addresses); req->set_address_results(addresses);
req->OnAsyncCompleted(id, error); req->OnAsyncCompleted(id, error);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "net/base/completion_once_callback.h" #include "net/base/completion_once_callback.h"
#include "net/dns/host_resolver.h" #include "net/dns/host_resolver.h"
#include "net/dns/host_resolver_proc.h" #include "net/dns/host_resolver_proc.h"
#include "net/dns/host_resolver_source.h"
namespace net { namespace net {
...@@ -56,6 +57,14 @@ int ParseAddressList(const std::string& host_list, ...@@ -56,6 +57,14 @@ int ParseAddressList(const std::string& host_list,
// //
// By default, MockHostResolvers include a single rule that maps all hosts to // By default, MockHostResolvers include a single rule that maps all hosts to
// 127.0.0.1. // 127.0.0.1.
//
// Separate rules are used for separate HostResolverSource (eg
// HostResolverSource::SYSTEM for requests that should only be resolved using
// the system resolver). Use rules_map() to access the separate rules if tests
// involve requests specifying sources:
//
// host_resolver->rules_map()[HostResolverSource::DNS]->AddRule("foo.com",
// "1.2.3.4");
// Base class shared by MockHostResolver and MockCachingHostResolver. // Base class shared by MockHostResolver and MockCachingHostResolver.
class MockHostResolverBase class MockHostResolverBase
...@@ -68,8 +77,16 @@ class MockHostResolverBase ...@@ -68,8 +77,16 @@ class MockHostResolverBase
public: public:
~MockHostResolverBase() override; ~MockHostResolverBase() override;
RuleBasedHostResolverProc* rules() { return rules_.get(); } RuleBasedHostResolverProc* rules() {
void set_rules(RuleBasedHostResolverProc* rules) { rules_ = rules; } return rules_map_[HostResolverSource::ANY].get();
}
void set_rules(RuleBasedHostResolverProc* rules) {
rules_map_[HostResolverSource::ANY] = rules;
}
std::map<HostResolverSource, scoped_refptr<RuleBasedHostResolverProc>>
rules_map() {
return rules_map_;
}
// Controls whether resolutions complete synchronously or asynchronously. // Controls whether resolutions complete synchronously or asynchronously.
void set_synchronous_mode(bool is_synchronous) { void set_synchronous_mode(bool is_synchronous) {
...@@ -152,6 +169,7 @@ class MockHostResolverBase ...@@ -152,6 +169,7 @@ class MockHostResolverBase
const HostPortPair& host, const HostPortPair& host,
AddressFamily requested_address_family, AddressFamily requested_address_family,
HostResolverFlags flags, HostResolverFlags flags,
HostResolverSource source,
bool allow_cache, bool allow_cache,
AddressList* addresses, AddressList* addresses,
HostCache::EntryStaleness* stale_info = nullptr); HostCache::EntryStaleness* stale_info = nullptr);
...@@ -159,6 +177,7 @@ class MockHostResolverBase ...@@ -159,6 +177,7 @@ class MockHostResolverBase
int ResolveProc(const HostPortPair& host, int ResolveProc(const HostPortPair& host,
AddressFamily requested_address_family, AddressFamily requested_address_family,
HostResolverFlags flags, HostResolverFlags flags,
HostResolverSource source,
AddressList* addresses); AddressList* addresses);
// Resolve request stored in |requests_|. Pass rv to callback. // Resolve request stored in |requests_|. Pass rv to callback.
void ResolveNow(size_t id); void ResolveNow(size_t id);
...@@ -166,7 +185,8 @@ class MockHostResolverBase ...@@ -166,7 +185,8 @@ class MockHostResolverBase
RequestPriority last_request_priority_; RequestPriority last_request_priority_;
bool synchronous_mode_; bool synchronous_mode_;
bool ondemand_mode_; bool ondemand_mode_;
scoped_refptr<RuleBasedHostResolverProc> rules_; std::map<HostResolverSource, scoped_refptr<RuleBasedHostResolverProc>>
rules_map_;
std::unique_ptr<HostCache> cache_; std::unique_ptr<HostCache> cache_;
RequestMap requests_; RequestMap requests_;
size_t next_request_id_; size_t next_request_id_;
......
...@@ -370,7 +370,7 @@ class PacFileDeciderQuickCheckTest : public TestWithScopedTaskEnvironment { ...@@ -370,7 +370,7 @@ class PacFileDeciderQuickCheckTest : public TestWithScopedTaskEnvironment {
// Fails if a synchronous DNS lookup success for wpad causes QuickCheck to fail. // Fails if a synchronous DNS lookup success for wpad causes QuickCheck to fail.
TEST_F(PacFileDeciderQuickCheckTest, SyncSuccess) { TEST_F(PacFileDeciderQuickCheckTest, SyncSuccess) {
resolver_.set_synchronous_mode(true); resolver_.set_synchronous_mode(true);
resolver_.rules()->AddRule("wpad", "1.2.3.4"); resolver_.rules_map()[HostResolverSource::SYSTEM]->AddRule("wpad", "1.2.3.4");
EXPECT_THAT(StartDecider(), IsOk()); EXPECT_THAT(StartDecider(), IsOk());
EXPECT_EQ(rule_.text(), decider_->script_data()->utf16()); EXPECT_EQ(rule_.text(), decider_->script_data()->utf16());
...@@ -383,7 +383,7 @@ TEST_F(PacFileDeciderQuickCheckTest, SyncSuccess) { ...@@ -383,7 +383,7 @@ TEST_F(PacFileDeciderQuickCheckTest, SyncSuccess) {
// fail. // fail.
TEST_F(PacFileDeciderQuickCheckTest, AsyncSuccess) { TEST_F(PacFileDeciderQuickCheckTest, AsyncSuccess) {
resolver_.set_ondemand_mode(true); resolver_.set_ondemand_mode(true);
resolver_.rules()->AddRule("wpad", "1.2.3.4"); resolver_.rules_map()[HostResolverSource::SYSTEM]->AddRule("wpad", "1.2.3.4");
EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
ASSERT_TRUE(resolver_.has_pending_requests()); ASSERT_TRUE(resolver_.has_pending_requests());
...@@ -399,7 +399,8 @@ TEST_F(PacFileDeciderQuickCheckTest, AsyncSuccess) { ...@@ -399,7 +399,8 @@ TEST_F(PacFileDeciderQuickCheckTest, AsyncSuccess) {
// PacFileDecider to yield a PAC URL. // PacFileDecider to yield a PAC URL.
TEST_F(PacFileDeciderQuickCheckTest, AsyncFail) { TEST_F(PacFileDeciderQuickCheckTest, AsyncFail) {
resolver_.set_ondemand_mode(true); resolver_.set_ondemand_mode(true);
resolver_.rules()->AddSimulatedFailure("wpad"); resolver_.rules_map()[HostResolverSource::SYSTEM]->AddSimulatedFailure(
"wpad");
EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
ASSERT_TRUE(resolver_.has_pending_requests()); ASSERT_TRUE(resolver_.has_pending_requests());
resolver_.ResolveAllPending(); resolver_.ResolveAllPending();
...@@ -439,7 +440,8 @@ TEST_F(PacFileDeciderQuickCheckTest, QuickCheckInhibitsDhcp) { ...@@ -439,7 +440,8 @@ TEST_F(PacFileDeciderQuickCheckTest, QuickCheckInhibitsDhcp) {
TEST_F(PacFileDeciderQuickCheckTest, QuickCheckDisabled) { TEST_F(PacFileDeciderQuickCheckTest, QuickCheckDisabled) {
const char* kPac = "function FindProxyForURL(u,h) { return \"DIRECT\"; }"; const char* kPac = "function FindProxyForURL(u,h) { return \"DIRECT\"; }";
resolver_.set_synchronous_mode(true); resolver_.set_synchronous_mode(true);
resolver_.rules()->AddSimulatedFailure("wpad"); resolver_.rules_map()[HostResolverSource::SYSTEM]->AddSimulatedFailure(
"wpad");
MockPacFileFetcher fetcher; MockPacFileFetcher fetcher;
decider_.reset(new PacFileDecider(&fetcher, &dhcp_fetcher_, NULL)); decider_.reset(new PacFileDecider(&fetcher, &dhcp_fetcher_, NULL));
EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
...@@ -451,8 +453,10 @@ TEST_F(PacFileDeciderQuickCheckTest, ExplicitPacUrl) { ...@@ -451,8 +453,10 @@ TEST_F(PacFileDeciderQuickCheckTest, ExplicitPacUrl) {
const char* kCustomUrl = "http://custom/proxy.pac"; const char* kCustomUrl = "http://custom/proxy.pac";
config_.set_pac_url(GURL(kCustomUrl)); config_.set_pac_url(GURL(kCustomUrl));
Rules::Rule rule = rules_.AddSuccessRule(kCustomUrl); Rules::Rule rule = rules_.AddSuccessRule(kCustomUrl);
resolver_.rules()->AddSimulatedFailure("wpad"); resolver_.rules_map()[HostResolverSource::SYSTEM]->AddSimulatedFailure(
resolver_.rules()->AddRule("custom", "1.2.3.4"); "wpad");
resolver_.rules_map()[HostResolverSource::SYSTEM]->AddRule("custom",
"1.2.3.4");
EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
callback_.WaitForResult(); callback_.WaitForResult();
EXPECT_TRUE(decider_->effective_config().value().has_pac_url()); EXPECT_TRUE(decider_->effective_config().value().has_pac_url());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment