| Index: chrome/browser/net/predictor_unittest.cc | 
| =================================================================== | 
| --- chrome/browser/net/predictor_unittest.cc	(revision 97464) | 
| +++ chrome/browser/net/predictor_unittest.cc	(working copy) | 
| @@ -13,7 +13,7 @@ | 
| #include "base/string_number_conversions.h" | 
| #include "base/timer.h" | 
| #include "base/values.h" | 
| -#include "chrome/browser/net/predictor.h" | 
| +#include "chrome/browser/net/predictor_api.h" | 
| #include "chrome/browser/net/url_info.h" | 
| #include "chrome/common/net/predictor_common.h" | 
| #include "content/browser/browser_thread.h" | 
| @@ -62,9 +62,10 @@ | 
| class PredictorTest : public testing::Test { | 
| public: | 
| PredictorTest() | 
| -      : ui_thread_(BrowserThread::UI, &loop_), | 
| -        io_thread_(BrowserThread::IO, &loop_), | 
| -        host_resolver_(new net::MockCachingHostResolver()) { | 
| +      : io_thread_(BrowserThread::IO, &loop_), | 
| +        host_resolver_(new net::MockCachingHostResolver()), | 
| +        default_max_queueing_delay_(TimeDelta::FromMilliseconds( | 
| +            PredictorInit::kMaxSpeculativeResolveQueueDelayMs)) { | 
| } | 
|  | 
| protected: | 
| @@ -72,10 +73,6 @@ | 
| #if defined(OS_WIN) | 
| net::EnsureWinsockInit(); | 
| #endif | 
| -    Predictor::set_max_parallel_resolves( | 
| -        Predictor::kMaxSpeculativeParallelResolves); | 
| -    Predictor::set_max_queueing_delay( | 
| -        Predictor::kMaxSpeculativeResolveQueueDelayMs); | 
| // Since we are using a caching HostResolver, the following latencies will | 
| // only be incurred by the first request, after which the result will be | 
| // cached internally by |host_resolver_|. | 
| @@ -98,19 +95,26 @@ | 
| // 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). | 
| -  MessageLoopForUI loop_; | 
| -  BrowserThread ui_thread_; | 
| +  MessageLoop loop_; | 
| BrowserThread io_thread_; | 
|  | 
| protected: | 
| scoped_ptr<net::MockCachingHostResolver> host_resolver_; | 
| + | 
| +  // Shorthand to access TimeDelta of PredictorInit::kMaxQueueingDelayMs. | 
| +  // (It would be a static constant... except style rules preclude that :-/ ). | 
| +  const TimeDelta default_max_queueing_delay_; | 
| }; | 
|  | 
| //------------------------------------------------------------------------------ | 
|  | 
| TEST_F(PredictorTest, StartupShutdownTest) { | 
| -  Predictor testing_master(true); | 
| -  testing_master.Shutdown(); | 
| +  scoped_refptr<Predictor> testing_master( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
| +  testing_master->Shutdown(); | 
| } | 
|  | 
|  | 
| @@ -119,22 +123,25 @@ | 
| new net::WaitingHostResolverProc(NULL)); | 
| host_resolver_->Reset(resolver_proc); | 
|  | 
| -  Predictor testing_master(true); | 
| -  testing_master.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> testing_master( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
|  | 
| GURL localhost("http://localhost:80"); | 
| UrlList names; | 
| names.push_back(localhost); | 
|  | 
| -  testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
| +  testing_master->ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
|  | 
| MessageLoop::current()->PostDelayedTask(FROM_HERE, | 
| new MessageLoop::QuitTask(), 500); | 
| MessageLoop::current()->Run(); | 
|  | 
| -  EXPECT_FALSE(testing_master.WasFound(localhost)); | 
| +  EXPECT_FALSE(testing_master->WasFound(localhost)); | 
|  | 
| -  testing_master.Shutdown(); | 
| +  testing_master->Shutdown(); | 
|  | 
| // Clean up after ourselves. | 
| resolver_proc->Signal(); | 
| @@ -142,8 +149,11 @@ | 
| } | 
|  | 
| TEST_F(PredictorTest, SingleLookupTest) { | 
| -  Predictor testing_master(true); | 
| -  testing_master.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> testing_master( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
|  | 
| GURL goog("http://www.google.com:80"); | 
|  | 
| @@ -152,27 +162,30 @@ | 
|  | 
| // Try to flood the predictor with many concurrent requests. | 
| for (int i = 0; i < 10; i++) | 
| -    testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
| +    testing_master->ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
|  | 
| -  WaitForResolution(&testing_master, names); | 
| +  WaitForResolution(testing_master, names); | 
|  | 
| -  EXPECT_TRUE(testing_master.WasFound(goog)); | 
| +  EXPECT_TRUE(testing_master->WasFound(goog)); | 
|  | 
| MessageLoop::current()->RunAllPending(); | 
|  | 
| -  EXPECT_GT(testing_master.peak_pending_lookups(), names.size() / 2); | 
| -  EXPECT_LE(testing_master.peak_pending_lookups(), names.size()); | 
| -  EXPECT_LE(testing_master.peak_pending_lookups(), | 
| -            testing_master.max_concurrent_dns_lookups()); | 
| +  EXPECT_GT(testing_master->peak_pending_lookups(), names.size() / 2); | 
| +  EXPECT_LE(testing_master->peak_pending_lookups(), names.size()); | 
| +  EXPECT_LE(testing_master->peak_pending_lookups(), | 
| +            testing_master->max_concurrent_dns_lookups()); | 
|  | 
| -  testing_master.Shutdown(); | 
| +  testing_master->Shutdown(); | 
| } | 
|  | 
| TEST_F(PredictorTest, ConcurrentLookupTest) { | 
| host_resolver_->rules()->AddSimulatedFailure("*.notfound"); | 
|  | 
| -  Predictor testing_master(true); | 
| -  testing_master.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> testing_master( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
|  | 
| GURL goog("http://www.google.com:80"), | 
| goog2("http://gmail.google.com.com:80"), | 
| @@ -192,34 +205,37 @@ | 
|  | 
| // Try to flood the predictor with many concurrent requests. | 
| for (int i = 0; i < 10; i++) | 
| -    testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
| +    testing_master->ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
|  | 
| -  WaitForResolution(&testing_master, names); | 
| +  WaitForResolution(testing_master, names); | 
|  | 
| -  EXPECT_TRUE(testing_master.WasFound(goog)); | 
| -  EXPECT_TRUE(testing_master.WasFound(goog3)); | 
| -  EXPECT_TRUE(testing_master.WasFound(goog2)); | 
| -  EXPECT_TRUE(testing_master.WasFound(goog4)); | 
| -  EXPECT_FALSE(testing_master.WasFound(bad1)); | 
| -  EXPECT_FALSE(testing_master.WasFound(bad2)); | 
| +  EXPECT_TRUE(testing_master->WasFound(goog)); | 
| +  EXPECT_TRUE(testing_master->WasFound(goog3)); | 
| +  EXPECT_TRUE(testing_master->WasFound(goog2)); | 
| +  EXPECT_TRUE(testing_master->WasFound(goog4)); | 
| +  EXPECT_FALSE(testing_master->WasFound(bad1)); | 
| +  EXPECT_FALSE(testing_master->WasFound(bad2)); | 
|  | 
| MessageLoop::current()->RunAllPending(); | 
|  | 
| -  EXPECT_FALSE(testing_master.WasFound(bad1)); | 
| -  EXPECT_FALSE(testing_master.WasFound(bad2)); | 
| +  EXPECT_FALSE(testing_master->WasFound(bad1)); | 
| +  EXPECT_FALSE(testing_master->WasFound(bad2)); | 
|  | 
| -  EXPECT_LE(testing_master.peak_pending_lookups(), names.size()); | 
| -  EXPECT_LE(testing_master.peak_pending_lookups(), | 
| -            testing_master.max_concurrent_dns_lookups()); | 
| +  EXPECT_LE(testing_master->peak_pending_lookups(), names.size()); | 
| +  EXPECT_LE(testing_master->peak_pending_lookups(), | 
| +            testing_master->max_concurrent_dns_lookups()); | 
|  | 
| -  testing_master.Shutdown(); | 
| +  testing_master->Shutdown(); | 
| } | 
|  | 
| TEST_F(PredictorTest, MassiveConcurrentLookupTest) { | 
| host_resolver_->rules()->AddSimulatedFailure("*.notfound"); | 
|  | 
| -  Predictor testing_master(true); | 
| -  testing_master.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> testing_master( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
|  | 
| UrlList names; | 
| for (int i = 0; i < 100; i++) | 
| @@ -228,17 +244,17 @@ | 
|  | 
| // Try to flood the predictor with many concurrent requests. | 
| for (int i = 0; i < 10; i++) | 
| -    testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
| +    testing_master->ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | 
|  | 
| -  WaitForResolution(&testing_master, names); | 
| +  WaitForResolution(testing_master, names); | 
|  | 
| MessageLoop::current()->RunAllPending(); | 
|  | 
| -  EXPECT_LE(testing_master.peak_pending_lookups(), names.size()); | 
| -  EXPECT_LE(testing_master.peak_pending_lookups(), | 
| -            testing_master.max_concurrent_dns_lookups()); | 
| +  EXPECT_LE(testing_master->peak_pending_lookups(), names.size()); | 
| +  EXPECT_LE(testing_master->peak_pending_lookups(), | 
| +            testing_master->max_concurrent_dns_lookups()); | 
|  | 
| -  testing_master.Shutdown(); | 
| +  testing_master->Shutdown(); | 
| } | 
|  | 
| //------------------------------------------------------------------------------ | 
| @@ -336,25 +352,30 @@ | 
|  | 
| // Make sure nil referral lists really have no entries, and no latency listed. | 
| TEST_F(PredictorTest, ReferrerSerializationNilTest) { | 
| -  Predictor predictor(true); | 
| -  predictor.SetHostResolver(host_resolver_.get()); | 
| - | 
| +  scoped_refptr<Predictor> predictor( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
| scoped_ptr<ListValue> referral_list(NewEmptySerializationList()); | 
| -  predictor.SerializeReferrers(referral_list.get()); | 
| +  predictor->SerializeReferrers(referral_list.get()); | 
| EXPECT_EQ(1U, referral_list->GetSize()); | 
| EXPECT_FALSE(GetDataFromSerialization( | 
| GURL("http://a.com:79"), GURL("http://b.com:78"), | 
| *referral_list.get(), NULL)); | 
|  | 
| -  predictor.Shutdown(); | 
| +  predictor->Shutdown(); | 
| } | 
|  | 
| // Make sure that when a serialization list includes a value, that it can be | 
| // deserialized into the database, and can be extracted back out via | 
| // serialization without being changed. | 
| TEST_F(PredictorTest, ReferrerSerializationSingleReferrerTest) { | 
| -  Predictor predictor(true); | 
| -  predictor.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> predictor( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
| const GURL motivation_url("http://www.google.com:91"); | 
| const GURL subresource_url("http://icons.google.com:90"); | 
| const double kUseRate = 23.4; | 
| @@ -363,17 +384,17 @@ | 
| AddToSerializedList(motivation_url, subresource_url, | 
| kUseRate, referral_list.get()); | 
|  | 
| -  predictor.DeserializeReferrers(*referral_list.get()); | 
| +  predictor->DeserializeReferrers(*referral_list.get()); | 
|  | 
| ListValue recovered_referral_list; | 
| -  predictor.SerializeReferrers(&recovered_referral_list); | 
| +  predictor->SerializeReferrers(&recovered_referral_list); | 
| EXPECT_EQ(2U, recovered_referral_list.GetSize()); | 
| double rate; | 
| EXPECT_TRUE(GetDataFromSerialization( | 
| motivation_url, subresource_url, recovered_referral_list, &rate)); | 
| EXPECT_EQ(rate, kUseRate); | 
|  | 
| -  predictor.Shutdown(); | 
| +  predictor->Shutdown(); | 
| } | 
|  | 
| // Verify that two floats are within 1% of each other in value. | 
| @@ -388,8 +409,11 @@ | 
|  | 
| // Make sure the Trim() functionality works as expected. | 
| TEST_F(PredictorTest, ReferrerSerializationTrimTest) { | 
| -  Predictor predictor(true); | 
| -  predictor.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> predictor( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
| GURL motivation_url("http://www.google.com:110"); | 
|  | 
| GURL icon_subresource_url("http://icons.google.com:111"); | 
| @@ -403,10 +427,10 @@ | 
| AddToSerializedList( | 
| motivation_url, img_subresource_url, kRateImg, referral_list.get()); | 
|  | 
| -  predictor.DeserializeReferrers(*referral_list.get()); | 
| +  predictor->DeserializeReferrers(*referral_list.get()); | 
|  | 
| ListValue recovered_referral_list; | 
| -  predictor.SerializeReferrers(&recovered_referral_list); | 
| +  predictor->SerializeReferrers(&recovered_referral_list); | 
| EXPECT_EQ(2U, recovered_referral_list.GetSize()); | 
| double rate; | 
| EXPECT_TRUE(GetDataFromSerialization( | 
| @@ -421,8 +445,8 @@ | 
| // Each time we Trim 24 times, the user_rate figures should reduce by a factor | 
| // of two,  until they are small, and then a trim will delete the whole entry. | 
| for (int i = 0; i < 24; ++i) | 
| -    predictor.TrimReferrersNow(); | 
| -  predictor.SerializeReferrers(&recovered_referral_list); | 
| +    predictor->TrimReferrersNow(); | 
| +  predictor->SerializeReferrers(&recovered_referral_list); | 
| EXPECT_EQ(2U, recovered_referral_list.GetSize()); | 
| EXPECT_TRUE(GetDataFromSerialization( | 
| motivation_url, icon_subresource_url, recovered_referral_list, &rate)); | 
| @@ -433,8 +457,8 @@ | 
| EXPECT_SIMILAR(rate, kRateImg / 2); | 
|  | 
| for (int i = 0; i < 24; ++i) | 
| -    predictor.TrimReferrersNow(); | 
| -  predictor.SerializeReferrers(&recovered_referral_list); | 
| +    predictor->TrimReferrersNow(); | 
| +  predictor->SerializeReferrers(&recovered_referral_list); | 
| EXPECT_EQ(2U, recovered_referral_list.GetSize()); | 
| EXPECT_TRUE(GetDataFromSerialization( | 
| motivation_url, icon_subresource_url, recovered_referral_list, &rate)); | 
| @@ -444,8 +468,8 @@ | 
| EXPECT_SIMILAR(rate, kRateImg / 4); | 
|  | 
| for (int i = 0; i < 24; ++i) | 
| -    predictor.TrimReferrersNow(); | 
| -  predictor.SerializeReferrers(&recovered_referral_list); | 
| +    predictor->TrimReferrersNow(); | 
| +  predictor->SerializeReferrers(&recovered_referral_list); | 
| EXPECT_EQ(2U, recovered_referral_list.GetSize()); | 
| EXPECT_TRUE(GetDataFromSerialization( | 
| motivation_url, icon_subresource_url, recovered_referral_list, &rate)); | 
| @@ -456,8 +480,8 @@ | 
| motivation_url, img_subresource_url, recovered_referral_list, &rate)); | 
|  | 
| for (int i = 0; i < 24; ++i) | 
| -    predictor.TrimReferrersNow(); | 
| -  predictor.SerializeReferrers(&recovered_referral_list); | 
| +    predictor->TrimReferrersNow(); | 
| +  predictor->SerializeReferrers(&recovered_referral_list); | 
| // Icon is also trimmed away, so entire set gets discarded. | 
| EXPECT_EQ(1U, recovered_referral_list.GetSize()); | 
| EXPECT_FALSE(GetDataFromSerialization( | 
| @@ -465,7 +489,7 @@ | 
| EXPECT_FALSE(GetDataFromSerialization( | 
| motivation_url, img_subresource_url, recovered_referral_list, &rate)); | 
|  | 
| -  predictor.Shutdown(); | 
| +  predictor->Shutdown(); | 
| } | 
|  | 
|  | 
| @@ -577,24 +601,27 @@ | 
| } | 
|  | 
| TEST_F(PredictorTest, DiscardPredictorResults) { | 
| -  Predictor predictor(true); | 
| -  predictor.SetHostResolver(host_resolver_.get()); | 
| +  scoped_refptr<Predictor> predictor( | 
| +      new Predictor(host_resolver_.get(), | 
| +                    default_max_queueing_delay_, | 
| +                    PredictorInit::kMaxSpeculativeParallelResolves, | 
| +                    false)); | 
| ListValue referral_list; | 
| -  predictor.SerializeReferrers(&referral_list); | 
| +  predictor->SerializeReferrers(&referral_list); | 
| EXPECT_EQ(1U, referral_list.GetSize()); | 
|  | 
| GURL host_1("http://test_1"); | 
| GURL host_2("http://test_2"); | 
| -  predictor.LearnFromNavigation(host_1, host_2); | 
| +  predictor->LearnFromNavigation(host_1, host_2); | 
|  | 
| -  predictor.SerializeReferrers(&referral_list); | 
| +  predictor->SerializeReferrers(&referral_list); | 
| EXPECT_EQ(2U, referral_list.GetSize()); | 
|  | 
| -  predictor.DiscardAllResults(); | 
| -  predictor.SerializeReferrers(&referral_list); | 
| +  predictor->DiscardAllResults(); | 
| +  predictor->SerializeReferrers(&referral_list); | 
| EXPECT_EQ(1U, referral_list.GetSize()); | 
|  | 
| -  predictor.Shutdown(); | 
| +  predictor->Shutdown(); | 
| } | 
|  | 
| }  // namespace chrome_browser_net | 
|  |