OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/net/predictor.h" | 5 #include "chrome/browser/net/predictor.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <time.h> | |
9 | 8 |
10 #include <algorithm> | 9 #include <algorithm> |
11 #include <memory> | 10 #include <memory> |
12 #include <sstream> | 11 #include <sstream> |
13 #include <string> | 12 #include <string> |
14 | 13 |
15 #include "base/location.h" | 14 #include "base/location.h" |
16 #include "base/macros.h" | 15 #include "base/macros.h" |
17 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
18 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
19 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
20 #include "base/threading/thread_task_runner_handle.h" | 19 #include "base/threading/thread_task_runner_handle.h" |
21 #include "base/timer/timer.h" | |
22 #include "base/values.h" | 20 #include "base/values.h" |
23 #include "build/build_config.h" | 21 #include "build/build_config.h" |
24 #include "chrome/browser/net/url_info.h" | 22 #include "chrome/browser/net/url_info.h" |
25 #include "components/network_hints/common/network_hints_common.h" | |
26 #include "content/public/test/test_browser_thread.h" | 23 #include "content/public/test/test_browser_thread.h" |
27 #include "net/base/address_list.h" | |
28 #include "net/base/load_flags.h" | 24 #include "net/base/load_flags.h" |
29 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
30 #include "net/base/winsock_init.h" | |
31 #include "net/dns/mock_host_resolver.h" | |
32 #include "net/http/transport_security_state.h" | 26 #include "net/http/transport_security_state.h" |
33 #include "net/proxy/proxy_config_service_fixed.h" | 27 #include "net/proxy/proxy_config_service_fixed.h" |
34 #include "net/proxy/proxy_service.h" | 28 #include "net/proxy/proxy_service.h" |
35 #include "testing/gmock/include/gmock/gmock.h" | 29 #include "testing/gmock/include/gmock/gmock.h" |
36 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
37 | 31 |
38 using base::Time; | 32 using base::Time; |
39 using base::TimeDelta; | 33 using base::TimeDelta; |
40 using content::BrowserThread; | 34 using content::BrowserThread; |
41 | 35 |
42 namespace chrome_browser_net { | 36 namespace chrome_browser_net { |
43 | 37 |
44 class WaitForResolutionHelper; | |
45 | |
46 class WaitForResolutionHelper { | |
47 public: | |
48 WaitForResolutionHelper(Predictor* predictor, | |
49 const UrlList& hosts, | |
50 base::RepeatingTimer* timer, | |
51 int checks_until_quit) | |
52 : predictor_(predictor), | |
53 hosts_(hosts), | |
54 timer_(timer), | |
55 checks_until_quit_(checks_until_quit) {} | |
56 | |
57 void CheckIfResolutionsDone() { | |
58 if (--checks_until_quit_ > 0) { | |
59 for (UrlList::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i) | |
60 if (predictor_->GetResolutionDuration(*i) == | |
61 UrlInfo::NullDuration()) | |
62 return; // We don't have resolution for that host. | |
63 } | |
64 | |
65 // When all hostnames have been resolved, or we've hit the limit, | |
66 // exit the loop. | |
67 timer_->Stop(); | |
68 base::MessageLoop::current()->QuitWhenIdle(); | |
69 delete timer_; | |
70 delete this; | |
71 } | |
72 | |
73 private: | |
74 Predictor* predictor_; | |
75 const UrlList hosts_; | |
76 base::RepeatingTimer* timer_; | |
77 int checks_until_quit_; | |
78 }; | |
79 | |
80 class PredictorTest : public testing::Test { | 38 class PredictorTest : public testing::Test { |
81 public: | 39 public: |
82 PredictorTest() | 40 PredictorTest() |
83 : ui_thread_(BrowserThread::UI, &loop_), | 41 : ui_thread_(BrowserThread::UI, &loop_), |
84 io_thread_(BrowserThread::IO, &loop_), | 42 io_thread_(BrowserThread::IO, &loop_) {} |
85 host_resolver_(new net::MockCachingHostResolver()) { | |
86 } | |
87 | |
88 protected: | |
89 void SetUp() override { | |
90 #if defined(OS_WIN) | |
91 net::EnsureWinsockInit(); | |
92 #endif | |
93 Predictor::set_max_parallel_resolves( | |
94 Predictor::kMaxSpeculativeParallelResolves); | |
95 Predictor::set_max_queueing_delay( | |
96 Predictor::kMaxSpeculativeResolveQueueDelayMs); | |
97 // Since we are using a caching HostResolver, the following latencies will | |
98 // only be incurred by the first request, after which the result will be | |
99 // cached internally by |host_resolver_|. | |
100 net::RuleBasedHostResolverProc* rules = host_resolver_->rules(); | |
101 rules->AddRuleWithLatency("www.google.com", "127.0.0.1", 50); | |
102 rules->AddRuleWithLatency("gmail.google.com.com", "127.0.0.1", 70); | |
103 rules->AddRuleWithLatency("mail.google.com", "127.0.0.1", 44); | |
104 rules->AddRuleWithLatency("gmail.com", "127.0.0.1", 63); | |
105 } | |
106 | |
107 void WaitForResolution(Predictor* predictor, const UrlList& hosts) { | |
108 base::RepeatingTimer* timer = new base::RepeatingTimer(); | |
109 // By default allow the loop to run for a minute -- 600 iterations. | |
110 timer->Start(FROM_HERE, TimeDelta::FromMilliseconds(100), | |
111 new WaitForResolutionHelper(predictor, hosts, timer, 600), | |
112 &WaitForResolutionHelper::CheckIfResolutionsDone); | |
113 base::MessageLoop::current()->Run(); | |
114 } | |
115 | |
116 void WaitForResolutionWithLimit( | |
117 Predictor* predictor, const UrlList& hosts, int limit) { | |
118 base::RepeatingTimer* timer = new base::RepeatingTimer(); | |
119 timer->Start(FROM_HERE, TimeDelta::FromMilliseconds(100), | |
120 new WaitForResolutionHelper(predictor, hosts, timer, limit), | |
121 &WaitForResolutionHelper::CheckIfResolutionsDone); | |
122 base::MessageLoop::current()->Run(); | |
123 } | |
124 | 43 |
125 private: | 44 private: |
126 // IMPORTANT: do not move this below |host_resolver_|; the host resolver | |
127 // must not outlive the message loop, otherwise bad things can happen | |
128 // (like posting to a deleted message loop). | |
129 base::MessageLoopForUI loop_; | 45 base::MessageLoopForUI loop_; |
130 content::TestBrowserThread ui_thread_; | 46 content::TestBrowserThread ui_thread_; |
131 content::TestBrowserThread io_thread_; | 47 content::TestBrowserThread io_thread_; |
132 | |
133 protected: | |
134 std::unique_ptr<net::MockCachingHostResolver> host_resolver_; | |
135 }; | 48 }; |
136 | 49 |
137 //------------------------------------------------------------------------------ | 50 //------------------------------------------------------------------------------ |
138 | |
139 TEST_F(PredictorTest, StartupShutdownTest) { | |
140 Predictor testing_master(true, true); | |
141 testing_master.Shutdown(); | |
142 } | |
143 | |
144 | |
145 TEST_F(PredictorTest, ShutdownWhenResolutionIsPendingTest) { | |
146 std::unique_ptr<net::HostResolver> host_resolver( | |
147 new net::HangingHostResolver()); | |
148 | |
149 Predictor testing_master(true, true); | |
150 testing_master.SetHostResolver(host_resolver.get()); | |
151 | |
152 GURL localhost("http://localhost:80"); | |
153 UrlList names; | |
154 names.push_back(localhost); | |
155 | |
156 testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | |
157 | |
158 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
159 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), | |
160 base::TimeDelta::FromMilliseconds(500)); | |
161 base::MessageLoop::current()->Run(); | |
162 | |
163 EXPECT_FALSE(testing_master.WasFound(localhost)); | |
164 | |
165 testing_master.Shutdown(); | |
166 | |
167 // Clean up after ourselves. | |
168 base::MessageLoop::current()->RunUntilIdle(); | |
169 } | |
170 | |
171 TEST_F(PredictorTest, SingleLookupTest) { | |
172 Predictor testing_master(true, true); | |
173 testing_master.SetHostResolver(host_resolver_.get()); | |
174 | |
175 GURL goog("http://www.google.com:80"); | |
176 | |
177 UrlList names; | |
178 names.push_back(goog); | |
179 | |
180 // Try to flood the predictor with many concurrent requests. | |
181 for (int i = 0; i < 10; i++) | |
182 testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | |
183 | |
184 WaitForResolution(&testing_master, names); | |
185 | |
186 EXPECT_TRUE(testing_master.WasFound(goog)); | |
187 | |
188 base::MessageLoop::current()->RunUntilIdle(); | |
189 | |
190 EXPECT_GT(testing_master.peak_pending_lookups(), names.size() / 2); | |
191 EXPECT_LE(testing_master.peak_pending_lookups(), names.size()); | |
192 EXPECT_LE(testing_master.peak_pending_lookups(), | |
193 testing_master.max_concurrent_dns_lookups()); | |
194 | |
195 testing_master.Shutdown(); | |
196 } | |
197 | |
198 TEST_F(PredictorTest, ConcurrentLookupTest) { | |
199 host_resolver_->rules()->AddSimulatedFailure("*.notfound"); | |
200 | |
201 Predictor testing_master(true, true); | |
202 testing_master.SetHostResolver(host_resolver_.get()); | |
203 | |
204 GURL goog("http://www.google.com:80"), | |
205 goog2("http://gmail.google.com.com:80"), | |
206 goog3("http://mail.google.com:80"), | |
207 goog4("http://gmail.com:80"); | |
208 GURL bad1("http://bad1.notfound:80"), | |
209 bad2("http://bad2.notfound:80"); | |
210 | |
211 UrlList names; | |
212 names.push_back(goog); | |
213 names.push_back(goog3); | |
214 names.push_back(bad1); | |
215 names.push_back(goog2); | |
216 names.push_back(bad2); | |
217 names.push_back(goog4); | |
218 names.push_back(goog); | |
219 | |
220 // Try to flood the predictor with many concurrent requests. | |
221 for (int i = 0; i < 10; i++) | |
222 testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | |
223 | |
224 WaitForResolution(&testing_master, names); | |
225 | |
226 EXPECT_TRUE(testing_master.WasFound(goog)); | |
227 EXPECT_TRUE(testing_master.WasFound(goog3)); | |
228 EXPECT_TRUE(testing_master.WasFound(goog2)); | |
229 EXPECT_TRUE(testing_master.WasFound(goog4)); | |
230 EXPECT_FALSE(testing_master.WasFound(bad1)); | |
231 EXPECT_FALSE(testing_master.WasFound(bad2)); | |
232 | |
233 base::MessageLoop::current()->RunUntilIdle(); | |
234 | |
235 EXPECT_FALSE(testing_master.WasFound(bad1)); | |
236 EXPECT_FALSE(testing_master.WasFound(bad2)); | |
237 | |
238 EXPECT_LE(testing_master.peak_pending_lookups(), names.size()); | |
239 EXPECT_LE(testing_master.peak_pending_lookups(), | |
240 testing_master.max_concurrent_dns_lookups()); | |
241 | |
242 testing_master.Shutdown(); | |
243 } | |
244 | |
245 TEST_F(PredictorTest, MassiveConcurrentLookupTest) { | |
246 host_resolver_->rules()->AddSimulatedFailure("*.notfound"); | |
247 | |
248 Predictor testing_master(true, true); | |
249 testing_master.SetHostResolver(host_resolver_.get()); | |
250 | |
251 UrlList names; | |
252 for (int i = 0; i < 100; i++) | |
253 names.push_back(GURL( | |
254 "http://host" + base::IntToString(i) + ".notfound:80")); | |
255 | |
256 // Try to flood the predictor with many concurrent requests. | |
257 for (int i = 0; i < 10; i++) | |
258 testing_master.ResolveList(names, UrlInfo::PAGE_SCAN_MOTIVATED); | |
259 | |
260 WaitForResolution(&testing_master, names); | |
261 | |
262 base::MessageLoop::current()->RunUntilIdle(); | |
263 | |
264 EXPECT_LE(testing_master.peak_pending_lookups(), names.size()); | |
265 EXPECT_LE(testing_master.peak_pending_lookups(), | |
266 testing_master.max_concurrent_dns_lookups()); | |
267 | |
268 testing_master.Shutdown(); | |
269 } | |
270 | |
271 //------------------------------------------------------------------------------ | |
272 // Functions to help synthesize and test serializations of subresource referrer | 51 // Functions to help synthesize and test serializations of subresource referrer |
273 // lists. | 52 // lists. |
274 | 53 |
275 // Return a motivation_list if we can find one for the given motivating_host (or | 54 // Return a motivation_list if we can find one for the given motivating_host (or |
276 // NULL if a match is not found). | 55 // NULL if a match is not found). |
277 static const base::ListValue* FindSerializationMotivation( | 56 static const base::ListValue* FindSerializationMotivation( |
278 const GURL& motivation, | 57 const GURL& motivation, |
279 const base::ListValue* referral_list) { | 58 const base::ListValue* referral_list) { |
280 CHECK_LT(0u, referral_list->GetSize()); // Room for version. | 59 CHECK_LT(0u, referral_list->GetSize()); // Room for version. |
281 int format_version = -1; | 60 int format_version = -1; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 std::string url_spec; | 137 std::string url_spec; |
359 EXPECT_TRUE(subresource_list->GetString(i++, &url_spec)); | 138 EXPECT_TRUE(subresource_list->GetString(i++, &url_spec)); |
360 EXPECT_TRUE(subresource_list->GetDouble(i++, use_rate)); | 139 EXPECT_TRUE(subresource_list->GetDouble(i++, use_rate)); |
361 if (subresource == GURL(url_spec)) { | 140 if (subresource == GURL(url_spec)) { |
362 return true; | 141 return true; |
363 } | 142 } |
364 } | 143 } |
365 return false; | 144 return false; |
366 } | 145 } |
367 | 146 |
368 //------------------------------------------------------------------------------ | 147 TEST_F(PredictorTest, StartupShutdownTest) { |
| 148 Predictor testing_master(true, true); |
| 149 testing_master.Shutdown(); |
| 150 } |
369 | 151 |
370 // Make sure nil referral lists really have no entries, and no latency listed. | 152 // Make sure nil referral lists really have no entries, and no latency listed. |
371 TEST_F(PredictorTest, ReferrerSerializationNilTest) { | 153 TEST_F(PredictorTest, ReferrerSerializationNilTest) { |
372 Predictor predictor(true, true); | 154 Predictor predictor(true, true); |
373 predictor.SetHostResolver(host_resolver_.get()); | |
374 | 155 |
375 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); | 156 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); |
376 predictor.SerializeReferrers(referral_list.get()); | 157 predictor.SerializeReferrers(referral_list.get()); |
377 EXPECT_EQ(1U, referral_list->GetSize()); | 158 EXPECT_EQ(1U, referral_list->GetSize()); |
378 EXPECT_FALSE(GetDataFromSerialization( | 159 EXPECT_FALSE(GetDataFromSerialization( |
379 GURL("http://a.com:79"), GURL("http://b.com:78"), | 160 GURL("http://a.com:79"), GURL("http://b.com:78"), |
380 *referral_list.get(), NULL)); | 161 *referral_list.get(), NULL)); |
381 | 162 |
382 predictor.Shutdown(); | 163 predictor.Shutdown(); |
383 } | 164 } |
384 | 165 |
385 // Make sure that when a serialization list includes a value, that it can be | 166 // Make sure that when a serialization list includes a value, that it can be |
386 // deserialized into the database, and can be extracted back out via | 167 // deserialized into the database, and can be extracted back out via |
387 // serialization without being changed. | 168 // serialization without being changed. |
388 TEST_F(PredictorTest, ReferrerSerializationSingleReferrerTest) { | 169 TEST_F(PredictorTest, ReferrerSerializationSingleReferrerTest) { |
389 Predictor predictor(true, true); | 170 Predictor predictor(true, true); |
390 predictor.SetHostResolver(host_resolver_.get()); | |
391 const GURL motivation_url("http://www.google.com:91"); | 171 const GURL motivation_url("http://www.google.com:91"); |
392 const GURL subresource_url("http://icons.google.com:90"); | 172 const GURL subresource_url("http://icons.google.com:90"); |
393 const double kUseRate = 23.4; | 173 const double kUseRate = 23.4; |
394 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); | 174 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); |
395 | 175 |
396 AddToSerializedList(motivation_url, subresource_url, | 176 AddToSerializedList(motivation_url, subresource_url, |
397 kUseRate, referral_list.get()); | 177 kUseRate, referral_list.get()); |
398 | 178 |
399 predictor.DeserializeReferrers(*referral_list.get()); | 179 predictor.DeserializeReferrers(*referral_list.get()); |
400 | 180 |
401 base::ListValue recovered_referral_list; | 181 base::ListValue recovered_referral_list; |
402 predictor.SerializeReferrers(&recovered_referral_list); | 182 predictor.SerializeReferrers(&recovered_referral_list); |
403 EXPECT_EQ(2U, recovered_referral_list.GetSize()); | 183 EXPECT_EQ(2U, recovered_referral_list.GetSize()); |
404 double rate; | 184 double rate; |
405 EXPECT_TRUE(GetDataFromSerialization( | 185 EXPECT_TRUE(GetDataFromSerialization( |
406 motivation_url, subresource_url, recovered_referral_list, &rate)); | 186 motivation_url, subresource_url, recovered_referral_list, &rate)); |
407 EXPECT_EQ(rate, kUseRate); | 187 EXPECT_EQ(rate, kUseRate); |
408 | 188 |
409 predictor.Shutdown(); | 189 predictor.Shutdown(); |
410 } | 190 } |
411 | 191 |
412 // Check that GetHtmlReferrerLists() doesn't crash when given duplicated | 192 // Check that GetHtmlReferrerLists() doesn't crash when given duplicated |
413 // domains for referring URL, and that it sorts the results in the | 193 // domains for referring URL, and that it sorts the results in the |
414 // correct order. | 194 // correct order. |
415 TEST_F(PredictorTest, GetHtmlReferrerLists) { | 195 TEST_F(PredictorTest, GetHtmlReferrerLists) { |
416 Predictor predictor(true, true); | 196 Predictor predictor(true, true); |
417 predictor.SetHostResolver(host_resolver_.get()); | |
418 const double kUseRate = 23.4; | 197 const double kUseRate = 23.4; |
419 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); | 198 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); |
420 | 199 |
421 AddToSerializedList( | 200 AddToSerializedList( |
422 GURL("http://d.google.com/x1"), | 201 GURL("http://d.google.com/x1"), |
423 GURL("http://foo.com/"), | 202 GURL("http://foo.com/"), |
424 kUseRate, referral_list.get()); | 203 kUseRate, referral_list.get()); |
425 | 204 |
426 // Duplicated hostname (d.google.com). This should not cause any crashes | 205 // Duplicated hostname (d.google.com). This should not cause any crashes |
427 // (i.e. crbug.com/116345) | 206 // (i.e. crbug.com/116345) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 if ((a) < 0.) \ | 271 if ((a) < 0.) \ |
493 espilon_ratio = 1 / espilon_ratio; \ | 272 espilon_ratio = 1 / espilon_ratio; \ |
494 EXPECT_LT(a, espilon_ratio * (b)); \ | 273 EXPECT_LT(a, espilon_ratio * (b)); \ |
495 EXPECT_GT((a) * espilon_ratio, b); \ | 274 EXPECT_GT((a) * espilon_ratio, b); \ |
496 } while (0) | 275 } while (0) |
497 | 276 |
498 | 277 |
499 // Make sure the Trim() functionality works as expected. | 278 // Make sure the Trim() functionality works as expected. |
500 TEST_F(PredictorTest, ReferrerSerializationTrimTest) { | 279 TEST_F(PredictorTest, ReferrerSerializationTrimTest) { |
501 Predictor predictor(true, true); | 280 Predictor predictor(true, true); |
502 predictor.SetHostResolver(host_resolver_.get()); | |
503 GURL motivation_url("http://www.google.com:110"); | 281 GURL motivation_url("http://www.google.com:110"); |
504 | 282 |
505 GURL icon_subresource_url("http://icons.google.com:111"); | 283 GURL icon_subresource_url("http://icons.google.com:111"); |
506 const double kRateIcon = 16.0 * Predictor::kDiscardableExpectedValue; | 284 const double kRateIcon = 16.0 * Predictor::kDiscardableExpectedValue; |
507 GURL img_subresource_url("http://img.google.com:118"); | 285 GURL img_subresource_url("http://img.google.com:118"); |
508 const double kRateImg = 8.0 * Predictor::kDiscardableExpectedValue; | 286 const double kRateImg = 8.0 * Predictor::kDiscardableExpectedValue; |
509 | 287 |
510 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); | 288 std::unique_ptr<base::ListValue> referral_list(NewEmptySerializationList()); |
511 AddToSerializedList( | 289 AddToSerializedList( |
512 motivation_url, icon_subresource_url, kRateIcon, referral_list.get()); | 290 motivation_url, icon_subresource_url, kRateIcon, referral_list.get()); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 Predictor::CanonicalizeUrl(https)); | 459 Predictor::CanonicalizeUrl(https)); |
682 | 460 |
683 // Https works fine. | 461 // Https works fine. |
684 GURL long_https("https://host:999/path?query=value"); | 462 GURL long_https("https://host:999/path?query=value"); |
685 EXPECT_EQ(Predictor::CanonicalizeUrl(long_https), | 463 EXPECT_EQ(Predictor::CanonicalizeUrl(long_https), |
686 long_https.GetWithEmptyPath()); | 464 long_https.GetWithEmptyPath()); |
687 } | 465 } |
688 | 466 |
689 TEST_F(PredictorTest, DiscardPredictorResults) { | 467 TEST_F(PredictorTest, DiscardPredictorResults) { |
690 SimplePredictor predictor(true, true); | 468 SimplePredictor predictor(true, true); |
691 predictor.SetHostResolver(host_resolver_.get()); | |
692 base::ListValue referral_list; | 469 base::ListValue referral_list; |
693 predictor.SerializeReferrers(&referral_list); | 470 predictor.SerializeReferrers(&referral_list); |
694 EXPECT_EQ(1U, referral_list.GetSize()); | 471 EXPECT_EQ(1U, referral_list.GetSize()); |
695 | 472 |
696 GURL host_1("http://test_1"); | 473 GURL host_1("http://test_1"); |
697 GURL host_2("http://test_2"); | 474 GURL host_2("http://test_2"); |
698 predictor.LearnFromNavigation(host_1, host_2); | 475 predictor.LearnFromNavigation(host_1, host_2); |
699 | 476 |
700 predictor.SerializeReferrers(&referral_list); | 477 predictor.SerializeReferrers(&referral_list); |
701 EXPECT_EQ(2U, referral_list.GetSize()); | 478 EXPECT_EQ(2U, referral_list.GetSize()); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 testing_master.Resolve(goog, UrlInfo::OMNIBOX_MOTIVATED); | 619 testing_master.Resolve(goog, UrlInfo::OMNIBOX_MOTIVATED); |
843 | 620 |
844 // Proxy may not be in use (the PAC script has not yet been evaluated), so the | 621 // Proxy may not be in use (the PAC script has not yet been evaluated), so the |
845 // name has been registered for pre-resolve. | 622 // name has been registered for pre-resolve. |
846 EXPECT_FALSE(testing_master.work_queue_.IsEmpty()); | 623 EXPECT_FALSE(testing_master.work_queue_.IsEmpty()); |
847 | 624 |
848 testing_master.Shutdown(); | 625 testing_master.Shutdown(); |
849 } | 626 } |
850 | 627 |
851 } // namespace chrome_browser_net | 628 } // namespace chrome_browser_net |
OLD | NEW |