| Index: chrome/browser/net/dns_master_unittest.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/net/dns_master_unittest.cc	(revision 20760)
 | 
| +++ chrome/browser/net/dns_master_unittest.cc	(working copy)
 | 
| @@ -10,13 +10,13 @@
 | 
|  
 | 
|  #include "base/message_loop.h"
 | 
|  #include "base/scoped_ptr.h"
 | 
| +#include "base/string_util.h"
 | 
|  #include "base/timer.h"
 | 
|  #include "chrome/browser/net/dns_global.h"
 | 
|  #include "chrome/browser/net/dns_host_info.h"
 | 
|  #include "chrome/common/net/dns.h"
 | 
|  #include "net/base/address_list.h"
 | 
| -#include "net/base/host_resolver.h"
 | 
| -#include "net/base/host_resolver_unittest.h"
 | 
| +#include "net/base/mock_host_resolver.h"
 | 
|  #include "net/base/winsock_init.h"
 | 
|  #include "testing/gtest/include/gtest/gtest.h"
 | 
|  
 | 
| @@ -59,10 +59,9 @@
 | 
|  class DnsMasterTest : public testing::Test {
 | 
|   public:
 | 
|    DnsMasterTest()
 | 
| -      : mapper_(new net::RuleBasedHostMapper()),
 | 
| +      : host_resolver_(new net::MockHostResolver()),
 | 
|          default_max_queueing_delay_(TimeDelta::FromMilliseconds(
 | 
| -            DnsPrefetcherInit::kMaxQueueingDelayMs)),
 | 
| -        scoped_mapper_(mapper_.get()) {
 | 
| +            DnsPrefetcherInit::kMaxQueueingDelayMs)) {
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| @@ -70,10 +69,11 @@
 | 
|  #if defined(OS_WIN)
 | 
|      net::EnsureWinsockInit();
 | 
|  #endif
 | 
| -    mapper_->AddRuleWithLatency("www.google.com", "127.0.0.1", 50);
 | 
| -    mapper_->AddRuleWithLatency("gmail.google.com.com", "127.0.0.1", 70);
 | 
| -    mapper_->AddRuleWithLatency("mail.google.com", "127.0.0.1", 44);
 | 
| -    mapper_->AddRuleWithLatency("gmail.com", "127.0.0.1", 63);
 | 
| +    net::RuleBasedHostResolverProc* rules = host_resolver_->rules();
 | 
| +    rules->AddRuleWithLatency("www.google.com", "127.0.0.1", 50);
 | 
| +    rules->AddRuleWithLatency("gmail.google.com.com", "127.0.0.1", 70);
 | 
| +    rules->AddRuleWithLatency("mail.google.com", "127.0.0.1", 44);
 | 
| +    rules->AddRuleWithLatency("gmail.com", "127.0.0.1", 63);
 | 
|    }
 | 
|  
 | 
|    void WaitForResolution(DnsMaster* master, const NameList& hosts) {
 | 
| @@ -84,15 +84,18 @@
 | 
|      MessageLoop::current()->Run();
 | 
|    }
 | 
|  
 | 
| -  scoped_refptr<net::RuleBasedHostMapper> mapper_;
 | 
| + private:
 | 
| +  // IMPORTANT: do not move this below |host_resolver_|; the host resolver
 | 
| +  // must not outlive the message loop, otherwise bad things can happen
 | 
| +  // (like posting to a deleted message loop).
 | 
| +  MessageLoop loop;
 | 
|  
 | 
| + protected:
 | 
| +  scoped_refptr<net::MockHostResolver> host_resolver_;
 | 
| +
 | 
|    // Shorthand to access TimeDelta of DnsPrefetcherInit::kMaxQueueingDelayMs.
 | 
|    // (It would be a static constant... except style rules preclude that :-/ ).
 | 
|    const TimeDelta default_max_queueing_delay_;
 | 
| -
 | 
| - private:
 | 
