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

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: Addressed comments 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->set_start_time(base::Time::UnixEpoch().ToInternalValue());
354 starting_hosts.push_back("good-manifest.com"); 356 unfinished_work->add_top_host()->set_hostname("manifest-fetch-failure.com");
355 starting_hosts.push_back("not-in-top-3.com"); 357 unfinished_work->add_top_host()->set_hostname("bad-manifest.com");
358 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
359 unfinished_work->add_top_host()->set_hostname("not-in-top-3.com");
356 360
357 PrecacheConfigurationSettings config; 361 PrecacheConfigurationSettings config;
358 config.set_top_sites_count(3); 362 config.set_top_sites_count(3);
359 config.add_forced_site("forced-starting-url.com"); 363 config.add_forced_site("forced-starting-url.com");
360 // Duplicate starting URL, the manifest for this should only be fetched once. 364 // Duplicate starting URL, the manifest for this should only be fetched once.
361 config.add_forced_site("good-manifest.com"); 365 config.add_forced_site("good-manifest.com");
362 366
363 PrecacheManifest good_manifest; 367 PrecacheManifest good_manifest;
364 good_manifest.add_resource()->set_url(kResourceFetchFailureURL); 368 good_manifest.add_resource()->set_url(kResourceFetchFailureURL);
365 good_manifest.add_resource(); // Resource with no URL, should not be fetched. 369 good_manifest.add_resource(); // Resource with no URL, should not be fetched.
(...skipping 14 matching lines...) Expand all
380 net::URLRequestStatus::FAILED); 384 net::URLRequestStatus::FAILED);
381 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 385 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
382 net::URLRequestStatus::SUCCESS); 386 net::URLRequestStatus::SUCCESS);
383 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), 387 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL),
384 PrecacheManifest().SerializeAsString(), net::HTTP_OK, 388 PrecacheManifest().SerializeAsString(), net::HTTP_OK,
385 net::URLRequestStatus::SUCCESS); 389 net::URLRequestStatus::SUCCESS);
386 390
387 base::HistogramTester histogram; 391 base::HistogramTester histogram;
388 392
389 { 393 {
390 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 394 PrecacheFetcher precache_fetcher(request_context_.get(),
391 GURL(), std::string(), 395 GURL(), std::string(),
396 std::move(unfinished_work),
392 &precache_delegate_); 397 &precache_delegate_);
393 precache_fetcher.Start(); 398 precache_fetcher.Start();
394 399
395 loop_.RunUntilIdle(); 400 loop_.RunUntilIdle();
396 401
397 // Destroy the PrecacheFetcher after it has finished, to record metrics. 402 // Destroy the PrecacheFetcher after it has finished, to record metrics.
398 } 403 }
399 404
400 std::multiset<GURL> expected_requested_urls; 405 std::multiset<GURL> expected_requested_urls;
401 expected_requested_urls.insert(GURL(kConfigURL)); 406 expected_requested_urls.insert(GURL(kConfigURL));
402 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); 407 expected_requested_urls.insert(GURL(kManifestFetchFailureURL));
403 expected_requested_urls.insert(GURL(kBadManifestURL)); 408 expected_requested_urls.insert(GURL(kBadManifestURL));
404 expected_requested_urls.insert(GURL(kGoodManifestURL)); 409 expected_requested_urls.insert(GURL(kGoodManifestURL));
405 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); 410 expected_requested_urls.insert(GURL(kResourceFetchFailureURL));
406 expected_requested_urls.insert(GURL(kGoodResourceURL)); 411 expected_requested_urls.insert(GURL(kGoodResourceURL));
407 expected_requested_urls.insert(GURL(kForcedStartingURLManifestURL)); 412 expected_requested_urls.insert(GURL(kForcedStartingURLManifestURL));
408 413
409 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 414 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
410 415
411 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 416 EXPECT_TRUE(precache_delegate_.was_on_done_called());
412 417
413 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); 418 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1);
414 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 419 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total",
415 url_callback_.total_response_bytes(), 1); 420 url_callback_.total_response_bytes(), 1);
416 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 421 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
417 } 422 }
418 423
424 TEST_F(PrecacheFetcherTest, PrecachePauseResume) {
425 SetDefaultFlags();
426
427 PrecacheConfigurationSettings config;
428 config.set_top_sites_count(3);
429
430 std::unique_ptr<PrecacheUnfinishedWork> initial_work(
431 new PrecacheUnfinishedWork());
432 initial_work->add_manifest()->set_url(
433 "http://manifest-url-prefix.com/manifest1.com");
434 initial_work->add_manifest()->set_url(
435 "http://manifest-url-prefix.com/manifest2.com");
436 initial_work->add_resource()->set_url(kGoodResourceURL);
437 initial_work->set_start_time(
438 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue());
439
440 PrecacheFetcher first_fetcher(request_context_.get(),
441 GURL(), std::string(),
442 std::move(initial_work),
443 &precache_delegate_);
444
445 loop_.RunUntilIdle();
446 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work =
447 first_fetcher.CancelPrecaching();
448
449 std::multiset<GURL> expected_requested_urls;
450 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
451
452 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
453 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
454 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK,
455 net::URLRequestStatus::SUCCESS);
456 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"),
457 "bad protobuf", net::HTTP_OK,
458 net::URLRequestStatus::SUCCESS);
459 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"),
460 "bad protobuf", net::HTTP_OK,
461 net::URLRequestStatus::SUCCESS);
462 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
463 net::URLRequestStatus::SUCCESS);
464 // Starting hosts should not be fetched.
465 unfinished_work->add_top_host()->set_hostname("bad-manifest.com");
466 PrecacheFetcher second_fetcher(request_context_.get(),
467 GURL(), std::string(),
468 std::move(unfinished_work),
469 &precache_delegate_);
470 second_fetcher.Start();
471 loop_.RunUntilIdle();
472 expected_requested_urls.insert(GURL(kConfigURL));
473 expected_requested_urls.insert(
474 GURL("http://manifest-url-prefix.com/manifest1.com"));
475 expected_requested_urls.insert(
476 GURL("http://manifest-url-prefix.com/manifest2.com"));
477 expected_requested_urls.insert(GURL(kGoodResourceURL));
478 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
479 EXPECT_TRUE(precache_delegate_.was_on_done_called());
480 }
481
482 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) {
483 SetDefaultFlags();
484 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
485 new PrecacheUnfinishedWork());
486 unfinished_work->mutable_config_settings()->add_forced_site(
487 "good-manifest.com");
488 unfinished_work->set_start_time(base::Time::Now().ToInternalValue());
489 PrecacheManifest good_manifest;
490 good_manifest.add_resource()->set_url(kGoodResourceURL);
491
492 factory_.SetFakeResponse(GURL(kGoodManifestURL),
493 good_manifest.SerializeAsString(), net::HTTP_OK,
494 net::URLRequestStatus::SUCCESS);
495 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
496 net::URLRequestStatus::SUCCESS);
497 {
498 PrecacheFetcher precache_fetcher(request_context_.get(),
499 GURL(), std::string(),
500 std::move(unfinished_work),
501 &precache_delegate_);
502 precache_fetcher.Start();
503
504 loop_.RunUntilIdle();
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. No metrics
524 // This should not cause OnDone to be called on the precache delegate. 635 // should be recorded because this should not cause OnDone to be
636 // called on the precache delegate.
525 } 637 }
526 638
527 loop_.RunUntilIdle(); 639 loop_.RunUntilIdle();
528 640
529 std::multiset<GURL> expected_requested_urls; 641 std::multiset<GURL> expected_requested_urls;
530 expected_requested_urls.insert(GURL(kConfigURL)); 642 expected_requested_urls.insert(GURL(kConfigURL));
531 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 643 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
532 644
533 EXPECT_FALSE(precache_delegate_.was_on_done_called()); 645 EXPECT_FALSE(precache_delegate_.was_on_done_called());
534 646
535 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 0, 1); 647 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 0, 0);
536 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 0, 1); 648 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 0, 0);
537 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 649 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0);
538 } 650 }
539 651
540 #if defined(PRECACHE_CONFIG_SETTINGS_URL) 652 #if defined(PRECACHE_CONFIG_SETTINGS_URL)
541 653
542 // If the default precache configuration settings URL is defined, then test that 654 // If the default precache configuration settings URL is defined, then test that
543 // it works with the PrecacheFetcher. 655 // it works with the PrecacheFetcher.
544 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { 656 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) {
545 std::vector<std::string> starting_hosts(1, "starting-url.com"); 657 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
658 new PrecacheUnfinishedWork());
659 unfinished_work->add_top_host()->set_hostname("starting-url.com");
546 660
547 PrecacheConfigurationSettings config; 661 PrecacheConfigurationSettings config;
548 config.set_top_sites_count(0); 662 config.set_top_sites_count(0);
549 663
550 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), 664 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL),
551 config.SerializeAsString(), net::HTTP_OK, 665 config.SerializeAsString(), net::HTTP_OK,
552 net::URLRequestStatus::SUCCESS); 666 net::URLRequestStatus::SUCCESS);
553 667
554 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 668 PrecacheFetcher precache_fetcher(request_context_.get(),
555 GURL(), std::string(), &precache_delegate_); 669 GURL(), std::string(),
670 std::move(unfinished_work),
671 &precache_delegate_);
556 precache_fetcher.Start(); 672 precache_fetcher.Start();
557 673
558 loop_.RunUntilIdle(); 674 loop_.RunUntilIdle();
559 675
560 std::multiset<GURL> expected_requested_urls; 676 std::multiset<GURL> expected_requested_urls;
561 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); 677 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL));
562 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 678 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
563 679
564 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 680 EXPECT_TRUE(precache_delegate_.was_on_done_called());
565 } 681 }
566 682
567 #endif // PRECACHE_CONFIG_SETTINGS_URL 683 #endif // PRECACHE_CONFIG_SETTINGS_URL
568 684
569 #if defined(PRECACHE_MANIFEST_URL_PREFIX) 685 #if defined(PRECACHE_MANIFEST_URL_PREFIX)
570 686
571 // If the default precache manifest URL prefix is defined, then test that it 687 // If the default precache manifest URL prefix is defined, then test that it
572 // works with the PrecacheFetcher. 688 // works with the PrecacheFetcher.
573 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultManifestURLPrefix) { 689 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultManifestURLPrefix) {
574 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 690 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
575 switches::kPrecacheConfigSettingsURL, kConfigURL); 691 switches::kPrecacheConfigSettingsURL, kConfigURL);
576 692
577 std::vector<std::string> starting_hosts(1, "starting-url.com"); 693 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
694 new PrecacheUnfinishedWork());
695 unfinished_work->add_top_host()->set_hostname("starting-url.com");
578 696
579 PrecacheConfigurationSettings config; 697 PrecacheConfigurationSettings config;
580 config.set_top_sites_count(1); 698 config.set_top_sites_count(1);
581 699
582 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); 700 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com");
583 701
584 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 702 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
585 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 703 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
586 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), 704 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(),
587 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 705 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
588 706
589 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 707 PrecacheFetcher precache_fetcher(request_context_.get(),
590 GURL(), std::string(), &precache_delegate_); 708 GURL(), std::string(),
709 std::move(unfinished_work),
710 &precache_delegate_);
591 precache_fetcher.Start(); 711 precache_fetcher.Start();
592 712
593 loop_.RunUntilIdle(); 713 loop_.RunUntilIdle();
594 714
595 std::multiset<GURL> expected_requested_urls; 715 std::multiset<GURL> expected_requested_urls;
596 expected_requested_urls.insert(GURL(kConfigURL)); 716 expected_requested_urls.insert(GURL(kConfigURL));
597 expected_requested_urls.insert(manifest_url); 717 expected_requested_urls.insert(manifest_url);
598 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 718 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
599 719
600 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 720 EXPECT_TRUE(precache_delegate_.was_on_done_called());
601 } 721 }
602 722
603 #endif // PRECACHE_MANIFEST_URL_PREFIX 723 #endif // PRECACHE_MANIFEST_URL_PREFIX
604 724
605 TEST_F(PrecacheFetcherTest, TopResourcesCount) { 725 TEST_F(PrecacheFetcherTest, TopResourcesCount) {
606 SetDefaultFlags(); 726 SetDefaultFlags();
607 727
608 std::vector<std::string> starting_hosts; 728 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
609 starting_hosts.push_back("good-manifest.com"); 729 new PrecacheUnfinishedWork());
730 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
731 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
610 732
611 PrecacheConfigurationSettings config; 733 PrecacheConfigurationSettings config;
612 config.set_top_resources_count(3); 734 config.set_top_resources_count(3);
613 735
614 PrecacheManifest good_manifest; 736 PrecacheManifest good_manifest;
615 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved"); 737 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved");
616 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved"); 738 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved");
617 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved"); 739 good_manifest.add_resource()->set_url("http://good-manifest.com/retrieved");
618 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped"); 740 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped");
619 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped"); 741 good_manifest.add_resource()->set_url("http://good-manifest.com/skipped");
620 742
621 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 743 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
622 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 744 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
623 factory_.SetFakeResponse(GURL(kGoodManifestURL), 745 factory_.SetFakeResponse(GURL(kGoodManifestURL),
624 good_manifest.SerializeAsString(), net::HTTP_OK, 746 good_manifest.SerializeAsString(), net::HTTP_OK,
625 net::URLRequestStatus::SUCCESS); 747 net::URLRequestStatus::SUCCESS);
626 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", 748 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good",
627 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 749 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
628 750
629 base::HistogramTester histogram; 751 base::HistogramTester histogram;
630 752
631 { 753 {
632 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 754 PrecacheFetcher precache_fetcher(request_context_.get(),
633 GURL(), std::string(), 755 GURL(), std::string(),
756 std::move(unfinished_work),
634 &precache_delegate_); 757 &precache_delegate_);
635 precache_fetcher.Start(); 758 precache_fetcher.Start();
636 759
637 loop_.RunUntilIdle(); 760 loop_.RunUntilIdle();
638 761
639 // Destroy the PrecacheFetcher after it has finished, to record metrics. 762 // Destroy the PrecacheFetcher after it has finished, to record metrics.
640 } 763 }
641 764
642 std::multiset<GURL> expected_requested_urls; 765 std::multiset<GURL> expected_requested_urls;
643 expected_requested_urls.insert(GURL(kConfigURL)); 766 expected_requested_urls.insert(GURL(kConfigURL));
(...skipping 24 matching lines...) Expand all
668 // PrecacheFetcherFetcherTest.ResourceTooBig tests the bulk of the code. We'll 791 // PrecacheFetcherFetcherTest.ResourceTooBig tests the bulk of the code. We'll
669 // assume that PrecacheFetcher passes the right max_bytes to the 792 // assume that PrecacheFetcher passes the right max_bytes to the
670 // PrecacheFetcher::Fetcher constructor. 793 // PrecacheFetcher::Fetcher constructor.
671 // 794 //
672 // TODO(twifkak): Port these tests from FakeURLFetcherFactory to 795 // TODO(twifkak): Port these tests from FakeURLFetcherFactory to
673 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are 796 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are
674 // cancelled midstream. 797 // cancelled midstream.
675 798
676 TEST_F(PrecacheFetcherTest, MaxBytesTotal) { 799 TEST_F(PrecacheFetcherTest, MaxBytesTotal) {
677 SetDefaultFlags(); 800 SetDefaultFlags();
801 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
802 new PrecacheUnfinishedWork());
803 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
804 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
805
678 const size_t kNumResources = 15; // > kMaxParallelFetches. 806 const size_t kNumResources = 15; // > kMaxParallelFetches.
679 const size_t kMaxBytesTotal = 1000; 807 const size_t kMaxBytesTotal = 1000;
680 const size_t kBytesPerResource = kMaxBytesTotal / 3; 808 const size_t kBytesPerResource = kMaxBytesTotal / 3;
681 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal. 809 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal.
682 810
683 PrecacheConfigurationSettings config; 811 PrecacheConfigurationSettings config;
684 config.set_max_bytes_total(kMaxBytesTotal); 812 config.set_max_bytes_total(kMaxBytesTotal);
685 813
686 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 814 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
687 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 815 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
688 816
689 PrecacheManifest good_manifest; 817 PrecacheManifest good_manifest;
690 for (size_t i = 0; i < kNumResources; ++i) { 818 for (size_t i = 0; i < kNumResources; ++i) {
691 const std::string url = "http://good-manifest.com/" + std::to_string(i); 819 const std::string url = "http://good-manifest.com/" + std::to_string(i);
692 good_manifest.add_resource()->set_url(url); 820 good_manifest.add_resource()->set_url(url);
693 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'), 821 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'),
694 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 822 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
695 } 823 }
696 824
697 factory_.SetFakeResponse(GURL(kGoodManifestURL), 825 factory_.SetFakeResponse(GURL(kGoodManifestURL),
698 good_manifest.SerializeAsString(), net::HTTP_OK, 826 good_manifest.SerializeAsString(), net::HTTP_OK,
699 net::URLRequestStatus::SUCCESS); 827 net::URLRequestStatus::SUCCESS);
700 828
701 base::HistogramTester histogram; 829 base::HistogramTester histogram;
702 830
703 { 831 {
704 PrecacheFetcher precache_fetcher({"good-manifest.com"}, 832 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(),
705 request_context_.get(), GURL(), 833 std::string(),
706 std::string(), &precache_delegate_); 834 std::move(unfinished_work),
835 &precache_delegate_);
707 precache_fetcher.Start(); 836 precache_fetcher.Start();
708 837
709 loop_.RunUntilIdle(); 838 loop_.RunUntilIdle();
710
711 // Destroy the PrecacheFetcher after it has finished, to record metrics.
712 } 839 }
713 840
714 // We don't know which will make it and which won't due to the parallelism in 841 // We don't know which will make it and which won't due to the parallelism in
715 // the pool of Fetchers. 842 // the pool of Fetchers.
716 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); 843 EXPECT_GT(kNumResources, url_callback_.requested_urls().size());
717 844
718 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 845 EXPECT_TRUE(precache_delegate_.was_on_done_called());
719 846
720 // good-manifest.com will not have been completed. 847 // good-manifest.com will not have been completed.
721 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 848 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
722 ElementsAre(base::Bucket(0, 1))); 849 ElementsAre(base::Bucket(0, 1)));
723 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 850 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
724 } 851 }
725 852
726 } // namespace 853 } // namespace
727 854
728 } // namespace precache 855 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698