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

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: test fix Created 4 years, 6 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.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0);
536 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", 0, 1);
537 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
538 } 648 }
539 649
540 #if defined(PRECACHE_CONFIG_SETTINGS_URL) 650 #if defined(PRECACHE_CONFIG_SETTINGS_URL)
541 651
542 // If the default precache configuration settings URL is defined, then test that 652 // If the default precache configuration settings URL is defined, then test that
543 // it works with the PrecacheFetcher. 653 // it works with the PrecacheFetcher.
544 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { 654 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) {
545 std::vector<std::string> starting_hosts(1, "starting-url.com"); 655 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
656 new PrecacheUnfinishedWork());
657 unfinished_work->add_top_host()->set_hostname("starting-url.com");
546 658
547 PrecacheConfigurationSettings config; 659 PrecacheConfigurationSettings config;
548 config.set_top_sites_count(0); 660 config.set_top_sites_count(0);
549 661
550 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), 662 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL),
551 config.SerializeAsString(), net::HTTP_OK, 663 config.SerializeAsString(), net::HTTP_OK,
552 net::URLRequestStatus::SUCCESS); 664 net::URLRequestStatus::SUCCESS);
553 665
554 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 666 PrecacheFetcher precache_fetcher(request_context_.get(),
555 GURL(), std::string(), &precache_delegate_); 667 GURL(), std::string(),
668 std::move(unfinished_work),
669 &precache_delegate_);
556 precache_fetcher.Start(); 670 precache_fetcher.Start();
557 671
558 loop_.RunUntilIdle(); 672 loop_.RunUntilIdle();
559 673
560 std::multiset<GURL> expected_requested_urls; 674 std::multiset<GURL> expected_requested_urls;
561 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); 675 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL));
562 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 676 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
563 677
564 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 678 EXPECT_TRUE(precache_delegate_.was_on_done_called());
565 } 679 }
566 680
567 #endif // PRECACHE_CONFIG_SETTINGS_URL 681 #endif // PRECACHE_CONFIG_SETTINGS_URL
568 682
569 #if defined(PRECACHE_MANIFEST_URL_PREFIX) 683 #if defined(PRECACHE_MANIFEST_URL_PREFIX)
570 684
571 // If the default precache manifest URL prefix is defined, then test that it 685 // If the default precache manifest URL prefix is defined, then test that it
572 // works with the PrecacheFetcher. 686 // works with the PrecacheFetcher.
573 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultManifestURLPrefix) { 687 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultManifestURLPrefix) {
574 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 688 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
575 switches::kPrecacheConfigSettingsURL, kConfigURL); 689 switches::kPrecacheConfigSettingsURL, kConfigURL);
576 690
577 std::vector<std::string> starting_hosts(1, "starting-url.com"); 691 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
692 new PrecacheUnfinishedWork());
693 unfinished_work->add_top_host()->set_hostname("starting-url.com");
578 694
579 PrecacheConfigurationSettings config; 695 PrecacheConfigurationSettings config;
580 config.set_top_sites_count(1); 696 config.set_top_sites_count(1);
581 697
582 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); 698 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com");
583 699
584 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 700 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
585 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 701 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
586 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), 702 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(),
587 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 703 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
588 704
589 PrecacheFetcher precache_fetcher(starting_hosts, request_context_.get(), 705 PrecacheFetcher precache_fetcher(request_context_.get(),
590 GURL(), std::string(), &precache_delegate_); 706 GURL(), std::string(),
707 std::move(unfinished_work),
708 &precache_delegate_);
591 precache_fetcher.Start(); 709 precache_fetcher.Start();
592 710
593 loop_.RunUntilIdle(); 711 loop_.RunUntilIdle();
594 712
595 std::multiset<GURL> expected_requested_urls; 713 std::multiset<GURL> expected_requested_urls;
596 expected_requested_urls.insert(GURL(kConfigURL)); 714 expected_requested_urls.insert(GURL(kConfigURL));
597 expected_requested_urls.insert(manifest_url); 715 expected_requested_urls.insert(manifest_url);
598 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 716 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
599 717
600 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 718 EXPECT_TRUE(precache_delegate_.was_on_done_called());
601 } 719 }
602 720
603 #endif // PRECACHE_MANIFEST_URL_PREFIX 721 #endif // PRECACHE_MANIFEST_URL_PREFIX
604 722
605 TEST_F(PrecacheFetcherTest, TopResourcesCount) { 723 TEST_F(PrecacheFetcherTest, TopResourcesCount) {
606 SetDefaultFlags(); 724 SetDefaultFlags();
607 725
608 std::vector<std::string> starting_hosts; 726 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
609 starting_hosts.push_back("good-manifest.com"); 727 new PrecacheUnfinishedWork());
728 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
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 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
803
678 const size_t kNumResources = 15; // > kMaxParallelFetches. 804 const size_t kNumResources = 15; // > kMaxParallelFetches.
679 const size_t kMaxBytesTotal = 1000; 805 const size_t kMaxBytesTotal = 1000;
680 const size_t kBytesPerResource = kMaxBytesTotal / 3; 806 const size_t kBytesPerResource = kMaxBytesTotal / 3;
681 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal. 807 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal.
682 808
683 PrecacheConfigurationSettings config; 809 PrecacheConfigurationSettings config;
684 config.set_max_bytes_total(kMaxBytesTotal); 810 config.set_max_bytes_total(kMaxBytesTotal);
685 811
686 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 812 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
687 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 813 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
688 814
689 PrecacheManifest good_manifest; 815 PrecacheManifest good_manifest;
690 for (size_t i = 0; i < kNumResources; ++i) { 816 for (size_t i = 0; i < kNumResources; ++i) {
691 const std::string url = "http://good-manifest.com/" + std::to_string(i); 817 const std::string url = "http://good-manifest.com/" + std::to_string(i);
692 good_manifest.add_resource()->set_url(url); 818 good_manifest.add_resource()->set_url(url);
693 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'), 819 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'),
694 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 820 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
695 } 821 }
696 822
697 factory_.SetFakeResponse(GURL(kGoodManifestURL), 823 factory_.SetFakeResponse(GURL(kGoodManifestURL),
698 good_manifest.SerializeAsString(), net::HTTP_OK, 824 good_manifest.SerializeAsString(), net::HTTP_OK,
699 net::URLRequestStatus::SUCCESS); 825 net::URLRequestStatus::SUCCESS);
700 826
701 base::HistogramTester histogram; 827 base::HistogramTester histogram;
702 828
703 { 829 {
704 PrecacheFetcher precache_fetcher({"good-manifest.com"}, 830 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(),
705 request_context_.get(), GURL(), 831 std::string(),
706 std::string(), &precache_delegate_); 832 std::move(unfinished_work),
833 &precache_delegate_);
707 precache_fetcher.Start(); 834 precache_fetcher.Start();
708 835
709 loop_.RunUntilIdle(); 836 loop_.RunUntilIdle();
710
711 // Destroy the PrecacheFetcher after it has finished, to record metrics.
712 } 837 }
713 838
714 // We don't know which will make it and which won't due to the parallelism in 839 // We don't know which will make it and which won't due to the parallelism in
715 // the pool of Fetchers. 840 // the pool of Fetchers.
716 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); 841 EXPECT_GT(kNumResources, url_callback_.requested_urls().size());
717 842
718 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 843 EXPECT_TRUE(precache_delegate_.was_on_done_called());
719 844
720 // good-manifest.com will not have been completed. 845 // good-manifest.com will not have been completed.
721 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 846 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
722 ElementsAre(base::Bucket(0, 1))); 847 ElementsAre(base::Bucket(0, 1)));
723 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 848 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
724 } 849 }
725 850
726 } // namespace 851 } // namespace
727 852
728 } // namespace precache 853 } // namespace precache
OLDNEW
« no previous file with comments | « components/precache/core/precache_fetcher.cc ('k') | components/precache/core/precache_session_table.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698