Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Side by Side Diff: components/precache/core/precache_fetcher_unittest.cc

Issue 2229983002: Send the list of used and unused resources for precache (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added more tests Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/precache/core/precache_fetcher.h" 5 #include "components/precache/core/precache_fetcher.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <cstring> 9 #include <cstring>
10 #include <memory> 10 #include <memory>
11 #include <set> 11 #include <set>
12 #include <string> 12 #include <string>
13 #include <vector> 13 #include <vector>
14 14
15 #include "base/bind.h" 15 #include "base/bind.h"
16 #include "base/callback.h" 16 #include "base/callback.h"
17 #include "base/command_line.h" 17 #include "base/command_line.h"
18 #include "base/compiler_specific.h" 18 #include "base/compiler_specific.h"
19 #include "base/files/file_path.h"
20 #include "base/files/scoped_temp_dir.h"
19 #include "base/memory/ptr_util.h" 21 #include "base/memory/ptr_util.h"
20 #include "base/memory/ref_counted.h" 22 #include "base/memory/ref_counted.h"
21 #include "base/memory/weak_ptr.h" 23 #include "base/memory/weak_ptr.h"
22 #include "base/run_loop.h" 24 #include "base/run_loop.h"
23 #include "base/single_thread_task_runner.h" 25 #include "base/single_thread_task_runner.h"
24 #include "base/strings/stringprintf.h" 26 #include "base/strings/stringprintf.h"
25 #include "base/test/histogram_tester.h" 27 #include "base/test/histogram_tester.h"
26 #include "base/threading/thread_task_runner_handle.h" 28 #include "base/threading/thread_task_runner_handle.h"
29 #include "components/precache/core/precache_database.h"
27 #include "components/precache/core/precache_switches.h" 30 #include "components/precache/core/precache_switches.h"
28 #include "components/precache/core/proto/precache.pb.h" 31 #include "components/precache/core/proto/precache.pb.h"
29 #include "components/precache/core/proto/unfinished_work.pb.h" 32 #include "components/precache/core/proto/unfinished_work.pb.h"
33 #include "net/base/escape.h"
30 #include "net/base/load_flags.h" 34 #include "net/base/load_flags.h"
31 #include "net/http/http_response_headers.h" 35 #include "net/http/http_response_headers.h"
36 #include "net/http/http_response_info.h"
32 #include "net/http/http_status_code.h" 37 #include "net/http/http_status_code.h"
33 #include "net/url_request/test_url_fetcher_factory.h" 38 #include "net/url_request/test_url_fetcher_factory.h"
34 #include "net/url_request/url_request_status.h" 39 #include "net/url_request/url_request_status.h"
35 #include "net/url_request/url_request_test_util.h" 40 #include "net/url_request/url_request_test_util.h"
36 #include "testing/gmock/include/gmock/gmock.h" 41 #include "testing/gmock/include/gmock/gmock.h"
37 #include "testing/gtest/include/gtest/gtest.h" 42 #include "testing/gtest/include/gtest/gtest.h"
38 #include "url/gurl.h" 43 #include "url/gurl.h"
39 44
40 namespace precache { 45 namespace precache {
41 46
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 net::URLRequestStatus::Status status) { 88 net::URLRequestStatus::Status status) {
84 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher( 89 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher(
85 url, delegate, response_data, response_code, status)); 90 url, delegate, response_data, response_code, status));
86 91
87 total_response_bytes_ += response_data.size(); 92 total_response_bytes_ += response_data.size();
88 requested_urls_.insert(url); 93 requested_urls_.insert(url);
89 94
90 return fetcher; 95 return fetcher;
91 } 96 }
92 97
93 const std::multiset<GURL>& requested_urls() const { 98 const std::multiset<GURL>& requested_urls() const { return requested_urls_; }
94 return requested_urls_; 99
95 } 100 void clear_requested_urls() { requested_urls_.clear(); }
96 101
97 int total_response_bytes() const { return total_response_bytes_; } 102 int total_response_bytes() const { return total_response_bytes_; }
98 103
99 private: 104 private:
100 // Multiset with one entry for each URL requested. 105 // Multiset with one entry for each URL requested.
101 std::multiset<GURL> requested_urls_; 106 std::multiset<GURL> requested_urls_;
102 int total_response_bytes_; 107 int total_response_bytes_;
103 }; 108 };
104 109
105 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate { 110 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 GURL url(kConfigURL); 228 GURL url(kConfigURL);
224 229
225 net::FakeURLFetcher* fetcher = nullptr; 230 net::FakeURLFetcher* fetcher = nullptr;
226 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 231 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
227 .WillOnce(factory_.RespondWith("", &fetcher)); 232 .WillOnce(factory_.RespondWith("", &fetcher));
228 EXPECT_CALL(*this, 233 EXPECT_CALL(*this,
229 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 234 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
230 NotNull()))); 235 NotNull())));
231 236
232 PrecacheFetcher::Fetcher precache_fetcher( 237 PrecacheFetcher::Fetcher precache_fetcher(
233 request_context_.get(), url, callback_, false /* is_resource_request */, 238 request_context_.get(), url, url.host(), callback_,
234 SIZE_MAX); 239 false /* is_resource_request */, SIZE_MAX);
235 240
236 loop_.RunUntilIdle(); 241 base::RunLoop().RunUntilIdle();
237 242
238 ASSERT_NE(nullptr, fetcher); 243 ASSERT_NE(nullptr, fetcher);
239 EXPECT_EQ(kNoTracking, fetcher->GetLoadFlags()); 244 EXPECT_EQ(kNoTracking, fetcher->GetLoadFlags());
240 } 245 }
241 246
242 TEST_F(PrecacheFetcherFetcherTest, ResourceNotInCache) { 247 TEST_F(PrecacheFetcherFetcherTest, ResourceNotInCache) {
243 GURL url(kGoodResourceURL); 248 GURL url(kGoodResourceURL);
244 249
245 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr; 250 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr;
246 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 251 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
247 .WillOnce(factory_.RespondWith("", CacheMiss, &fetcher1)) 252 .WillOnce(factory_.RespondWith("", CacheMiss, &fetcher1))
248 .WillOnce(factory_.RespondWith("", &fetcher2)); 253 .WillOnce(factory_.RespondWith("", &fetcher2));
249 EXPECT_CALL(*this, 254 EXPECT_CALL(*this,
250 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 255 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
251 NotNull()))) 256 NotNull())))
252 .Times(1); 257 .Times(1);
253 258
254 PrecacheFetcher::Fetcher precache_fetcher( 259 PrecacheFetcher::Fetcher precache_fetcher(
255 request_context_.get(), url, callback_, true /* is_resource_request */, 260 request_context_.get(), url, url.host(), callback_,
256 SIZE_MAX); 261 true /* is_resource_request */, SIZE_MAX);
257 262
258 loop_.RunUntilIdle(); 263 base::RunLoop().RunUntilIdle();
259 264
260 ASSERT_NE(nullptr, fetcher1); 265 ASSERT_NE(nullptr, fetcher1);
261 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags()); 266 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags());
262 ASSERT_NE(nullptr, fetcher2); 267 ASSERT_NE(nullptr, fetcher2);
263 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags()); 268 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags());
264 } 269 }
265 270
266 TEST_F(PrecacheFetcherFetcherTest, ResourceHasValidators) { 271 TEST_F(PrecacheFetcherFetcherTest, ResourceHasValidators) {
267 GURL url(kGoodResourceURL); 272 GURL url(kGoodResourceURL);
268 273
269 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr; 274 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr;
270 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 275 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
271 .WillOnce(factory_.RespondWith("", HasETag, &fetcher1)) 276 .WillOnce(factory_.RespondWith("", HasETag, &fetcher1))
272 .WillOnce(factory_.RespondWith("", &fetcher2)); 277 .WillOnce(factory_.RespondWith("", &fetcher2));
273 EXPECT_CALL(*this, 278 EXPECT_CALL(*this,
274 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 279 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
275 NotNull()))); 280 NotNull())));
276 281
277 PrecacheFetcher::Fetcher precache_fetcher( 282 PrecacheFetcher::Fetcher precache_fetcher(
278 request_context_.get(), url, callback_, true /* is_resource_request */, 283 request_context_.get(), url, url.host(), callback_,
279 SIZE_MAX); 284 true /* is_resource_request */, SIZE_MAX);
280 285
281 loop_.RunUntilIdle(); 286 base::RunLoop().RunUntilIdle();
282 287
283 ASSERT_NE(nullptr, fetcher1); 288 ASSERT_NE(nullptr, fetcher1);
284 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags()); 289 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags());
285 ASSERT_NE(nullptr, fetcher2); 290 ASSERT_NE(nullptr, fetcher2);
286 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags()); 291 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags());
287 } 292 }
288 293
289 TEST_F(PrecacheFetcherFetcherTest, ResourceHasNoValidators) { 294 TEST_F(PrecacheFetcherFetcherTest, ResourceHasNoValidators) {
290 GURL url(kGoodResourceURL); 295 GURL url(kGoodResourceURL);
291 296
292 net::FakeURLFetcher* fetcher; 297 net::FakeURLFetcher* fetcher;
293 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 298 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
294 .WillOnce(factory_.RespondWith("", &fetcher)); 299 .WillOnce(factory_.RespondWith("", &fetcher));
295 EXPECT_CALL(*this, 300 EXPECT_CALL(*this,
296 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 301 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
297 nullptr))); // It never reached the network. 302 nullptr))); // It never reached the network.
298 303
299 PrecacheFetcher::Fetcher precache_fetcher( 304 PrecacheFetcher::Fetcher precache_fetcher(
300 request_context_.get(), url, callback_, true /* is_resource_request */, 305 request_context_.get(), url, url.host(), callback_,
301 SIZE_MAX); 306 true /* is_resource_request */, SIZE_MAX);
302 307
303 loop_.RunUntilIdle(); 308 base::RunLoop().RunUntilIdle();
304 309
305 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher->GetLoadFlags()); 310 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher->GetLoadFlags());
306 } 311 }
307 312
308 TEST_F(PrecacheFetcherFetcherTest, ResourceTooBig) { 313 TEST_F(PrecacheFetcherFetcherTest, ResourceTooBig) {
309 GURL url(kGoodResourceURL); 314 GURL url(kGoodResourceURL);
310 315
311 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 316 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
312 // Cache request will fail, so that a network request is made. Only 317 // Cache request will fail, so that a network request is made. Only
313 // network requests are byte-capped. 318 // network requests are byte-capped.
314 .WillOnce(factory_.RespondWith("", CacheMiss, nullptr)) 319 .WillOnce(factory_.RespondWith("", CacheMiss, nullptr))
315 .WillOnce(factory_.RespondWith(std::string(100, '.'), nullptr)); 320 .WillOnce(factory_.RespondWith(std::string(100, '.'), nullptr));
316 321
317 // The callback should be called even though the download was cancelled, so 322 // The callback should be called even though the download was cancelled, so
318 // that the next download can start. The network_url_fetcher within should be 323 // that the next download can start. The network_url_fetcher within should be
319 // null, to signify that either the network was never reached (which will be 324 // null, to signify that either the network was never reached (which will be
320 // flagged as an error due to the expectation above) or it was requested but 325 // flagged as an error due to the expectation above) or it was requested but
321 // cancelled (which is the desired behavior). 326 // cancelled (which is the desired behavior).
322 EXPECT_CALL(*this, 327 EXPECT_CALL(*this,
323 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 328 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
324 nullptr))); 329 nullptr)));
325 330
326 PrecacheFetcher::Fetcher precache_fetcher( 331 PrecacheFetcher::Fetcher precache_fetcher(
327 request_context_.get(), url, callback_, true /* is_resource_request */, 332 request_context_.get(), url, url.host(), callback_,
328 99 /* max_bytes */); 333 true /* is_resource_request */, 99 /* max_bytes */);
329 334
330 loop_.RunUntilIdle(); 335 base::RunLoop().RunUntilIdle();
331 } 336 }
332 337
333 class PrecacheFetcherTest : public testing::Test { 338 class PrecacheFetcherTest : public testing::Test {
334 public: 339 public:
335 PrecacheFetcherTest() 340 PrecacheFetcherTest()
336 : request_context_(new net::TestURLRequestContextGetter( 341 : task_runner_(base::ThreadTaskRunnerHandle::Get()),
342 request_context_(new net::TestURLRequestContextGetter(
337 base::ThreadTaskRunnerHandle::Get())), 343 base::ThreadTaskRunnerHandle::Get())),
338 factory_(NULL, 344 factory_(NULL,
339 base::Bind(&TestURLFetcherCallback::CreateURLFetcher, 345 base::Bind(&TestURLFetcherCallback::CreateURLFetcher,
340 base::Unretained(&url_callback_))), 346 base::Unretained(&url_callback_))),
341 expected_total_response_bytes_(0), 347 expected_total_response_bytes_(0),
342 parallel_fetches_beyond_capacity_(false) {} 348 parallel_fetches_beyond_capacity_(false) {}
343 349
350 void UpdatePrecacheReferrerHost(const std::string& hostname,
351 int64_t manifest_id) {
352 precache_database_.UpdatePrecacheReferrerHost(hostname, manifest_id,
353 base::Time());
354 }
355
356 void RecordURLPrefetch(const GURL& url, const std::string& referrer_host) {
357 precache_database_.RecordURLPrefetch(url, referrer_host, base::Time::Now(),
358 false /* was_cached */,
359 1000 /* size */);
360 }
361
362 void RecordURLNonPrefetch(const GURL& url) {
363 net::HttpResponseInfo info;
364 info.was_cached = true;
365 info.headers = new net::HttpResponseHeaders(std::string());
366 precache_database_.RecordURLNonPrefetch(
367 url, base::TimeDelta(), base::Time::Now(), info, 1000 /* size */,
368 0 /* host_rank */, false /* is_connection_cellular */);
369 }
370
344 protected: 371 protected:
372 void SetUp() override {
373 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
374 base::FilePath db_path = scoped_temp_dir_.path().Append(
375 base::FilePath(FILE_PATH_LITERAL("precache_database")));
376 precache_database_.Init(db_path);
377 }
345 void SetDefaultFlags() { 378 void SetDefaultFlags() {
346 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 379 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
347 switches::kPrecacheConfigSettingsURL, kConfigURL); 380 switches::kPrecacheConfigSettingsURL, kConfigURL);
348 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 381 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
349 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); 382 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix);
350 } 383 }
351 384
352 // Posts a task to check if more parallel fetches of precache manifest and 385 // Posts a task to check if more parallel fetches of precache manifest and
353 // resource URLs were attempted beyond the fetcher pool maximum defined 386 // resource URLs were attempted beyond the fetcher pool maximum defined
354 // capacity. The task will be posted repeatedly until such condition is met. 387 // capacity. The task will be posted repeatedly until such condition is met.
355 void CheckUntilParallelFetchesBeyondCapacity( 388 void CheckUntilParallelFetchesBeyondCapacity(
356 const PrecacheFetcher* precache_fetcher) { 389 const PrecacheFetcher* precache_fetcher) {
357 if (!precache_fetcher->pool_.IsAvailable() && 390 if (!precache_fetcher->pool_.IsAvailable() &&
358 !precache_fetcher->resource_urls_to_fetch_.empty() && 391 precache_fetcher->top_hosts_to_fetch_ &&
359 !precache_fetcher->manifest_urls_to_fetch_.empty()) { 392 !precache_fetcher->top_hosts_to_fetch_->empty() &&
393 !precache_fetcher->resources_to_fetch_.empty()) {
360 parallel_fetches_beyond_capacity_ = true; 394 parallel_fetches_beyond_capacity_ = true;
361 return; 395 return;
362 } 396 }
363 397
364 // Check again after allowing the message loop to process some messages. 398 // Check again after allowing the message loop to process some messages.
365 loop_.task_runner()->PostTask( 399 loop_.PostTask(
366 FROM_HERE, 400 FROM_HERE,
367 base::Bind( 401 base::Bind(
368 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity, 402 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity,
369 base::Unretained(this), precache_fetcher)); 403 base::Unretained(this), precache_fetcher));
370 } 404 }
371 405
406 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner() const {
407 return task_runner_;
408 }
409
410 // Must be declared first so that it is destroyed last.
372 base::MessageLoopForUI loop_; 411 base::MessageLoopForUI loop_;
412 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
373 scoped_refptr<net::TestURLRequestContextGetter> request_context_; 413 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
374 TestURLFetcherCallback url_callback_; 414 TestURLFetcherCallback url_callback_;
375 net::FakeURLFetcherFactory factory_; 415 net::FakeURLFetcherFactory factory_;
376 TestPrecacheDelegate precache_delegate_; 416 TestPrecacheDelegate precache_delegate_;
417 base::ScopedTempDir scoped_temp_dir_;
418 PrecacheDatabase precache_database_;
377 int expected_total_response_bytes_; 419 int expected_total_response_bytes_;
378 420
379 // True if more parallel fetches were attempted beyond the fetcher pool 421 // True if more parallel fetches were attempted beyond the fetcher pool
380 // maximum capacity. 422 // maximum capacity.
381 bool parallel_fetches_beyond_capacity_; 423 bool parallel_fetches_beyond_capacity_;
382 }; 424 };
383 425
384 TEST_F(PrecacheFetcherTest, FullPrecache) { 426 TEST_F(PrecacheFetcherTest, FullPrecache) {
385 SetDefaultFlags(); 427 SetDefaultFlags();
386 428
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 net::URLRequestStatus::FAILED); 460 net::URLRequestStatus::FAILED);
419 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 461 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
420 net::URLRequestStatus::SUCCESS); 462 net::URLRequestStatus::SUCCESS);
421 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), 463 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL),
422 PrecacheManifest().SerializeAsString(), net::HTTP_OK, 464 PrecacheManifest().SerializeAsString(), net::HTTP_OK,
423 net::URLRequestStatus::SUCCESS); 465 net::URLRequestStatus::SUCCESS);
424 466
425 base::HistogramTester histogram; 467 base::HistogramTester histogram;
426 468
427 { 469 {
428 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 470 PrecacheFetcher precache_fetcher(
429 std::string(), std::move(unfinished_work), 471 request_context_.get(), GURL(), std::string(),
430 kExperimentID, &precache_delegate_); 472 std::move(unfinished_work), kExperimentID,
473 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
431 precache_fetcher.Start(); 474 precache_fetcher.Start();
432 475
433 loop_.RunUntilIdle(); 476 base::RunLoop().RunUntilIdle();
434 477
435 // Destroy the PrecacheFetcher after it has finished, to record metrics. 478 // Destroy the PrecacheFetcher after it has finished, to record metrics.
436 } 479 }
437 480
438 std::multiset<GURL> expected_requested_urls; 481 std::multiset<GURL> expected_requested_urls;
439 expected_requested_urls.insert(GURL(kConfigURL)); 482 expected_requested_urls.insert(GURL(kConfigURL));
440 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); 483 expected_requested_urls.insert(GURL(kManifestFetchFailureURL));
441 expected_requested_urls.insert(GURL(kBadManifestURL)); 484 expected_requested_urls.insert(GURL(kBadManifestURL));
442 expected_requested_urls.insert(GURL(kGoodManifestURL)); 485 expected_requested_urls.insert(GURL(kGoodManifestURL));
443 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); 486 expected_requested_urls.insert(GURL(kResourceFetchFailureURL));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 529 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
487 net::URLRequestStatus::SUCCESS); 530 net::URLRequestStatus::SUCCESS);
488 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, 531 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK,
489 net::URLRequestStatus::SUCCESS); 532 net::URLRequestStatus::SUCCESS);
490 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, 533 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK,
491 net::URLRequestStatus::SUCCESS); 534 net::URLRequestStatus::SUCCESS);
492 535
493 base::HistogramTester histogram; 536 base::HistogramTester histogram;
494 537
495 { 538 {
496 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 539 PrecacheFetcher precache_fetcher(
497 std::string(), std::move(unfinished_work), 540 request_context_.get(), GURL(), std::string(),
498 kExperimentID, &precache_delegate_); 541 std::move(unfinished_work), kExperimentID,
542 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
499 precache_fetcher.Start(); 543 precache_fetcher.Start();
500 544
501 loop_.RunUntilIdle(); 545 base::RunLoop().RunUntilIdle();
502 546
503 // Destroy the PrecacheFetcher after it has finished, to record metrics. 547 // Destroy the PrecacheFetcher after it has finished, to record metrics.
504 } 548 }
505 549
506 std::multiset<GURL> expected_requested_urls; 550 std::multiset<GURL> expected_requested_urls;
507 expected_requested_urls.insert(GURL(kConfigURL)); 551 expected_requested_urls.insert(GURL(kConfigURL));
508 expected_requested_urls.insert(GURL(kGoodManifestURL)); 552 expected_requested_urls.insert(GURL(kGoodManifestURL));
509 expected_requested_urls.insert(GURL(kGoodResourceURL)); 553 expected_requested_urls.insert(GURL(kGoodResourceURL));
510 expected_requested_urls.insert(GURL(kGoodResourceURLB)); 554 expected_requested_urls.insert(GURL(kGoodResourceURLB));
511 expected_requested_urls.insert(GURL(kGoodResourceURLD)); 555 expected_requested_urls.insert(GURL(kGoodResourceURLD));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, 602 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK,
559 net::URLRequestStatus::SUCCESS); 603 net::URLRequestStatus::SUCCESS);
560 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK, 604 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK,
561 net::URLRequestStatus::SUCCESS); 605 net::URLRequestStatus::SUCCESS);
562 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, 606 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK,
563 net::URLRequestStatus::SUCCESS); 607 net::URLRequestStatus::SUCCESS);
564 608
565 base::HistogramTester histogram; 609 base::HistogramTester histogram;
566 610
567 { 611 {
568 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 612 PrecacheFetcher precache_fetcher(
569 std::string(), std::move(unfinished_work), 613 request_context_.get(), GURL(), std::string(),
570 kExperimentID, &precache_delegate_); 614 std::move(unfinished_work), kExperimentID,
615 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
571 precache_fetcher.Start(); 616 precache_fetcher.Start();
572 617
573 loop_.RunUntilIdle(); 618 base::RunLoop().RunUntilIdle();
574 619
575 // Destroy the PrecacheFetcher after it has finished, to record metrics. 620 // Destroy the PrecacheFetcher after it has finished, to record metrics.
576 } 621 }
577 622
578 std::multiset<GURL> expected_requested_urls; 623 std::multiset<GURL> expected_requested_urls;
579 expected_requested_urls.insert(GURL(kConfigURL)); 624 expected_requested_urls.insert(GURL(kConfigURL));
580 expected_requested_urls.insert(GURL(kGoodManifestURL)); 625 expected_requested_urls.insert(GURL(kGoodManifestURL));
581 expected_requested_urls.insert(GURL(kGoodResourceURL)); 626 expected_requested_urls.insert(GURL(kGoodResourceURL));
582 expected_requested_urls.insert(GURL(kGoodResourceURLA)); 627 expected_requested_urls.insert(GURL(kGoodResourceURLA));
583 expected_requested_urls.insert(GURL(kGoodResourceURLB)); 628 expected_requested_urls.insert(GURL(kGoodResourceURLB));
(...skipping 11 matching lines...) Expand all
595 } 640 }
596 641
597 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { 642 TEST_F(PrecacheFetcherTest, PrecachePauseResume) {
598 SetDefaultFlags(); 643 SetDefaultFlags();
599 644
600 PrecacheConfigurationSettings config; 645 PrecacheConfigurationSettings config;
601 config.set_top_sites_count(3); 646 config.set_top_sites_count(3);
602 647
603 std::unique_ptr<PrecacheUnfinishedWork> initial_work( 648 std::unique_ptr<PrecacheUnfinishedWork> initial_work(
604 new PrecacheUnfinishedWork()); 649 new PrecacheUnfinishedWork());
605 initial_work->add_manifest()->set_url( 650 initial_work->add_top_host()->set_hostname("manifest1.com");
606 "http://manifest-url-prefix.com/manifest1.com"); 651 initial_work->add_top_host()->set_hostname("manifest2.com");
607 initial_work->add_manifest()->set_url(
608 "http://manifest-url-prefix.com/manifest2.com");
609 initial_work->add_resource()->set_url(kGoodResourceURL);
610 initial_work->set_start_time( 652 initial_work->set_start_time(
611 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue()); 653 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue());
654 // initial_work->add_resource()->set_url(kGoodResourceURL);
sclittle 2016/08/15 20:13:10 nit: remove dead code
Raj 2016/08/16 17:54:37 Done.
612 655
613 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(), 656 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(),
614 std::move(initial_work), kExperimentID, 657 std::move(initial_work), kExperimentID,
658 precache_database_.GetWeakPtr(), task_runner(),
615 &precache_delegate_); 659 &precache_delegate_);
616 660 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
617 loop_.RunUntilIdle(); 661 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
662 first_fetcher.Start();
663 // base::RunLoop().RunUntilIdle();
sclittle 2016/08/15 20:13:10 nit: remove dead code, here and elsewhere
Raj 2016/08/16 17:54:37 Done.
618 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work = 664 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work =
619 first_fetcher.CancelPrecaching(); 665 first_fetcher.CancelPrecaching();
620 666
621 std::multiset<GURL> expected_requested_urls; 667 std::multiset<GURL> expected_requested_urls;
668 expected_requested_urls.insert(GURL(kConfigURL));
622 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 669 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
623 670
624 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 671 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
625 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 672 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
626 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK, 673 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK,
627 net::URLRequestStatus::SUCCESS); 674 net::URLRequestStatus::SUCCESS);
628 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"), 675 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"),
629 "bad protobuf", net::HTTP_OK, 676 "bad protobuf", net::HTTP_OK,
630 net::URLRequestStatus::SUCCESS); 677 net::URLRequestStatus::SUCCESS);
631 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"), 678 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"),
632 "bad protobuf", net::HTTP_OK, 679 "bad protobuf", net::HTTP_OK,
633 net::URLRequestStatus::SUCCESS); 680 net::URLRequestStatus::SUCCESS);
634 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 681 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
635 net::URLRequestStatus::SUCCESS); 682 net::URLRequestStatus::SUCCESS);
636 // Starting hosts should not be fetched. 683
637 unfinished_work->add_top_host()->set_hostname("bad-manifest.com"); 684 // unfinished_work->add_top_host()->set_hostname("bad-manifest.com");
685 url_callback_.clear_requested_urls();
638 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(), 686 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(),
639 std::move(unfinished_work), kExperimentID, 687 std::move(unfinished_work), kExperimentID,
688 precache_database_.GetWeakPtr(), task_runner(),
640 &precache_delegate_); 689 &precache_delegate_);
641 second_fetcher.Start(); 690 second_fetcher.Start();
642 loop_.RunUntilIdle(); 691 base::RunLoop().RunUntilIdle();
643 expected_requested_urls.insert(GURL(kConfigURL));
644 expected_requested_urls.insert( 692 expected_requested_urls.insert(
645 GURL("http://manifest-url-prefix.com/manifest1.com")); 693 GURL("http://manifest-url-prefix.com/manifest1.com"));
646 expected_requested_urls.insert( 694 expected_requested_urls.insert(
647 GURL("http://manifest-url-prefix.com/manifest2.com")); 695 GURL("http://manifest-url-prefix.com/manifest2.com"));
648 expected_requested_urls.insert(GURL(kGoodResourceURL)); 696 // expected_requested_urls.insert(GURL(kGoodResourceURL));
649 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 697 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
650 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 698 EXPECT_TRUE(precache_delegate_.was_on_done_called());
651 } 699 }
652 700
653 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) { 701 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) {
654 SetDefaultFlags(); 702 SetDefaultFlags();
655 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 703 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
656 new PrecacheUnfinishedWork()); 704 new PrecacheUnfinishedWork());
657 unfinished_work->mutable_config_settings()->add_forced_site( 705 unfinished_work->mutable_config_settings()->add_forced_site(
658 "good-manifest.com"); 706 "good-manifest.com");
659 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); 707 unfinished_work->set_start_time(base::Time::Now().ToInternalValue());
660 PrecacheManifest good_manifest; 708 PrecacheManifest good_manifest;
661 good_manifest.add_resource()->set_url(kGoodResourceURL); 709 good_manifest.add_resource()->set_url(kGoodResourceURL);
662 710
663 factory_.SetFakeResponse(GURL(kGoodManifestURL), 711 factory_.SetFakeResponse(GURL(kGoodManifestURL),
664 good_manifest.SerializeAsString(), net::HTTP_OK, 712 good_manifest.SerializeAsString(), net::HTTP_OK,
665 net::URLRequestStatus::SUCCESS); 713 net::URLRequestStatus::SUCCESS);
666 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 714 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
667 net::URLRequestStatus::SUCCESS); 715 net::URLRequestStatus::SUCCESS);
668 { 716 {
669 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 717 PrecacheFetcher precache_fetcher(
670 std::string(), std::move(unfinished_work), 718 request_context_.get(), GURL(), std::string(),
671 kExperimentID, &precache_delegate_); 719 std::move(unfinished_work), kExperimentID,
720 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
672 precache_fetcher.Start(); 721 precache_fetcher.Start();
673 722
674 loop_.RunUntilIdle(); 723 base::RunLoop().RunUntilIdle();
675 } 724 }
676 725
677 std::multiset<GURL> expected_requested_urls; 726 std::multiset<GURL> expected_requested_urls;
678 expected_requested_urls.insert(GURL(kGoodManifestURL)); 727 expected_requested_urls.insert(GURL(kGoodManifestURL));
679 expected_requested_urls.insert(GURL(kGoodResourceURL)); 728 expected_requested_urls.insert(GURL(kGoodResourceURL));
680 729
681 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 730 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
682 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 731 EXPECT_TRUE(precache_delegate_.was_on_done_called());
683 732
684 } 733 }
(...skipping 14 matching lines...) Expand all
699 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(), 748 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(),
700 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 749 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
701 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL), 750 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL),
702 good_manifest.SerializeAsString(), net::HTTP_OK, 751 good_manifest.SerializeAsString(), net::HTTP_OK,
703 net::URLRequestStatus::SUCCESS); 752 net::URLRequestStatus::SUCCESS);
704 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 753 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
705 net::URLRequestStatus::SUCCESS); 754 net::URLRequestStatus::SUCCESS);
706 755
707 PrecacheFetcher precache_fetcher( 756 PrecacheFetcher precache_fetcher(
708 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix, 757 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix,
709 std::move(unfinished_work), kExperimentID, &precache_delegate_); 758 std::move(unfinished_work), kExperimentID,
759 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
710 precache_fetcher.Start(); 760 precache_fetcher.Start();
711 761
712 loop_.RunUntilIdle(); 762 base::RunLoop().RunUntilIdle();
713 763
714 std::multiset<GURL> expected_requested_urls; 764 std::multiset<GURL> expected_requested_urls;
715 expected_requested_urls.insert(GURL(kCustomConfigURL)); 765 expected_requested_urls.insert(GURL(kCustomConfigURL));
716 expected_requested_urls.insert(GURL(kCustomGoodManifestURL)); 766 expected_requested_urls.insert(GURL(kCustomGoodManifestURL));
717 expected_requested_urls.insert(GURL(kGoodResourceURL)); 767 expected_requested_urls.insert(GURL(kGoodResourceURL));
718 768
719 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 769 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
720 770
721 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 771 EXPECT_TRUE(precache_delegate_.was_on_done_called());
722 } 772 }
723 773
724 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { 774 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) {
725 SetDefaultFlags(); 775 SetDefaultFlags();
726 776
727 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 777 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
728 new PrecacheUnfinishedWork()); 778 new PrecacheUnfinishedWork());
729 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 779 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
730 780
731 factory_.SetFakeResponse(GURL(kConfigURL), "", 781 factory_.SetFakeResponse(GURL(kConfigURL), "",
732 net::HTTP_INTERNAL_SERVER_ERROR, 782 net::HTTP_INTERNAL_SERVER_ERROR,
733 net::URLRequestStatus::FAILED); 783 net::URLRequestStatus::FAILED);
734 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 784 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
735 net::URLRequestStatus::SUCCESS); 785 net::URLRequestStatus::SUCCESS);
736 786
737 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 787 PrecacheFetcher precache_fetcher(
738 std::string(), std::move(unfinished_work), 788 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
739 kExperimentID, &precache_delegate_); 789 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
790 &precache_delegate_);
740 precache_fetcher.Start(); 791 precache_fetcher.Start();
741 792
742 loop_.RunUntilIdle(); 793 base::RunLoop().RunUntilIdle();
743 794
744 std::multiset<GURL> expected_requested_urls; 795 std::multiset<GURL> expected_requested_urls;
745 expected_requested_urls.insert(GURL(kConfigURL)); 796 expected_requested_urls.insert(GURL(kConfigURL));
746 expected_requested_urls.insert(GURL(kGoodManifestURL)); 797 expected_requested_urls.insert(GURL(kGoodManifestURL));
747 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 798 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
748 799
749 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 800 EXPECT_TRUE(precache_delegate_.was_on_done_called());
750 } 801 }
751 802
752 TEST_F(PrecacheFetcherTest, BadConfig) { 803 TEST_F(PrecacheFetcherTest, BadConfig) {
753 SetDefaultFlags(); 804 SetDefaultFlags();
754 805
755 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 806 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
756 new PrecacheUnfinishedWork()); 807 new PrecacheUnfinishedWork());
757 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 808 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
758 809
759 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK, 810 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK,
760 net::URLRequestStatus::SUCCESS); 811 net::URLRequestStatus::SUCCESS);
761 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 812 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
762 net::URLRequestStatus::SUCCESS); 813 net::URLRequestStatus::SUCCESS);
763 814
764 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 815 PrecacheFetcher precache_fetcher(
765 std::string(), std::move(unfinished_work), 816 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
766 kExperimentID, &precache_delegate_); 817 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
818 &precache_delegate_);
767 precache_fetcher.Start(); 819 precache_fetcher.Start();
768 820
769 loop_.RunUntilIdle(); 821 base::RunLoop().RunUntilIdle();
770 822
771 std::multiset<GURL> expected_requested_urls; 823 std::multiset<GURL> expected_requested_urls;
772 expected_requested_urls.insert(GURL(kConfigURL)); 824 expected_requested_urls.insert(GURL(kConfigURL));
773 expected_requested_urls.insert(GURL(kGoodManifestURL)); 825 expected_requested_urls.insert(GURL(kGoodManifestURL));
774 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 826 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
775 827
776 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 828 EXPECT_TRUE(precache_delegate_.was_on_done_called());
777 } 829 }
778 830
779 TEST_F(PrecacheFetcherTest, Cancel) { 831 TEST_F(PrecacheFetcherTest, Cancel) {
780 SetDefaultFlags(); 832 SetDefaultFlags();
781 833
782 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 834 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
783 new PrecacheUnfinishedWork()); 835 new PrecacheUnfinishedWork());
784 unfinished_work->add_top_host()->set_hostname("starting-url.com"); 836 unfinished_work->add_top_host()->set_hostname("starting-url.com");
785 837
786 PrecacheConfigurationSettings config; 838 PrecacheConfigurationSettings config;
787 config.set_top_sites_count(1); 839 config.set_top_sites_count(1);
788 840
789 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 841 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
790 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 842 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
791 843
792 base::HistogramTester histogram; 844 base::HistogramTester histogram;
793 845
794 { 846 {
795 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 847 PrecacheFetcher precache_fetcher(
796 std::string(), std::move(unfinished_work), 848 request_context_.get(), GURL(), std::string(),
797 kExperimentID, &precache_delegate_); 849 std::move(unfinished_work), kExperimentID,
850 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
798 precache_fetcher.Start(); 851 precache_fetcher.Start();
799 852
800 // Destroy the PrecacheFetcher, to cancel precaching. No metrics 853 // Destroy the PrecacheFetcher, to cancel precaching. No metrics
801 // should be recorded because this should not cause OnDone to be 854 // should be recorded because this should not cause OnDone to be
802 // called on the precache delegate. 855 // called on the precache delegate.
803 } 856 }
804 857
805 loop_.RunUntilIdle(); 858 base::RunLoop().RunUntilIdle();
806 859
807 std::multiset<GURL> expected_requested_urls; 860 std::multiset<GURL> expected_requested_urls;
808 expected_requested_urls.insert(GURL(kConfigURL)); 861 expected_requested_urls.insert(GURL(kConfigURL));
809 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 862 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
810 863
811 EXPECT_FALSE(precache_delegate_.was_on_done_called()); 864 EXPECT_FALSE(precache_delegate_.was_on_done_called());
812 865
813 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0); 866 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0);
814 } 867 }
815 868
816 #if defined(PRECACHE_CONFIG_SETTINGS_URL) 869 #if defined(PRECACHE_CONFIG_SETTINGS_URL)
817 870
818 // If the default precache configuration settings URL is defined, then test that 871 // If the default precache configuration settings URL is defined, then test that
819 // it works with the PrecacheFetcher. 872 // it works with the PrecacheFetcher.
820 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { 873 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) {
821 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 874 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
822 new PrecacheUnfinishedWork()); 875 new PrecacheUnfinishedWork());
823 unfinished_work->add_top_host()->set_hostname("starting-url.com"); 876 unfinished_work->add_top_host()->set_hostname("starting-url.com");
824 877
825 PrecacheConfigurationSettings config; 878 PrecacheConfigurationSettings config;
826 config.set_top_sites_count(0); 879 config.set_top_sites_count(0);
827 880
828 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), 881 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL),
829 config.SerializeAsString(), net::HTTP_OK, 882 config.SerializeAsString(), net::HTTP_OK,
830 net::URLRequestStatus::SUCCESS); 883 net::URLRequestStatus::SUCCESS);
831 884
832 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 885 PrecacheFetcher precache_fetcher(
833 std::string(), std::move(unfinished_work), 886 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
834 kExperimentID, &precache_delegate_); 887 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
888 &precache_delegate_);
835 precache_fetcher.Start(); 889 precache_fetcher.Start();
836 890
837 loop_.RunUntilIdle(); 891 base::RunLoop().RunUntilIdle();
838 892
839 std::multiset<GURL> expected_requested_urls; 893 std::multiset<GURL> expected_requested_urls;
840 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); 894 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL));
841 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 895 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
842 896
843 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 897 EXPECT_TRUE(precache_delegate_.was_on_done_called());
844 } 898 }
845 899
846 #endif // PRECACHE_CONFIG_SETTINGS_URL 900 #endif // PRECACHE_CONFIG_SETTINGS_URL
847 901
(...skipping 12 matching lines...) Expand all
860 PrecacheConfigurationSettings config; 914 PrecacheConfigurationSettings config;
861 config.set_top_sites_count(1); 915 config.set_top_sites_count(1);
862 916
863 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); 917 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com");
864 918
865 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 919 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
866 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 920 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
867 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), 921 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(),
868 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 922 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
869 923
870 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 924 PrecacheFetcher precache_fetcher(
871 std::string(), std::move(unfinished_work), 925 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
872 kExperimentID, &precache_delegate_); 926 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
927 &precache_delegate_);
873 precache_fetcher.Start(); 928 precache_fetcher.Start();
874 929
875 loop_.RunUntilIdle(); 930 base::RunLoop().RunUntilIdle();
876 931
877 std::multiset<GURL> expected_requested_urls; 932 std::multiset<GURL> expected_requested_urls;
878 expected_requested_urls.insert(GURL(kConfigURL)); 933 expected_requested_urls.insert(GURL(kConfigURL));
879 expected_requested_urls.insert(manifest_url); 934 expected_requested_urls.insert(manifest_url);
880 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 935 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
881 936
882 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 937 EXPECT_TRUE(precache_delegate_.was_on_done_called());
883 } 938 }
884 939
885 #endif // PRECACHE_MANIFEST_URL_PREFIX 940 #endif // PRECACHE_MANIFEST_URL_PREFIX
(...skipping 20 matching lines...) Expand all
906 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 961 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
907 factory_.SetFakeResponse(GURL(kGoodManifestURL), 962 factory_.SetFakeResponse(GURL(kGoodManifestURL),
908 good_manifest.SerializeAsString(), net::HTTP_OK, 963 good_manifest.SerializeAsString(), net::HTTP_OK,
909 net::URLRequestStatus::SUCCESS); 964 net::URLRequestStatus::SUCCESS);
910 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", 965 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good",
911 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 966 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
912 967
913 base::HistogramTester histogram; 968 base::HistogramTester histogram;
914 969
915 { 970 {
916 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 971 PrecacheFetcher precache_fetcher(
917 std::string(), std::move(unfinished_work), 972 request_context_.get(), GURL(), std::string(),
918 kExperimentID, &precache_delegate_); 973 std::move(unfinished_work), kExperimentID,
974 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
919 precache_fetcher.Start(); 975 precache_fetcher.Start();
920 976
921 loop_.RunUntilIdle(); 977 base::RunLoop().RunUntilIdle();
922 978
923 // Destroy the PrecacheFetcher after it has finished, to record metrics. 979 // Destroy the PrecacheFetcher after it has finished, to record metrics.
924 } 980 }
925 981
926 std::multiset<GURL> expected_requested_urls; 982 std::multiset<GURL> expected_requested_urls;
927 expected_requested_urls.insert(GURL(kConfigURL)); 983 expected_requested_urls.insert(GURL(kConfigURL));
928 expected_requested_urls.insert(GURL(kGoodManifestURL)); 984 expected_requested_urls.insert(GURL(kGoodManifestURL));
929 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 985 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
930 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 986 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
931 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 987 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1039 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
984 } 1040 }
985 1041
986 factory_.SetFakeResponse(GURL(kGoodManifestURL), 1042 factory_.SetFakeResponse(GURL(kGoodManifestURL),
987 good_manifest.SerializeAsString(), net::HTTP_OK, 1043 good_manifest.SerializeAsString(), net::HTTP_OK,
988 net::URLRequestStatus::SUCCESS); 1044 net::URLRequestStatus::SUCCESS);
989 1045
990 base::HistogramTester histogram; 1046 base::HistogramTester histogram;
991 1047
992 { 1048 {
993 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1049 PrecacheFetcher precache_fetcher(
994 std::string(), std::move(unfinished_work), 1050 request_context_.get(), GURL(), std::string(),
995 kExperimentID, &precache_delegate_); 1051 std::move(unfinished_work), kExperimentID,
1052 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
996 precache_fetcher.Start(); 1053 precache_fetcher.Start();
997 1054
998 loop_.RunUntilIdle(); 1055 base::RunLoop().RunUntilIdle();
999 } 1056 }
1000 1057
1001 // We don't know which will make it and which won't due to the parallelism in 1058 // We don't know which will make it and which won't due to the parallelism in
1002 // the pool of Fetchers. 1059 // the pool of Fetchers.
1003 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); 1060 EXPECT_GT(kNumResources, url_callback_.requested_urls().size());
1004 1061
1005 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1062 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1006 1063
1007 // good-manifest.com will not have been completed. 1064 // good-manifest.com will not have been completed.
1008 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1065 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 } 1102 }
1046 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), 1103 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url),
1047 top_host_manifest[i].SerializeAsString(), 1104 top_host_manifest[i].SerializeAsString(),
1048 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1105 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1049 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url)); 1106 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url));
1050 } 1107 }
1051 1108
1052 base::HistogramTester histogram; 1109 base::HistogramTester histogram;
1053 1110
1054 { 1111 {
1055 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1112 PrecacheFetcher precache_fetcher(
1056 std::string(), std::move(unfinished_work), 1113 request_context_.get(), GURL(), std::string(),
1057 kExperimentID, &precache_delegate_); 1114 std::move(unfinished_work), kExperimentID,
1115 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1058 precache_fetcher.Start(); 1116 precache_fetcher.Start();
1059 1117
1060 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size()); 1118 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size());
1061 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher); 1119 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher);
1062 1120
1063 loop_.RunUntilIdle(); 1121 base::RunLoop().RunUntilIdle();
1064 1122
1065 // Destroy the PrecacheFetcher after it has finished, to record metrics. 1123 // Destroy the PrecacheFetcher after it has finished, to record metrics.
1066 } 1124 }
1067 1125
1068 EXPECT_TRUE(parallel_fetches_beyond_capacity_); 1126 EXPECT_TRUE(parallel_fetches_beyond_capacity_);
1069 1127
1070 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 1128 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
1071 1129
1072 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1130 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1073 1131
(...skipping 12 matching lines...) Expand all
1086 new PrecacheUnfinishedWork()); 1144 new PrecacheUnfinishedWork());
1087 unfinished_work->add_top_host()->set_hostname("manifest.com"); 1145 unfinished_work->add_top_host()->set_hostname("manifest.com");
1088 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); 1146 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1089 1147
1090 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, 1148 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK,
1091 net::URLRequestStatus::SUCCESS); 1149 net::URLRequestStatus::SUCCESS);
1092 1150
1093 base::HistogramTester histogram; 1151 base::HistogramTester histogram;
1094 1152
1095 { 1153 {
1096 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1154 PrecacheFetcher precache_fetcher(
1097 std::string(), std::move(unfinished_work), 1155 request_context_.get(), GURL(), std::string(),
1098 kExperimentID, &precache_delegate_); 1156 std::move(unfinished_work), kExperimentID,
1157 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1099 precache_fetcher.Start(); 1158 precache_fetcher.Start();
1100 1159
1101 loop_.RunUntilIdle(); 1160 base::RunLoop().RunUntilIdle();
1102 } 1161 }
1103 1162
1104 // The config is fetched, but not the invalid manifest URL. 1163 // The config is fetched, but not the invalid manifest URL.
1105 EXPECT_EQ(1UL, url_callback_.requested_urls().size()); 1164 EXPECT_EQ(1UL, url_callback_.requested_urls().size());
1106 1165
1107 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1166 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1108 1167
1109 // manifest.com will have been failed to complete, in this case. 1168 // manifest.com will have been failed to complete, in this case.
1110 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1169 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
1111 ElementsAre(base::Bucket(0, 1))); 1170 ElementsAre(base::Bucket(0, 1)));
(...skipping 13 matching lines...) Expand all
1125 PrecacheManifest bad_manifest; 1184 PrecacheManifest bad_manifest;
1126 bad_manifest.add_resource()->set_url("http://"); 1185 bad_manifest.add_resource()->set_url("http://");
1127 1186
1128 factory_.SetFakeResponse(GURL(kBadManifestURL), 1187 factory_.SetFakeResponse(GURL(kBadManifestURL),
1129 bad_manifest.SerializeAsString(), net::HTTP_OK, 1188 bad_manifest.SerializeAsString(), net::HTTP_OK,
1130 net::URLRequestStatus::SUCCESS); 1189 net::URLRequestStatus::SUCCESS);
1131 1190
1132 base::HistogramTester histogram; 1191 base::HistogramTester histogram;
1133 1192
1134 { 1193 {
1135 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1194 PrecacheFetcher precache_fetcher(
1136 std::string(), std::move(unfinished_work), 1195 request_context_.get(), GURL(), std::string(),
1137 kExperimentID, &precache_delegate_); 1196 std::move(unfinished_work), kExperimentID,
1197 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1138 precache_fetcher.Start(); 1198 precache_fetcher.Start();
1139 1199
1140 loop_.RunUntilIdle(); 1200 base::RunLoop().RunUntilIdle();
1141 } 1201 }
1142 1202
1143 // The config and manifest are fetched, but not the invalid resource URL. 1203 // The config and manifest are fetched, but not the invalid resource URL.
1144 EXPECT_EQ(2UL, url_callback_.requested_urls().size()); 1204 EXPECT_EQ(2UL, url_callback_.requested_urls().size());
1145 1205
1146 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1206 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1147 1207
1148 // bad-manifest.com will have been completed. 1208 // bad-manifest.com will have been completed.
1149 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1209 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
1150 ElementsAre(base::Bucket(100, 1))); 1210 ElementsAre(base::Bucket(100, 1)));
1151 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 1211 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
1152 } 1212 }
1153 1213
1214 TEST_F(PrecacheFetcherTest, GetResourceURLBase64Hash) {
sclittle 2016/08/15 20:13:10 nit: this should just be a TEST, not a TEST_F if i
Raj 2016/08/16 17:54:37 Done.
1215 // Expected base64 hash for some selected URLs.
1216 EXPECT_EQ("dVSI/sC1cGk=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1217 {GURL("http://used-resource-1/a.js")}));
1218 EXPECT_EQ("B/Jc6JvusZQ=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1219 {GURL("http://used-resource-1/b.js")}));
1220 EXPECT_EQ("CmvACGJ4k08=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1221 {GURL("http://used-resource-1/c.js")}));
1222
1223 EXPECT_EQ("dVSI/sC1cGkH8lzom+6xlA==",
1224 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1225 {GURL("http://used-resource-1/a.js"),
1226 GURL("http://used-resource-1/b.js")}));
1227 }
1228
1229 TEST_F(PrecacheFetcherTest, SendUsedUnusedResourceHash) {
1230 SetDefaultFlags();
1231
1232 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
1233 new PrecacheUnfinishedWork());
1234 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1235 unfinished_work->add_top_host()->set_hostname("top-host-1.com");
1236 unfinished_work->add_top_host()->set_hostname("top-host-2.com");
1237 unfinished_work->add_top_host()->set_hostname("top-host-3.com");
1238
1239 UpdatePrecacheReferrerHost("top-host-1.com", 1);
1240 UpdatePrecacheReferrerHost("top-host-2.com", 2);
1241 UpdatePrecacheReferrerHost("top-host-3.com", 3);
1242
1243 // Mark some resources as precached.
1244 RecordURLPrefetch(GURL("http://used-resource-1/a.js"), "top-host-1.com");
1245 RecordURLPrefetch(GURL("http://used-resource-1/b.js"), "top-host-1.com");
1246 RecordURLPrefetch(GURL("http://unused-resource-1/c.js"), "top-host-1.com");
1247 RecordURLPrefetch(GURL("http://unused-resource-2/a.js"), "top-host-2.com");
1248 RecordURLPrefetch(GURL("http://unused-resource-2/b.js"), "top-host-2.com");
1249 base::RunLoop().RunUntilIdle();
1250
1251 // Mark some resources as used during user browsing.
1252 RecordURLNonPrefetch(GURL("http://used-resource-1/a.js"));
1253 RecordURLNonPrefetch(GURL("http://used-resource-1/b.js"));
1254 base::RunLoop().RunUntilIdle();
1255
1256 factory_.SetFakeResponse(GURL(kConfigURL), std::string(), net::HTTP_OK,
1257 net::URLRequestStatus::SUCCESS);
1258 factory_.SetFakeResponse(
1259 GURL(std::string(kManifestURLPrefix) +
1260 "top-host-1.com?manifest=1&used_resources=" +
1261 net::EscapeQueryParamValue(
1262 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1263 {GURL("http://used-resource-1/a.js"),
1264 GURL("http://used-resource-1/b.js")}),
1265 true) +
1266 "&unused_resources=" +
1267 net::EscapeQueryParamValue(
1268 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1269 {GURL("http://unused-resource-1/c.js")}),
1270 true)),
1271 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1272 factory_.SetFakeResponse(
1273 GURL(std::string(kManifestURLPrefix) +
1274 "top-host-2.com?manifest=2&used_resources=&unused_resources=" +
1275 net::EscapeQueryParamValue(
1276 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1277 {GURL("http://unused-resource-2/a.js"),
1278 GURL("http://unused-resource-2/b.js")}),
1279 true)),
1280 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1281 factory_.SetFakeResponse(
1282 GURL(std::string(kManifestURLPrefix) +
1283 "top-host-3.com?manifest=3&used_resources=&unused_resources="),
1284 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1285
1286 {
1287 PrecacheFetcher precache_fetcher(
1288 request_context_.get(), GURL(), std::string(),
1289 std::move(unfinished_work), kExperimentID,
1290 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1291 precache_fetcher.Start();
1292
1293 base::RunLoop().RunUntilIdle();
1294 }
1295 }
1296
1154 } // namespace precache 1297 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698