OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |