| 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 ff840d9ddb3c3784c2c2996a193f63c0e32b9993..210b36dfdc0773c2c980320fb8d40006a96dca4c 100644
|
| --- a/net/dns/host_resolver_impl_unittest.cc
|
| +++ b/net/dns/host_resolver_impl_unittest.cc
|
| @@ -211,7 +211,7 @@ class Request {
|
| Request(const HostResolver::RequestInfo& info,
|
| RequestPriority priority,
|
| size_t index,
|
| - HostResolver* resolver,
|
| + HostResolverImpl* resolver,
|
| Handler* handler)
|
| : info_(info),
|
| priority_(priority),
|
| @@ -244,6 +244,13 @@ class Request {
|
| return resolver_->ResolveFromCache(info_, &list_, BoundNetLog());
|
| }
|
|
|
| + int ResolveStaleFromCache() {
|
| + DCHECK(resolver_);
|
| + DCHECK(!handle_);
|
| + return resolver_->ResolveStaleFromCache(info_, &list_, &staleness_,
|
| + BoundNetLog());
|
| + }
|
| +
|
| void ChangePriority(RequestPriority priority) {
|
| DCHECK(resolver_);
|
| DCHECK(handle_);
|
| @@ -262,6 +269,7 @@ class Request {
|
| size_t index() const { return index_; }
|
| const AddressList& list() const { return list_; }
|
| int result() const { return result_; }
|
| + const HostCache::EntryStaleness staleness() const { return staleness_; }
|
| bool completed() const { return result_ != ERR_IO_PENDING; }
|
| bool pending() const { return handle_ != NULL; }
|
|
|
| @@ -318,13 +326,14 @@ class Request {
|
| HostResolver::RequestInfo info_;
|
| RequestPriority priority_;
|
| size_t index_;
|
| - HostResolver* resolver_;
|
| + HostResolverImpl* resolver_;
|
| Handler* handler_;
|
| bool quit_on_complete_;
|
|
|
| AddressList list_;
|
| int result_;
|
| HostResolver::RequestHandle handle_;
|
| + HostCache::EntryStaleness staleness_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Request);
|
| };
|
| @@ -605,6 +614,11 @@ class HostResolverImplTest : public testing::Test {
|
| return resolver_->IsIPv6Reachable(net_log);
|
| }
|
|
|
| + void MakeCacheStale() {
|
| + DCHECK(resolver_.get());
|
| + resolver_->GetHostCache()->OnNetworkChange();
|
| + }
|
| +
|
| scoped_refptr<MockHostResolverProc> proc_;
|
| std::unique_ptr<HostResolverImpl> resolver_;
|
| std::vector<std::unique_ptr<Request>> requests_;
|
| @@ -1379,6 +1393,38 @@ TEST_F(HostResolverImplTest, ResolveFromCache) {
|
| EXPECT_TRUE(requests_[2]->HasOneAddress("192.168.1.42", 80));
|
| }
|
|
|
| +TEST_F(HostResolverImplTest, ResolveStaleFromCache) {
|
| + proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
|
| + proc_->SignalMultiple(1u); // Need only one.
|
| +
|
| + HostResolver::RequestInfo info(HostPortPair("just.testing", 80));
|
| +
|
| + // First hit will miss the cache.
|
| + EXPECT_EQ(ERR_DNS_CACHE_MISS,
|
| + CreateRequest(info, DEFAULT_PRIORITY)->ResolveFromCache());
|
| +
|
| + // This time, we fetch normally.
|
| + EXPECT_EQ(ERR_IO_PENDING, CreateRequest(info, DEFAULT_PRIORITY)->Resolve());
|
| + EXPECT_EQ(OK, requests_[1]->WaitForResult());
|
| +
|
| + // Now we should be able to fetch from the cache.
|
| + EXPECT_EQ(OK, CreateRequest(info, DEFAULT_PRIORITY)->ResolveFromCache());
|
| + EXPECT_TRUE(requests_[2]->HasOneAddress("192.168.1.42", 80));
|
| + EXPECT_EQ(OK, CreateRequest(info, DEFAULT_PRIORITY)->ResolveStaleFromCache());
|
| + EXPECT_TRUE(requests_[3]->HasOneAddress("192.168.1.42", 80));
|
| + EXPECT_FALSE(requests_[3]->staleness().is_stale());
|
| +
|
| + MakeCacheStale();
|
| +
|
| + // Now we should be able to fetch from the cache only if we use
|
| + // ResolveStaleFromCache.
|
| + EXPECT_EQ(ERR_DNS_CACHE_MISS,
|
| + CreateRequest(info, DEFAULT_PRIORITY)->ResolveFromCache());
|
| + EXPECT_EQ(OK, CreateRequest(info, DEFAULT_PRIORITY)->ResolveStaleFromCache());
|
| + EXPECT_TRUE(requests_[5]->HasOneAddress("192.168.1.42", 80));
|
| + EXPECT_TRUE(requests_[5]->staleness().is_stale());
|
| +}
|
| +
|
| // Test the retry attempts simulating host resolver proc that takes too long.
|
| TEST_F(HostResolverImplTest, MultipleAttempts) {
|
| // Total number of attempts would be 3 and we want the 3rd attempt to resolve
|
|
|