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

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

Issue 1961153003: Add pause/resume functionality to precache (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleaned up PrecacheFetcher constructor Created 4 years, 7 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/memory/ptr_util.h" 19 #include "base/memory/ptr_util.h"
20 #include "base/memory/ref_counted.h" 20 #include "base/memory/ref_counted.h"
21 #include "base/memory/weak_ptr.h" 21 #include "base/memory/weak_ptr.h"
22 #include "base/run_loop.h" 22 #include "base/run_loop.h"
23 #include "base/test/histogram_tester.h" 23 #include "base/test/histogram_tester.h"
24 #include "base/threading/thread_task_runner_handle.h" 24 #include "base/threading/thread_task_runner_handle.h"
25 #include "components/precache/core/precache_switches.h" 25 #include "components/precache/core/precache_switches.h"
26 #include "components/precache/core/proto/precache.pb.h" 26 #include "components/precache/core/proto/precache.pb.h"
27 #include "components/precache/core/proto/unfinished_work.pb.h"
27 #include "net/base/load_flags.h" 28 #include "net/base/load_flags.h"
28 #include "net/http/http_response_headers.h" 29 #include "net/http/http_response_headers.h"
29 #include "net/http/http_status_code.h" 30 #include "net/http/http_status_code.h"
30 #include "net/url_request/test_url_fetcher_factory.h" 31 #include "net/url_request/test_url_fetcher_factory.h"
31 #include "net/url_request/url_request_status.h" 32 #include "net/url_request/url_request_status.h"
32 #include "net/url_request/url_request_test_util.h" 33 #include "net/url_request/url_request_test_util.h"
33 #include "testing/gmock/include/gmock/gmock.h" 34 #include "testing/gmock/include/gmock/gmock.h"
34 #include "testing/gtest/include/gtest/gtest.h" 35 #include "testing/gtest/include/gtest/gtest.h"
35 #include "url/gurl.h" 36 #include "url/gurl.h"
36 37
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 int total_response_bytes() const { return total_response_bytes_; } 88 int total_response_bytes() const { return total_response_bytes_; }
88 89
89 private: 90 private:
90 // Multiset with one entry for each URL requested. 91 // Multiset with one entry for each URL requested.
91 std::multiset<GURL> requested_urls_; 92 std::multiset<GURL> requested_urls_;
92 int total_response_bytes_; 93 int total_response_bytes_;
93 }; 94 };
94 95
95 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate { 96 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate {
96 public: 97 public:
97 TestPrecacheDelegate() : was_on_done_called_(false) {} 98 TestPrecacheDelegate()
99 : on_done_was_called_(false) {}
98 100
99 void OnDone() override { was_on_done_called_ = true; } 101 void OnDone() override { on_done_was_called_ = true; }
100 102
101 bool was_on_done_called() const { 103 bool was_on_done_called() const {
102 return was_on_done_called_; 104 return on_done_was_called_;
103 } 105 }
104 106
105 private: 107 private:
106 bool was_on_done_called_; 108 bool on_done_was_called_;
107 }; 109 };
108 110
109 class MockURLFetcherFactory : public net::URLFetcherFactory { 111 class MockURLFetcherFactory : public net::URLFetcherFactory {
110 public: 112 public:
111 typedef net::URLFetcher* DoURLFetcher( 113 typedef net::URLFetcher* DoURLFetcher(
112 int id, 114 int id,
113 const GURL& url, 115 const GURL& url,
114 net::URLFetcher::RequestType request_type, 116 net::URLFetcher::RequestType request_type,
115 net::URLFetcherDelegate* delegate); 117 net::URLFetcherDelegate* delegate);
116 118
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 scoped_refptr<net::TestURLRequestContextGetter> request_context_; 343 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
342 TestURLFetcherCallback url_callback_; 344 TestURLFetcherCallback url_callback_;
343 net::FakeURLFetcherFactory factory_; 345 net::FakeURLFetcherFactory factory_;
344 TestPrecacheDelegate precache_delegate_; 346 TestPrecacheDelegate precache_delegate_;
345 int expected_total_response_bytes_; 347 int expected_total_response_bytes_;
346 }; 348 };
347 349
348 TEST_F(PrecacheFetcherTest, FullPrecache) { 350 TEST_F(PrecacheFetcherTest, FullPrecache) {
349 SetDefaultFlags(); 351 SetDefaultFlags();
350 352
351 std::vector<std::string> starting_hosts; 353 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
352 starting_hosts.push_back("manifest-fetch-failure.com"); 354 new PrecacheUnfinishedWork());
353 starting_hosts.push_back("bad-manifest.com"); 355 unfinished_work->add_top_host()->set_hostname("manifest-fetch-failure.com");
354 starting_hosts.push_back("good-manifest.com"); 356 unfinished_work->add_top_host()->set_hostname("bad-manifest.com");
355 starting_hosts.push_back("not-in-top-3.com"); 357 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
358 unfinished_work->add_top_host()->set_hostname("not-in-top-3.com");
356 359
357 PrecacheConfigurationSettings config; 360 PrecacheConfigurationSettings config;
358 config.set_top_sites_count(3); 361 config.set_top_sites_count(3);
359 config.add_forced_site("forced-starting-url.com"); 362 config.add_forced_site("forced-starting-url.com");
360 // Duplicate starting URL, the manifest for this should only be fetched once. 363 // Duplicate starting URL, the manifest for this should only be fetched once.
361 config.add_forced_site("good-manifest.com"); 364 config.add_forced_site("good-manifest.com");
362 365
363 PrecacheManifest good_manifest; 366 PrecacheManifest good_manifest;
364 good_manifest.add_resource()->set_url(kResourceFetchFailureURL); 367 good_manifest.add_resource()->set_url(kResourceFetchFailureURL);
365 good_manifest.add_resource(); // Resource with no URL, should not be fetched. 368 good_manifest.add_resource(); // Resource with no URL, should not be fetched.
(...skipping 14 matching lines...) Expand all
380 net::URLRequestStatus::FAILED); 383 net::URLRequestStatus::FAILED);
381 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 384 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
382 net::URLRequestStatus::SUCCESS); 385 net::URLRequestStatus::SUCCESS);
383 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), 386 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL),
384 PrecacheManifest().SerializeAsString(), net::HTTP_OK, 387 PrecacheManifest().SerializeAsString(), net::HTTP_OK,
385 net::URLRequestStatus::SUCCESS); 388 net::URLRequestStatus::SUCCESS);
386 389
387 base::HistogramTester histogram; 390 base::HistogramTester histogram;
388 391
389 { 392 {
390 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 393 PrecacheFetcher precache_fetcher(request_context_.get(),
391 GURL(), std::string(), 394 GURL(), std::string(),
395 std::move(unfinished_work),
392 &precache_delegate_); 396 &precache_delegate_);
393 precache_fetcher.Start(); 397 precache_fetcher.Start();
394 398
395 loop_.RunUntilIdle(); 399 loop_.RunUntilIdle();
396 400
397 // Destroy the PrecacheFetcher after it has finished, to record metrics. 401 // Destroy the PrecacheFetcher after it has finished, to record metrics.
398 } 402 }
399 403
400 std::multiset<GURL> expected_requested_urls; 404 std::multiset<GURL> expected_requested_urls;
401 expected_requested_urls.insert(GURL(kConfigURL)); 405 expected_requested_urls.insert(GURL(kConfigURL));
402 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); 406 expected_requested_urls.insert(GURL(kManifestFetchFailureURL));
403 expected_requested_urls.insert(GURL(kBadManifestURL)); 407 expected_requested_urls.insert(GURL(kBadManifestURL));
404 expected_requested_urls.insert(GURL(kGoodManifestURL)); 408 expected_requested_urls.insert(GURL(kGoodManifestURL));
405 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); 409 expected_requested_urls.insert(GURL(kResourceFetchFailureURL));
406 expected_requested_urls.insert(GURL(kGoodResourceURL)); 410 expected_requested_urls.insert(GURL(kGoodResourceURL));
407 expected_requested_urls.insert(GURL(kForcedStartingURLManifestURL)); 411 expected_requested_urls.insert(GURL(kForcedStartingURLManifestURL));
408 412
409 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 413 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
410 414
411 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 415 EXPECT_TRUE(precache_delegate_.was_on_done_called());
412 416
413 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); 417 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1);
414 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 418 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total",
415 url_callback_.total_response_bytes(), 1); 419 url_callback_.total_response_bytes(), 1);
416 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 420 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
417 } 421 }
418 422
423 TEST_F(PrecacheFetcherTest, PrecachePauseResume) {
424 SetDefaultFlags();
425
426 PrecacheConfigurationSettings config;
427 config.set_top_sites_count(3);
428
429 std::unique_ptr<PrecacheUnfinishedWork> empty_unfinished_work(
430 new PrecacheUnfinishedWork);
431
432 PrecacheFetcher first_fetcher(request_context_.get(),
433 GURL(), std::string(),
434 std::move(empty_unfinished_work),
435 &precache_delegate_);
436 base::Time then = base::Time::Now() - base::TimeDelta::FromHours(1);
437 std::list<GURL> manifests, resources;
438 manifests.push_back(GURL("http://manifest-url-prefix.com/manifest1.com"));
439 manifests.push_back(GURL("http://manifest-url-prefix.com/manifest2.com"));
440 resources.push_back(GURL(kGoodResourceURL));
441 first_fetcher.AssignWorkForTest(
442 manifests, resources, 271828, 314159, 5, then);
443 loop_.RunUntilIdle();
444 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work =
445 first_fetcher.CancelPrecaching();
446
447 std::multiset<GURL> expected_requested_urls;
448 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
449
450 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
451 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
452 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK,
453 net::URLRequestStatus::SUCCESS);
454 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"),
455 "bad protobuf", net::HTTP_OK,
456 net::URLRequestStatus::SUCCESS);
457 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"),
458 "bad protobuf", net::HTTP_OK,
459 net::URLRequestStatus::SUCCESS);
460 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
461 net::URLRequestStatus::SUCCESS);
462 // Starting hosts should not be fetched.
463 unfinished_work->add_top_host()->set_hostname("bad-manifest.com");
464 PrecacheFetcher second_fetcher(request_context_.get(),
465 GURL(), std::string(),
466 std::move(unfinished_work),
467 &precache_delegate_);
468 second_fetcher.Start();
469 loop_.RunUntilIdle();
470 expected_requested_urls.insert(GURL(kConfigURL));
471 expected_requested_urls.insert(
472 GURL("http://manifest-url-prefix.com/manifest1.com"));
473 expected_requested_urls.insert(
474 GURL("http://manifest-url-prefix.com/manifest2.com"));
475 expected_requested_urls.insert(GURL(kGoodResourceURL));
476 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
477 EXPECT_TRUE(precache_delegate_.was_on_done_called());
478 }
479
480 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) {
481 SetDefaultFlags();
482 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
483 new PrecacheUnfinishedWork());
484 unfinished_work->mutable_config_settings()->add_forced_site(
485 "good-manifest.com");
486 unfinished_work->set_start_time(base::Time::Now().ToInternalValue());
487 PrecacheManifest good_manifest;
488 good_manifest.add_resource()->set_url(kGoodResourceURL);
489
490 factory_.SetFakeResponse(GURL(kGoodManifestURL),
491 good_manifest.SerializeAsString(), net::HTTP_OK,
492 net::URLRequestStatus::SUCCESS);
493 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
494 net::URLRequestStatus::SUCCESS);
495 {
496 PrecacheFetcher precache_fetcher(request_context_.get(),
497 GURL(), std::string(),
498 std::move(unfinished_work),
499 &precache_delegate_);
500 precache_fetcher.Start();
501
502 loop_.RunUntilIdle();
503
504 // Destroy the PrecacheFetcher after it has finished, to record metrics.
505 }
506
507 std::multiset<GURL> expected_requested_urls;
508 expected_requested_urls.insert(GURL(kGoodManifestURL));
509 expected_requested_urls.insert(GURL(kGoodResourceURL));
510
511 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
512 EXPECT_TRUE(precache_delegate_.was_on_done_called());
513
514 }
515
516
419 TEST_F(PrecacheFetcherTest, CustomURLs) { 517 TEST_F(PrecacheFetcherTest, CustomURLs) {
420 SetDefaultFlags(); 518 SetDefaultFlags();
421 519
422 std::vector<std::string> starting_hosts; 520 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
423 starting_hosts.push_back("good-manifest.com"); 521 new PrecacheUnfinishedWork());
522 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
424 523
425 PrecacheConfigurationSettings config; 524 PrecacheConfigurationSettings config;
426 525
427 PrecacheManifest good_manifest; 526 PrecacheManifest good_manifest;
428 good_manifest.add_resource()->set_url(kGoodResourceURL); 527 good_manifest.add_resource()->set_url(kGoodResourceURL);
429 528
430 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(), 529 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(),
431 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 530 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
432 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL), 531 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL),
433 good_manifest.SerializeAsString(), net::HTTP_OK, 532 good_manifest.SerializeAsString(), net::HTTP_OK,
434 net::URLRequestStatus::SUCCESS); 533 net::URLRequestStatus::SUCCESS);
435 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 534 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
436 net::URLRequestStatus::SUCCESS); 535 net::URLRequestStatus::SUCCESS);
437 536
438 PrecacheFetcher precache_fetcher( 537 PrecacheFetcher precache_fetcher(
439 starting_hosts, request_context_.get(), GURL(kCustomConfigURL), 538 request_context_.get(), GURL(kCustomConfigURL),
440 kCustomManifestURLPrefix, &precache_delegate_); 539 kCustomManifestURLPrefix, std::move(unfinished_work),
540 &precache_delegate_);
441 precache_fetcher.Start(); 541 precache_fetcher.Start();
442 542
443 loop_.RunUntilIdle(); 543 loop_.RunUntilIdle();
444 544
445 std::multiset<GURL> expected_requested_urls; 545 std::multiset<GURL> expected_requested_urls;
446 expected_requested_urls.insert(GURL(kCustomConfigURL)); 546 expected_requested_urls.insert(GURL(kCustomConfigURL));
447 expected_requested_urls.insert(GURL(kCustomGoodManifestURL)); 547 expected_requested_urls.insert(GURL(kCustomGoodManifestURL));
448 expected_requested_urls.insert(GURL(kGoodResourceURL)); 548 expected_requested_urls.insert(GURL(kGoodResourceURL));
449 549
450 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 550 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
451 551
452 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 552 EXPECT_TRUE(precache_delegate_.was_on_done_called());
453 } 553 }
454 554
455 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { 555 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) {
456 SetDefaultFlags(); 556 SetDefaultFlags();
457 557
458 std::vector<std::string> starting_hosts(1, "good-manifest.com"); 558 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
559 new PrecacheUnfinishedWork());
560 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
459 561
460 factory_.SetFakeResponse(GURL(kConfigURL), "", 562 factory_.SetFakeResponse(GURL(kConfigURL), "",
461 net::HTTP_INTERNAL_SERVER_ERROR, 563 net::HTTP_INTERNAL_SERVER_ERROR,
462 net::URLRequestStatus::FAILED); 564 net::URLRequestStatus::FAILED);
463 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 565 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
464 net::URLRequestStatus::SUCCESS); 566 net::URLRequestStatus::SUCCESS);
465 567
466 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 568 PrecacheFetcher precache_fetcher(request_context_.get(),
467 GURL(), std::string(), &precache_delegate_); 569 GURL(), std::string(),
570 std::move(unfinished_work),
571 &precache_delegate_);
468 precache_fetcher.Start(); 572 precache_fetcher.Start();
469 573
470 loop_.RunUntilIdle(); 574 loop_.RunUntilIdle();
471 575
472 std::multiset<GURL> expected_requested_urls; 576 std::multiset<GURL> expected_requested_urls;
473 expected_requested_urls.insert(GURL(kConfigURL)); 577 expected_requested_urls.insert(GURL(kConfigURL));
474 expected_requested_urls.insert(GURL(kGoodManifestURL)); 578 expected_requested_urls.insert(GURL(kGoodManifestURL));
475 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 579 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
476 580
477 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 581 EXPECT_TRUE(precache_delegate_.was_on_done_called());
478 } 582 }
479 583
480 TEST_F(PrecacheFetcherTest, BadConfig) { 584 TEST_F(PrecacheFetcherTest, BadConfig) {
481 SetDefaultFlags(); 585 SetDefaultFlags();
482 586
483 std::vector<std::string> starting_hosts(1, "good-manifest.com"); 587 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
588 new PrecacheUnfinishedWork());
589 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
484 590
485 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK, 591 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK,
486 net::URLRequestStatus::SUCCESS); 592 net::URLRequestStatus::SUCCESS);
487 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 593 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
488 net::URLRequestStatus::SUCCESS); 594 net::URLRequestStatus::SUCCESS);
489 595
490 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 596 PrecacheFetcher precache_fetcher(request_context_.get(),
491 GURL(), std::string(), &precache_delegate_); 597 GURL(), std::string(),
598 std::move(unfinished_work),
599 &precache_delegate_);
492 precache_fetcher.Start(); 600 precache_fetcher.Start();
493 601
494 loop_.RunUntilIdle(); 602 loop_.RunUntilIdle();
495 603
496 std::multiset<GURL> expected_requested_urls; 604 std::multiset<GURL> expected_requested_urls;
497 expected_requested_urls.insert(GURL(kConfigURL)); 605 expected_requested_urls.insert(GURL(kConfigURL));
498 expected_requested_urls.insert(GURL(kGoodManifestURL)); 606 expected_requested_urls.insert(GURL(kGoodManifestURL));
499 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 607 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
500 608
501 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 609 EXPECT_TRUE(precache_delegate_.was_on_done_called());
502 } 610 }
503 611
504 TEST_F(PrecacheFetcherTest, Cancel) { 612 TEST_F(PrecacheFetcherTest, Cancel) {
505 SetDefaultFlags(); 613 SetDefaultFlags();
506 614
507 std::vector<std::string> starting_hosts(1, "starting-url.com"); 615 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
616 new PrecacheUnfinishedWork());
617 unfinished_work->add_top_host()->set_hostname("starting-url.com");
508 618
509 PrecacheConfigurationSettings config; 619 PrecacheConfigurationSettings config;
510 config.set_top_sites_count(1); 620 config.set_top_sites_count(1);
511 621
512 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 622 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
513 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 623 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
514 624
515 base::HistogramTester histogram; 625 base::HistogramTester histogram;
516 626
517 { 627 {
518 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 628 PrecacheFetcher precache_fetcher(request_context_.get(),
519 GURL(), std::string(), 629 GURL(), std::string(),
630 std::move(unfinished_work),
520 &precache_delegate_); 631 &precache_delegate_);
521 precache_fetcher.Start(); 632 precache_fetcher.Start();
522 633
523 // Destroy the PrecacheFetcher, to cancel precaching and record metrics. 634 // Destroy the PrecacheFetcher, to cancel precaching and record metrics.
524 // This should not cause OnDone to be called on the precache delegate. 635 // This should not cause OnDone to be called on the precache delegate.
525 } 636 }
526 637
527 loop_.RunUntilIdle(); 638 loop_.RunUntilIdle();
528 639
529 std::multiset<GURL> expected_requested_urls; 640 std::multiset<GURL> expected_requested_urls;
530 expected_requested_urls.insert(GURL(kConfigURL)); 641 expected_requested_urls.insert(GURL(kConfigURL));
531 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 642 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
532 643
533 EXPECT_FALSE(precache_delegate_.was_on_done_called()); 644 EXPECT_FALSE(precache_delegate_.was_on_done_called());
534 645
535 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 0, 1); 646 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 0, 1);
536 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 0, 1); 647 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 0, 1);
537 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 648 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
538 } 649 }
539 650
540 #if defined(PRECACHE_CONFIG_SETTINGS_URL) 651 #if defined(PRECACHE_CONFIG_SETTINGS_URL)
541 652
542 // If the default precache configuration settings URL is defined, then test that 653 // If the default precache configuration settings URL is defined, then test that
543 // it works with the PrecacheFetcher. 654 // it works with the PrecacheFetcher.
544 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { 655 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) {
545 std::vector<std::string> starting_hosts(1, "starting-url.com"); 656 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
657 new PrecacheUnfinishedWork());
658 unfinished_work->add_top_host()->set_hostname("starting-url.com");
546 659
547 PrecacheConfigurationSettings config; 660 PrecacheConfigurationSettings config;
548 config.set_top_sites_count(0); 661 config.set_top_sites_count(0);
549 662
550 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), 663 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL),
551 config.SerializeAsString(), net::HTTP_OK, 664 config.SerializeAsString(), net::HTTP_OK,
552 net::URLRequestStatus::SUCCESS); 665 net::URLRequestStatus::SUCCESS);
553 666
554 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 667 PrecacheFetcher precache_fetcher(request_context_.get(),
555 GURL(), std::string(), &precache_delegate_); 668 GURL(), std::string(),
669 std::move(unfinished_work),
670 &precache_delegate_);
556 precache_fetcher.Start(); 671 precache_fetcher.Start();
557 672
558 loop_.RunUntilIdle(); 673 loop_.RunUntilIdle();
559 674
560 std::multiset<GURL> expected_requested_urls; 675 std::multiset<GURL> expected_requested_urls;
561 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); 676 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL));
562 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 677 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
563 678
564 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 679 EXPECT_TRUE(precache_delegate_.was_on_done_called());
565 } 680 }
566 681
567 #endif // PRECACHE_CONFIG_SETTINGS_URL 682 #endif // PRECACHE_CONFIG_SETTINGS_URL
568 683
569 #if defined(PRECACHE_MANIFEST_URL_PREFIX) 684 #if defined(PRECACHE_MANIFEST_URL_PREFIX)
570 685
571 // If the default precache manifest URL prefix is defined, then test that it 686 // If the default precache manifest URL prefix is defined, then test that it
572 // works with the PrecacheFetcher. 687 // works with the PrecacheFetcher.
573 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultManifestURLPrefix) { 688 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultManifestURLPrefix) {
574 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 689 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
575 switches::kPrecacheConfigSettingsURL, kConfigURL); 690 switches::kPrecacheConfigSettingsURL, kConfigURL);
576 691
577 std::vector<std::string> starting_hosts(1, "starting-url.com"); 692 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
693 new PrecacheUnfinishedWork());
694 unfinished_work->add_top_host()->set_hostname("starting-url.com");
578 695
579 PrecacheConfigurationSettings config; 696 PrecacheConfigurationSettings config;
580 config.set_top_sites_count(1); 697 config.set_top_sites_count(1);
581 698
582 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); 699 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com");
583 700
584 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 701 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
585 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 702 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
586 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), 703 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(),
587 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 704 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
588 705
589 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 706 PrecacheFetcher precache_fetcher(request_context_.get(),
590 GURL(), std::string(), &precache_delegate_); 707 GURL(), std::string(),
708 std::move(unfinished_work),
709 &precache_delegate_);
591 precache_fetcher.Start(); 710 precache_fetcher.Start();
592 711
593 loop_.RunUntilIdle(); 712 loop_.RunUntilIdle();
594 713
595 std::multiset<GURL> expected_requested_urls; 714 std::multiset<GURL> expected_requested_urls;
596 expected_requested_urls.insert(GURL(kConfigURL)); 715 expected_requested_urls.insert(GURL(kConfigURL));
597 expected_requested_urls.insert(manifest_url); 716 expected_requested_urls.insert(manifest_url);
598 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 717 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
599 718
600 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 719 EXPECT_TRUE(precache_delegate_.was_on_done_called());
601 } 720 }
602 721
603 #endif // PRECACHE_MANIFEST_URL_PREFIX 722 #endif // PRECACHE_MANIFEST_URL_PREFIX
604 723
605 TEST_F(PrecacheFetcherTest, TopResourcesCount) { 724 TEST_F(PrecacheFetcherTest, TopResourcesCount) {
606 SetDefaultFlags(); 725 SetDefaultFlags();
607 726
608 std::vector<std::string> starting_hosts; 727 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
609 starting_hosts.push_back("good-manifest.com"); 728 new PrecacheUnfinishedWork());
729 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
610 730
611 PrecacheConfigurationSettings config; 731 PrecacheConfigurationSettings config;
612 config.set_top_resources_count(3); 732 config.set_top_resources_count(3);
613 733
614 PrecacheManifest good_manifest; 734 PrecacheManifest good_manifest;
615 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved"); 735 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved");
616 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved"); 736 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved");
617 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved"); 737 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved");
618 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped"); 738 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped");
619 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped"); 739 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped");
620 740
621 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 741 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
622 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 742 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
623 factory_.SetFakeResponse(GURL(kGoodManifestURL), 743 factory_.SetFakeResponse(GURL(kGoodManifestURL),
624 good_manifest.SerializeAsString(), net::HTTP_OK, 744 good_manifest.SerializeAsString(), net::HTTP_OK,
625 net::URLRequestStatus::SUCCESS); 745 net::URLRequestStatus::SUCCESS);
626 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", 746 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good",
627 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 747 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
628 748
629 base::HistogramTester histogram; 749 base::HistogramTester histogram;
630 750
631 { 751 {
632 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 752 PrecacheFetcher precache_fetcher(request_context_.get(),
633 GURL(), std::string(), 753 GURL(), std::string(),
754 std::move(unfinished_work),
634 &precache_delegate_); 755 &precache_delegate_);
635 precache_fetcher.Start(); 756 precache_fetcher.Start();
636 757
637 loop_.RunUntilIdle(); 758 loop_.RunUntilIdle();
638 759
639 // Destroy the PrecacheFetcher after it has finished, to record metrics. 760 // Destroy the PrecacheFetcher after it has finished, to record metrics.
640 } 761 }
641 762
642 std::multiset<GURL> expected_requested_urls; 763 std::multiset<GURL> expected_requested_urls;
643 expected_requested_urls.insert(GURL(kConfigURL)); 764 expected_requested_urls.insert(GURL(kConfigURL));
(...skipping 24 matching lines...) Expand all
668 // PrecacheFetcherFetcherTest.ResourceTooBig tests the bulk of the code. We'll 789 // PrecacheFetcherFetcherTest.ResourceTooBig tests the bulk of the code. We'll
669 // assume that PrecacheFetcher passes the right max_bytes to the 790 // assume that PrecacheFetcher passes the right max_bytes to the
670 // PrecacheFetcher::Fetcher constructor. 791 // PrecacheFetcher::Fetcher constructor.
671 // 792 //
672 // TODO(twifkak): Port these tests from FakeURLFetcherFactory to 793 // TODO(twifkak): Port these tests from FakeURLFetcherFactory to
673 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are 794 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are
674 // cancelled midstream. 795 // cancelled midstream.
675 796
676 TEST_F(PrecacheFetcherTest, MaxBytesTotal) { 797 TEST_F(PrecacheFetcherTest, MaxBytesTotal) {
677 SetDefaultFlags(); 798 SetDefaultFlags();
799 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
800 new PrecacheUnfinishedWork());
801 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
802
678 const size_t kNumResources = 15; // > kMaxParallelFetches. 803 const size_t kNumResources = 15; // > kMaxParallelFetches.
679 const size_t kMaxBytesTotal = 1000; 804 const size_t kMaxBytesTotal = 1000;
680 const size_t kBytesPerResource = kMaxBytesTotal / 3; 805 const size_t kBytesPerResource = kMaxBytesTotal / 3;
681 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal. 806 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal.
682 807
683 PrecacheConfigurationSettings config; 808 PrecacheConfigurationSettings config;
684 config.set_max_bytes_total(kMaxBytesTotal); 809 config.set_max_bytes_total(kMaxBytesTotal);
685 810
686 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 811 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
687 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 812 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
688 813
689 PrecacheManifest good_manifest; 814 PrecacheManifest good_manifest;
690 for (size_t i = 0; i < kNumResources; ++i) { 815 for (size_t i = 0; i < kNumResources; ++i) {
691 const std::string url = "http://good-manifest.com/" + std::to_string(i); 816 const std::string url = "http://good-manifest.com/" + std::to_string(i);
692 good_manifest.add_resource()->set_url(url); 817 good_manifest.add_resource()->set_url(url);
693 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'), 818 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'),
694 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 819 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
695 } 820 }
696 821
697 factory_.SetFakeResponse(GURL(kGoodManifestURL), 822 factory_.SetFakeResponse(GURL(kGoodManifestURL),
698 good_manifest.SerializeAsString(), net::HTTP_OK, 823 good_manifest.SerializeAsString(), net::HTTP_OK,
699 net::URLRequestStatus::SUCCESS); 824 net::URLRequestStatus::SUCCESS);
700 825
701 base::HistogramTester histogram; 826 base::HistogramTester histogram;
702 827
703 { 828 {
704 PrecacheFetcher precache_fetcher({"good-manifest.com"}, 829 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(),
705 request_context_.get(), GURL(), 830 std::string(),
706 std::string(), &precache_delegate_); 831 std::move(unfinished_work),
832 &precache_delegate_);
707 precache_fetcher.Start(); 833 precache_fetcher.Start();
708 834
709 loop_.RunUntilIdle(); 835 loop_.RunUntilIdle();
710 836
711 // Destroy the PrecacheFetcher after it has finished, to record metrics. 837 // Destroy the PrecacheFetcher after it has finished, to record metrics.
712 } 838 }
713 839
714 // We don't know which will make it and which won't due to the parallelism in 840 // We don't know which will make it and which won't due to the parallelism in
715 // the pool of Fetchers. 841 // the pool of Fetchers.
716 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); 842 EXPECT_GT(kNumResources, url_callback_.requested_urls().size());
717 843
718 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 844 EXPECT_TRUE(precache_delegate_.was_on_done_called());
719 845
720 // good-manifest.com will not have been completed. 846 // good-manifest.com will not have been completed.
721 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 847 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
722 ElementsAre(base::Bucket(0, 1))); 848 ElementsAre(base::Bucket(0, 1)));
723 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 849 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
724 } 850 }
725 851
726 } // namespace 852 } // namespace
727 853
728 } // namespace precache 854 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698