| -  MessageLoop loop;
 | 
| -  net::ScopedHostMapper scoped_mapper_;
 | 
|  };
 | 
|  
 | 
|  //------------------------------------------------------------------------------
 | 
| @@ -113,15 +116,15 @@
 | 
|  //------------------------------------------------------------------------------
 | 
|  // Use a blocking function to contrast results we get via async services.
 | 
|  //------------------------------------------------------------------------------
 | 
| -TimeDelta BlockingDnsLookup(const std::string& hostname) {
 | 
| -    Time start = Time::Now();
 | 
| +TimeDelta BlockingDnsLookup(net::HostResolver* resolver,
 | 
| +                            const std::string& hostname) {
 | 
| +  Time start = Time::Now();
 | 
|  
 | 
| -    scoped_refptr<net::HostResolver> resolver(new net::HostResolver);
 | 
| -    net::AddressList addresses;
 | 
| -    net::HostResolver::RequestInfo info(hostname, 80);
 | 
| -    resolver->Resolve(info, &addresses, NULL, NULL);
 | 
| +  net::AddressList addresses;
 | 
| +  net::HostResolver::RequestInfo info(hostname, 80);
 | 
| +  resolver->Resolve(info, &addresses, NULL, NULL);
 | 
|  
 | 
| -    return Time::Now() - start;
 | 
| +  return Time::Now() - start;
 | 
|  }
 | 
|  
 | 
|  //------------------------------------------------------------------------------
 | 
| @@ -129,7 +132,9 @@
 | 
|  // First test to be sure the OS is caching lookups, which is the whole premise
 | 
|  // of DNS prefetching.
 | 
|  TEST_F(DnsMasterTest, OsCachesLookupsTest) {
 | 
| -  mapper_->AllowDirectLookup("*.google.com");
 | 
| +  // Make sure caching is disabled in the mock host resolver.
 | 
| +  host_resolver_->Reset(NULL, 0, 0);
 | 
| +  host_resolver_->rules()->AllowDirectLookup("*.google.com");
 | 
|  
 | 
|    const Time start = Time::Now();
 | 
|    int all_lookups = 0;
 | 
| @@ -140,13 +145,13 @@
 | 
|      std::string badname;
 | 
|      badname = GetNonexistantDomain();
 | 
|  
 | 
| -    TimeDelta duration = BlockingDnsLookup(badname);
 | 
| +    TimeDelta duration = BlockingDnsLookup(host_resolver_, badname);
 | 
|  
 | 
|      // Produce more than one result and remove the largest one
 | 
|      // to reduce flakiness.
 | 
|      std::vector<TimeDelta> cached_results;
 | 
|      for (int j = 0; j < 3; j++)
 | 
| -      cached_results.push_back(BlockingDnsLookup(badname));
 | 
| +      cached_results.push_back(BlockingDnsLookup(host_resolver_, badname));
 | 
|      std::sort(cached_results.begin(), cached_results.end());
 | 
|      cached_results.pop_back();
 | 
|  
 | 
| @@ -168,14 +173,14 @@
 | 
|  }
 | 
|  
 | 
|  TEST_F(DnsMasterTest, StartupShutdownTest) {
 | 
| -  scoped_refptr<DnsMaster> testing_master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> testing_master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|    testing_master->Shutdown();
 | 
|  }
 | 
|  
 | 
|  TEST_F(DnsMasterTest, BenefitLookupTest) {
 | 
| -  scoped_refptr<DnsMaster> testing_master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> testing_master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|  
 | 
| @@ -236,10 +241,11 @@
 | 
|  }
 | 
|  
 | 
|  TEST_F(DnsMasterTest, ShutdownWhenResolutionIsPendingTest) {
 | 
| -  scoped_refptr<net::WaitingHostMapper> mapper = new net::WaitingHostMapper();
 | 
| -  net::ScopedHostMapper scoped_mapper(mapper.get());
 | 
| +  scoped_refptr<net::WaitingHostResolverProc> resolver_proc =
 | 
| +      new net::WaitingHostResolverProc(NULL);
 | 
| +  host_resolver_->Reset(resolver_proc, 0, 0);
 | 
|  
 | 
| -  scoped_refptr<DnsMaster> testing_master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> testing_master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|  
 | 
| @@ -258,12 +264,12 @@
 | 
|    testing_master->Shutdown();
 | 
|  
 | 
|    // Clean up after ourselves.
 | 
| -  mapper->Signal();
 | 
| +  resolver_proc->Signal();
 | 
|    MessageLoop::current()->RunAllPending();
 | 
|  }
 | 
|  
 | 
|  TEST_F(DnsMasterTest, SingleLookupTest) {
 | 
| -  scoped_refptr<DnsMaster> testing_master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> testing_master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|  
 | 
| @@ -291,9 +297,9 @@
 | 
|  }
 | 
|  
 | 
|  TEST_F(DnsMasterTest, ConcurrentLookupTest) {
 | 
| -  mapper_->AddSimulatedFailure("*.notfound");
 | 
| +  host_resolver_->rules()->AddSimulatedFailure("*.notfound");
 | 
|  
 | 
| -  scoped_refptr<DnsMaster> testing_master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> testing_master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|  
 | 
| @@ -313,12 +319,6 @@
 | 
|    names.insert(names.end(), goog4);
 | 
|    names.insert(names.end(), goog);
 | 
|  
 | 
| -  // Warm up the *OS* cache for all the goog domains.
 | 
| -  BlockingDnsLookup(goog);
 | 
| -  BlockingDnsLookup(goog2);
 | 
| -  BlockingDnsLookup(goog3);
 | 
| -  BlockingDnsLookup(goog4);
 | 
| -
 | 
|    // Try to flood the master with many concurrent requests.
 | 
|    for (int i = 0; i < 10; i++)
 | 
|      testing_master->ResolveList(names, DnsHostInfo::PAGE_SCAN_MOTIVATED);
 | 
| @@ -346,9 +346,9 @@
 | 
|  }
 | 
|  
 | 
|  TEST_F(DnsMasterTest, DISABLED_MassiveConcurrentLookupTest) {
 | 
| -  mapper_->AddSimulatedFailure("*.notfound");
 | 
| +  host_resolver_->rules()->AddSimulatedFailure("*.notfound");
 | 
|  
 | 
| -  scoped_refptr<DnsMaster> testing_master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> testing_master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|  
 | 
| @@ -453,7 +453,7 @@
 | 
|  
 | 
|  // Make sure nil referral lists really have no entries, and no latency listed.
 | 
|  TEST_F(DnsMasterTest, ReferrerSerializationNilTest) {
 | 
| -  scoped_refptr<DnsMaster> master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|    ListValue referral_list;
 | 
| @@ -469,7 +469,7 @@
 | 
|  // deserialized into the database, and can be extracted back out via
 | 
|  // serialization without being changed.
 | 
|  TEST_F(DnsMasterTest, ReferrerSerializationSingleReferrerTest) {
 | 
| -  scoped_refptr<DnsMaster> master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|    std::string motivation_hostname = "www.google.com";
 | 
| @@ -494,7 +494,7 @@
 | 
|  
 | 
|  // Make sure the Trim() functionality works as expected.
 | 
|  TEST_F(DnsMasterTest, ReferrerSerializationTrimTest) {
 | 
| -  scoped_refptr<DnsMaster> master = new DnsMaster(new net::HostResolver,
 | 
| +  scoped_refptr<DnsMaster> master = new DnsMaster(host_resolver_,
 | 
|        MessageLoop::current(), default_max_queueing_delay_,
 | 
|        DnsPrefetcherInit::kMaxConcurrentLookups);
 | 
|    std::string motivation_hostname = "www.google.com";
 | 
| 
 |