| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/safe_browsing/protocol_manager.h" | 5 #include "chrome/browser/safe_browsing/protocol_manager.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/test/test_simple_task_runner.h" | 12 #include "base/test/scoped_mock_time_message_loop_task_runner.h" |
| 13 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
| 14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 15 #include "chrome/browser/safe_browsing/chunk.pb.h" | 15 #include "chrome/browser/safe_browsing/chunk.pb.h" |
| 16 #include "components/safe_browsing_db/safe_browsing_prefs.h" | 16 #include "components/safe_browsing_db/safe_browsing_prefs.h" |
| 17 #include "components/safe_browsing_db/safebrowsing.pb.h" | 17 #include "components/safe_browsing_db/safebrowsing.pb.h" |
| 18 #include "components/safe_browsing_db/util.h" | 18 #include "components/safe_browsing_db/util.h" |
| 19 #include "content/public/test/test_browser_thread.h" | 19 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "google_apis/google_api_keys.h" | 20 #include "google_apis/google_api_keys.h" |
| 21 #include "net/base/escape.h" | 21 #include "net/base/escape.h" |
| 22 #include "net/base/load_flags.h" | 22 #include "net/base/load_flags.h" |
| 23 #include "net/base/net_errors.h" | 23 #include "net/base/net_errors.h" |
| 24 #include "net/url_request/test_url_fetcher_factory.h" | 24 #include "net/url_request/test_url_fetcher_factory.h" |
| 25 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 26 #include "testing/gmock_mutant.h" | 26 #include "testing/gmock_mutant.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 28 | 28 |
| 29 using base::Time; | 29 using base::Time; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 }; | 67 }; |
| 68 const std::string kChunkPayload2(kRawChunkPayload2, sizeof(kRawChunkPayload2)); | 68 const std::string kChunkPayload2(kRawChunkPayload2, sizeof(kRawChunkPayload2)); |
| 69 | 69 |
| 70 } // namespace | 70 } // namespace |
| 71 | 71 |
| 72 namespace safe_browsing { | 72 namespace safe_browsing { |
| 73 | 73 |
| 74 class SafeBrowsingProtocolManagerTest : public testing::Test { | 74 class SafeBrowsingProtocolManagerTest : public testing::Test { |
| 75 protected: | 75 protected: |
| 76 SafeBrowsingProtocolManagerTest() | 76 SafeBrowsingProtocolManagerTest() |
| 77 : runner_(new base::TestSimpleTaskRunner), | 77 : thread_bundle_(content::TestBrowserThreadBundle::Options::IO_MAINLOOP) { |
| 78 runner_handler_(runner_), | 78 } |
| 79 io_thread_(content::BrowserThread::IO, base::MessageLoop::current()) {} | |
| 80 | 79 |
| 81 ~SafeBrowsingProtocolManagerTest() override {} | 80 ~SafeBrowsingProtocolManagerTest() override {} |
| 82 | 81 |
| 83 void SetUp() override { | 82 void SetUp() override { |
| 84 std::string key = google_apis::GetAPIKey(); | 83 std::string key = google_apis::GetAPIKey(); |
| 85 if (!key.empty()) { | 84 if (!key.empty()) { |
| 86 key_param_ = base::StringPrintf( | 85 key_param_ = base::StringPrintf( |
| 87 "&key=%s", | 86 "&key=%s", |
| 88 net::EscapeQueryParamValue(key, true).c_str()); | 87 net::EscapeQueryParamValue(key, true).c_str()); |
| 89 } | 88 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 } | 122 } |
| 124 | 123 |
| 125 void ValidateRedirectFetcherRequest(const net::TestURLFetcher* url_fetcher, | 124 void ValidateRedirectFetcherRequest(const net::TestURLFetcher* url_fetcher, |
| 126 const std::string& expected_url) { | 125 const std::string& expected_url) { |
| 127 ASSERT_TRUE(url_fetcher); | 126 ASSERT_TRUE(url_fetcher); |
| 128 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); | 127 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); |
| 129 EXPECT_EQ("", url_fetcher->upload_data()); | 128 EXPECT_EQ("", url_fetcher->upload_data()); |
| 130 EXPECT_EQ(GURL(expected_url), url_fetcher->GetOriginalURL()); | 129 EXPECT_EQ(GURL(expected_url), url_fetcher->GetOriginalURL()); |
| 131 } | 130 } |
| 132 | 131 |
| 133 scoped_refptr<base::TestSimpleTaskRunner> runner_; | 132 // Fakes BrowserThreads and the main MessageLoop. |
| 134 base::ThreadTaskRunnerHandle runner_handler_; | 133 content::TestBrowserThreadBundle thread_bundle_; |
| 135 content::TestBrowserThread io_thread_; | 134 |
| 135 // Replaces the main MessageLoop's TaskRunner with a TaskRunner on which time |
| 136 // is mocked to allow testing of things bound to timers below. |
| 137 base::ScopedMockTimeMessageLoopTaskRunner mock_time_task_runner_; |
| 138 |
| 136 std::string key_param_; | 139 std::string key_param_; |
| 137 }; | 140 }; |
| 138 | 141 |
| 139 // Ensure that we respect section 5 of the SafeBrowsing protocol specification. | 142 // Ensure that we respect section 5 of the SafeBrowsing protocol specification. |
| 140 TEST_F(SafeBrowsingProtocolManagerTest, TestBackOffTimes) { | 143 TEST_F(SafeBrowsingProtocolManagerTest, TestBackOffTimes) { |
| 141 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 144 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 142 CreateProtocolManager(nullptr)); | 145 CreateProtocolManager(nullptr)); |
| 143 | 146 |
| 144 pm->next_update_interval_ = TimeDelta::FromSeconds(1800); | 147 pm->next_update_interval_ = TimeDelta::FromSeconds(1800); |
| 145 ASSERT_TRUE(pm->back_off_fuzz_ >= 0.0 && pm->back_off_fuzz_ <= 1.0); | 148 ASSERT_TRUE(pm->back_off_fuzz_ >= 0.0 && pm->back_off_fuzz_ <= 1.0); |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | 420 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 418 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 421 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 419 std::vector<SBListChunkRanges>(), | 422 std::vector<SBListChunkRanges>(), |
| 420 true))); | 423 true))); |
| 421 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 424 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 422 | 425 |
| 423 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 426 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 424 CreateProtocolManager(&test_delegate)); | 427 CreateProtocolManager(&test_delegate)); |
| 425 | 428 |
| 426 pm->ForceScheduleNextUpdate(TimeDelta()); | 429 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 427 runner_->RunPendingTasks(); | 430 mock_time_task_runner_->RunUntilIdle(); |
| 428 | 431 |
| 429 EXPECT_TRUE(pm->IsUpdateScheduled()); | 432 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 430 } | 433 } |
| 431 | 434 |
| 432 // Tests the contents of the POST body when there are contents in the | 435 // Tests the contents of the POST body when there are contents in the |
| 433 // local database. This is not exhaustive, as the actual list formatting | 436 // local database. This is not exhaustive, as the actual list formatting |
| 434 // is covered by SafeBrowsingProtocolManagerTest.TestChunkStrings. | 437 // is covered by SafeBrowsingProtocolManagerTest.TestChunkStrings. |
| 435 TEST_F(SafeBrowsingProtocolManagerTest, ExistingDatabase) { | 438 TEST_F(SafeBrowsingProtocolManagerTest, ExistingDatabase) { |
| 436 net::TestURLFetcherFactory url_fetcher_factory; | 439 net::TestURLFetcherFactory url_fetcher_factory; |
| 437 | 440 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 452 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 455 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 453 ranges, | 456 ranges, |
| 454 false))); | 457 false))); |
| 455 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 458 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 456 | 459 |
| 457 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 460 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 458 CreateProtocolManager(&test_delegate)); | 461 CreateProtocolManager(&test_delegate)); |
| 459 | 462 |
| 460 // Kick off initialization. This returns chunks from the DB synchronously. | 463 // Kick off initialization. This returns chunks from the DB synchronously. |
| 461 pm->ForceScheduleNextUpdate(TimeDelta()); | 464 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 462 runner_->RunPendingTasks(); | 465 mock_time_task_runner_->RunUntilIdle(); |
| 463 | 466 |
| 464 // We should have an URLFetcher at this point in time. | 467 // We should have an URLFetcher at this point in time. |
| 465 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 468 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 466 ASSERT_TRUE(url_fetcher); | 469 ASSERT_TRUE(url_fetcher); |
| 467 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); | 470 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); |
| 468 EXPECT_EQ(base::StringPrintf("%s;a:adds_phish:s:subs_phish\n" | 471 EXPECT_EQ(base::StringPrintf("%s;a:adds_phish:s:subs_phish\n" |
| 469 "unknown_list;a:adds_unknown:s:subs_unknown\n" | 472 "unknown_list;a:adds_unknown:s:subs_unknown\n" |
| 470 "%s;\n", | 473 "%s;\n", |
| 471 kDefaultPhishList, kDefaultMalwareList), | 474 kDefaultPhishList, kDefaultMalwareList), |
| 472 url_fetcher->upload_data()); | 475 url_fetcher->upload_data()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 492 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 495 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 493 std::vector<SBListChunkRanges>(), | 496 std::vector<SBListChunkRanges>(), |
| 494 false))); | 497 false))); |
| 495 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 498 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 496 | 499 |
| 497 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 500 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 498 CreateProtocolManager(&test_delegate)); | 501 CreateProtocolManager(&test_delegate)); |
| 499 | 502 |
| 500 // Kick off initialization. This returns chunks from the DB synchronously. | 503 // Kick off initialization. This returns chunks from the DB synchronously. |
| 501 pm->ForceScheduleNextUpdate(TimeDelta()); | 504 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 502 runner_->RunPendingTasks(); | 505 mock_time_task_runner_->RunUntilIdle(); |
| 503 | 506 |
| 504 // We should have an URLFetcher at this point in time. | 507 // We should have an URLFetcher at this point in time. |
| 505 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 508 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 506 ValidateUpdateFetcherRequest(url_fetcher); | 509 ValidateUpdateFetcherRequest(url_fetcher); |
| 507 | 510 |
| 508 // The update response is successful, but an invalid body. | 511 // The update response is successful, but an invalid body. |
| 509 url_fetcher->set_status(net::URLRequestStatus()); | 512 url_fetcher->set_status(net::URLRequestStatus()); |
| 510 url_fetcher->set_response_code(200); | 513 url_fetcher->set_response_code(200); |
| 511 url_fetcher->SetResponseString("THIS_IS_A_BAD_RESPONSE"); | 514 url_fetcher->SetResponseString("THIS_IS_A_BAD_RESPONSE"); |
| 512 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 515 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 536 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 539 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 537 std::vector<SBListChunkRanges>(), | 540 std::vector<SBListChunkRanges>(), |
| 538 false))); | 541 false))); |
| 539 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 542 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 540 | 543 |
| 541 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 544 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 542 CreateProtocolManager(&test_delegate)); | 545 CreateProtocolManager(&test_delegate)); |
| 543 | 546 |
| 544 // Kick off initialization. This returns chunks from the DB synchronously. | 547 // Kick off initialization. This returns chunks from the DB synchronously. |
| 545 pm->ForceScheduleNextUpdate(TimeDelta()); | 548 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 546 runner_->RunPendingTasks(); | 549 mock_time_task_runner_->RunUntilIdle(); |
| 547 | 550 |
| 548 // We should have an URLFetcher at this point in time. | 551 // We should have an URLFetcher at this point in time. |
| 549 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 552 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 550 ValidateUpdateFetcherRequest(url_fetcher); | 553 ValidateUpdateFetcherRequest(url_fetcher); |
| 551 | 554 |
| 552 // Go ahead and respond to it. | 555 // Go ahead and respond to it. |
| 553 url_fetcher->set_status(net::URLRequestStatus()); | 556 url_fetcher->set_status(net::URLRequestStatus()); |
| 554 url_fetcher->set_response_code(404); | 557 url_fetcher->set_response_code(404); |
| 555 url_fetcher->SetResponseString(std::string()); | 558 url_fetcher->SetResponseString(std::string()); |
| 556 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 559 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 580 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 583 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 581 std::vector<SBListChunkRanges>(), | 584 std::vector<SBListChunkRanges>(), |
| 582 false))); | 585 false))); |
| 583 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 586 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 584 | 587 |
| 585 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 588 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 586 CreateProtocolManager(&test_delegate)); | 589 CreateProtocolManager(&test_delegate)); |
| 587 | 590 |
| 588 // Kick off initialization. This returns chunks from the DB synchronously. | 591 // Kick off initialization. This returns chunks from the DB synchronously. |
| 589 pm->ForceScheduleNextUpdate(TimeDelta()); | 592 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 590 runner_->RunPendingTasks(); | 593 mock_time_task_runner_->RunUntilIdle(); |
| 591 | 594 |
| 592 // We should have an URLFetcher at this point in time. | 595 // We should have an URLFetcher at this point in time. |
| 593 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 596 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 594 ValidateUpdateFetcherRequest(url_fetcher); | 597 ValidateUpdateFetcherRequest(url_fetcher); |
| 595 | 598 |
| 596 // Go ahead and respond to it. | 599 // Go ahead and respond to it. |
| 597 url_fetcher->set_status(net::URLRequestStatus()); | 600 url_fetcher->set_status(net::URLRequestStatus()); |
| 598 url_fetcher->set_response_code(404); | 601 url_fetcher->set_response_code(404); |
| 599 url_fetcher->SetResponseString(std::string()); | 602 url_fetcher->SetResponseString(std::string()); |
| 600 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 603 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 624 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 627 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 625 std::vector<SBListChunkRanges>(), | 628 std::vector<SBListChunkRanges>(), |
| 626 false))); | 629 false))); |
| 627 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 630 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 628 | 631 |
| 629 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 632 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 630 CreateProtocolManager(&test_delegate)); | 633 CreateProtocolManager(&test_delegate)); |
| 631 | 634 |
| 632 // Kick off initialization. This returns chunks from the DB synchronously. | 635 // Kick off initialization. This returns chunks from the DB synchronously. |
| 633 pm->ForceScheduleNextUpdate(TimeDelta()); | 636 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 634 runner_->RunPendingTasks(); | 637 mock_time_task_runner_->RunUntilIdle(); |
| 635 | 638 |
| 636 // We should have an URLFetcher at this point in time. | 639 // We should have an URLFetcher at this point in time. |
| 637 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 640 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 638 ValidateUpdateFetcherRequest(url_fetcher); | 641 ValidateUpdateFetcherRequest(url_fetcher); |
| 639 | 642 |
| 640 // Go ahead and respond to it. | 643 // Go ahead and respond to it. |
| 641 url_fetcher->set_status(net::URLRequestStatus()); | 644 url_fetcher->set_status(net::URLRequestStatus()); |
| 642 url_fetcher->set_response_code(404); | 645 url_fetcher->set_response_code(404); |
| 643 url_fetcher->SetResponseString(std::string()); | 646 url_fetcher->SetResponseString(std::string()); |
| 644 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 647 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 645 | 648 |
| 646 // There should now be a backup request. | 649 // There should now be a backup request. |
| 647 net::TestURLFetcher* backup_url_fetcher = | 650 net::TestURLFetcher* backup_url_fetcher = |
| 648 url_fetcher_factory.GetFetcherByID(1); | 651 url_fetcher_factory.GetFetcherByID(1); |
| 649 ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupHttpUrlPrefix, ""); | 652 ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupHttpUrlPrefix, ""); |
| 650 | 653 |
| 651 // Either one or two calls to RunPendingTasks are needed here. The first run | 654 // Confirm that no update is scheduled (still waiting on a response to the |
| 652 // of RunPendingTasks will run the canceled timeout task associated with | 655 // backup request). |
| 653 // the first Update request. Depending on timing, this will either directly | 656 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 654 // call the timeout task from the backup request, or schedule another task | 657 |
| 655 // to run that in the future. | 658 // Force the timeout to fire. Need to fast forward by twice the timeout amount |
| 656 // TODO(cbentzel): Less fragile approach. | 659 // as issuing the backup request above restarted the timeout timer but that |
| 657 runner_->RunPendingTasks(); | 660 // Timer's clock isn't mocked and its impl is such that it will re-use its |
| 658 if (!pm->IsUpdateScheduled()) | 661 // initial delayed task and re-post by the remainder of the timeout when it |
| 659 runner_->RunPendingTasks(); | 662 // fires (which is pretty much the full timeout in real time since we mock the |
| 663 // wait). A cleaner solution would be to pass |
| 664 // |mock_time_task_runner_->GetMockTickClock()| to the |
| 665 // SafeBrowsingProtocolManager's Timers but such hooks were deemed overkill |
| 666 // per this being the only use case at this point. |
| 667 mock_time_task_runner_->FastForwardBy( |
| 668 SafeBrowsingProtocolManager::GetUpdateTimeoutForTesting() * 2); |
| 660 EXPECT_TRUE(pm->IsUpdateScheduled()); | 669 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 661 } | 670 } |
| 662 | 671 |
| 663 // Tests what happens when there is a connection error when issuing the update | 672 // Tests what happens when there is a connection error when issuing the update |
| 664 // request, and an error with the backup update request. | 673 // request, and an error with the backup update request. |
| 665 TEST_F(SafeBrowsingProtocolManagerTest, | 674 TEST_F(SafeBrowsingProtocolManagerTest, |
| 666 UpdateResponseConnectionErrorBackupError) { | 675 UpdateResponseConnectionErrorBackupError) { |
| 667 net::TestURLFetcherFactory url_fetcher_factory; | 676 net::TestURLFetcherFactory url_fetcher_factory; |
| 668 | 677 |
| 669 testing::StrictMock<MockProtocolDelegate> test_delegate; | 678 testing::StrictMock<MockProtocolDelegate> test_delegate; |
| 670 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | 679 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
| 671 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | 680 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 672 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 681 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 673 std::vector<SBListChunkRanges>(), | 682 std::vector<SBListChunkRanges>(), |
| 674 false))); | 683 false))); |
| 675 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 684 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 676 | 685 |
| 677 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 686 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 678 CreateProtocolManager(&test_delegate)); | 687 CreateProtocolManager(&test_delegate)); |
| 679 | 688 |
| 680 // Kick off initialization. This returns chunks from the DB synchronously. | 689 // Kick off initialization. This returns chunks from the DB synchronously. |
| 681 pm->ForceScheduleNextUpdate(TimeDelta()); | 690 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 682 runner_->RunPendingTasks(); | 691 mock_time_task_runner_->RunUntilIdle(); |
| 683 | 692 |
| 684 // We should have an URLFetcher at this point in time. | 693 // We should have an URLFetcher at this point in time. |
| 685 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 694 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 686 ValidateUpdateFetcherRequest(url_fetcher); | 695 ValidateUpdateFetcherRequest(url_fetcher); |
| 687 | 696 |
| 688 // Go ahead and respond to it. | 697 // Go ahead and respond to it. |
| 689 url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, | 698 url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
| 690 net::ERR_CONNECTION_RESET)); | 699 net::ERR_CONNECTION_RESET)); |
| 691 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 700 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 692 | 701 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 716 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 725 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 717 std::vector<SBListChunkRanges>(), | 726 std::vector<SBListChunkRanges>(), |
| 718 false))); | 727 false))); |
| 719 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 728 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 720 | 729 |
| 721 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 730 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 722 CreateProtocolManager(&test_delegate)); | 731 CreateProtocolManager(&test_delegate)); |
| 723 | 732 |
| 724 // Kick off initialization. This returns chunks from the DB synchronously. | 733 // Kick off initialization. This returns chunks from the DB synchronously. |
| 725 pm->ForceScheduleNextUpdate(TimeDelta()); | 734 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 726 runner_->RunPendingTasks(); | 735 mock_time_task_runner_->RunUntilIdle(); |
| 727 | 736 |
| 728 // We should have an URLFetcher at this point in time. | 737 // We should have an URLFetcher at this point in time. |
| 729 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 738 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 730 ValidateUpdateFetcherRequest(url_fetcher); | 739 ValidateUpdateFetcherRequest(url_fetcher); |
| 731 | 740 |
| 732 // Go ahead and respond to it. | 741 // Go ahead and respond to it. |
| 733 url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, | 742 url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
| 734 net::ERR_CONNECTION_RESET)); | 743 net::ERR_CONNECTION_RESET)); |
| 735 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 744 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 736 | 745 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 759 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 768 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 760 std::vector<SBListChunkRanges>(), | 769 std::vector<SBListChunkRanges>(), |
| 761 false))); | 770 false))); |
| 762 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 771 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 763 | 772 |
| 764 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 773 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 765 CreateProtocolManager(&test_delegate)); | 774 CreateProtocolManager(&test_delegate)); |
| 766 | 775 |
| 767 // Kick off initialization. This returns chunks from the DB synchronously. | 776 // Kick off initialization. This returns chunks from the DB synchronously. |
| 768 pm->ForceScheduleNextUpdate(TimeDelta()); | 777 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 769 runner_->RunPendingTasks(); | 778 mock_time_task_runner_->RunUntilIdle(); |
| 770 | 779 |
| 771 // We should have an URLFetcher at this point in time. | 780 // We should have an URLFetcher at this point in time. |
| 772 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 781 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 773 ValidateUpdateFetcherRequest(url_fetcher); | 782 ValidateUpdateFetcherRequest(url_fetcher); |
| 774 | 783 |
| 775 // Go ahead and respond to it. | 784 // Go ahead and respond to it. |
| 776 url_fetcher->set_status( | 785 url_fetcher->set_status( |
| 777 net::URLRequestStatus(net::URLRequestStatus::FAILED, | 786 net::URLRequestStatus(net::URLRequestStatus::FAILED, |
| 778 net::ERR_INTERNET_DISCONNECTED)); | 787 net::ERR_INTERNET_DISCONNECTED)); |
| 779 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 788 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 804 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 813 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 805 std::vector<SBListChunkRanges>(), | 814 std::vector<SBListChunkRanges>(), |
| 806 false))); | 815 false))); |
| 807 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 816 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 808 | 817 |
| 809 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 818 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 810 CreateProtocolManager(&test_delegate)); | 819 CreateProtocolManager(&test_delegate)); |
| 811 | 820 |
| 812 // Kick off initialization. This returns chunks from the DB synchronously. | 821 // Kick off initialization. This returns chunks from the DB synchronously. |
| 813 pm->ForceScheduleNextUpdate(TimeDelta()); | 822 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 814 runner_->RunPendingTasks(); | 823 mock_time_task_runner_->RunUntilIdle(); |
| 815 | 824 |
| 816 // We should have an URLFetcher at this point in time. | 825 // We should have an URLFetcher at this point in time. |
| 817 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 826 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 818 ValidateUpdateFetcherRequest(url_fetcher); | 827 ValidateUpdateFetcherRequest(url_fetcher); |
| 819 | 828 |
| 820 // Go ahead and respond to it. | 829 // Go ahead and respond to it. |
| 821 url_fetcher->set_status( | 830 url_fetcher->set_status( |
| 822 net::URLRequestStatus(net::URLRequestStatus::FAILED, | 831 net::URLRequestStatus(net::URLRequestStatus::FAILED, |
| 823 net::ERR_INTERNET_DISCONNECTED)); | 832 net::ERR_INTERNET_DISCONNECTED)); |
| 824 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 833 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 847 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 856 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 848 std::vector<SBListChunkRanges>(), | 857 std::vector<SBListChunkRanges>(), |
| 849 false))); | 858 false))); |
| 850 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 859 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 851 | 860 |
| 852 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 861 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 853 CreateProtocolManager(&test_delegate)); | 862 CreateProtocolManager(&test_delegate)); |
| 854 | 863 |
| 855 // Kick off initialization. This returns chunks from the DB synchronously. | 864 // Kick off initialization. This returns chunks from the DB synchronously. |
| 856 pm->ForceScheduleNextUpdate(TimeDelta()); | 865 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 857 runner_->RunPendingTasks(); | 866 mock_time_task_runner_->RunUntilIdle(); |
| 858 | 867 |
| 859 // We should have an URLFetcher at this point in time. | 868 // We should have an URLFetcher at this point in time. |
| 860 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 869 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 861 ValidateUpdateFetcherRequest(url_fetcher); | 870 ValidateUpdateFetcherRequest(url_fetcher); |
| 862 | 871 |
| 863 // The first time RunPendingTasks is called above, the update timeout timer is | 872 // Force the timeout to fire. |
| 864 // not handled. This call of RunPendingTasks will handle the update. | 873 mock_time_task_runner_->FastForwardBy( |
| 865 runner_->RunPendingTasks(); | 874 SafeBrowsingProtocolManager::GetUpdateTimeoutForTesting()); |
| 866 | 875 |
| 867 // There should be a backup URLFetcher now. | 876 // There should be a backup URLFetcher now. |
| 868 net::TestURLFetcher* backup_url_fetcher = | 877 net::TestURLFetcher* backup_url_fetcher = |
| 869 url_fetcher_factory.GetFetcherByID(1); | 878 url_fetcher_factory.GetFetcherByID(1); |
| 870 ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupConnectUrlPrefix, ""); | 879 ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupConnectUrlPrefix, ""); |
| 871 | 880 |
| 872 // Respond to the backup unsuccessfully. | 881 // Respond to the backup unsuccessfully. |
| 873 backup_url_fetcher->set_status(net::URLRequestStatus()); | 882 backup_url_fetcher->set_status(net::URLRequestStatus()); |
| 874 backup_url_fetcher->set_response_code(200); | 883 backup_url_fetcher->set_response_code(200); |
| 875 backup_url_fetcher->SetResponseString(std::string()); | 884 backup_url_fetcher->SetResponseString(std::string()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 889 std::vector<SBListChunkRanges>(), | 898 std::vector<SBListChunkRanges>(), |
| 890 false))); | 899 false))); |
| 891 EXPECT_CALL(test_delegate, ResetDatabase()).Times(1); | 900 EXPECT_CALL(test_delegate, ResetDatabase()).Times(1); |
| 892 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 901 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 893 | 902 |
| 894 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 903 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 895 CreateProtocolManager(&test_delegate)); | 904 CreateProtocolManager(&test_delegate)); |
| 896 | 905 |
| 897 // Kick off initialization. This returns chunks from the DB synchronously. | 906 // Kick off initialization. This returns chunks from the DB synchronously. |
| 898 pm->ForceScheduleNextUpdate(TimeDelta()); | 907 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 899 runner_->RunPendingTasks(); | 908 mock_time_task_runner_->RunUntilIdle(); |
| 900 | 909 |
| 901 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 910 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 902 ValidateUpdateFetcherRequest(url_fetcher); | 911 ValidateUpdateFetcherRequest(url_fetcher); |
| 903 | 912 |
| 904 // The update response is successful, and has a reset command. | 913 // The update response is successful, and has a reset command. |
| 905 url_fetcher->set_status(net::URLRequestStatus()); | 914 url_fetcher->set_status(net::URLRequestStatus()); |
| 906 url_fetcher->set_response_code(200); | 915 url_fetcher->set_response_code(200); |
| 907 url_fetcher->SetResponseString("r:pleasereset\n"); | 916 url_fetcher->SetResponseString("r:pleasereset\n"); |
| 908 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 917 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 909 | 918 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 921 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 930 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 922 std::vector<SBListChunkRanges>(), | 931 std::vector<SBListChunkRanges>(), |
| 923 false))); | 932 false))); |
| 924 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 933 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 925 | 934 |
| 926 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 935 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 927 CreateProtocolManager(&test_delegate)); | 936 CreateProtocolManager(&test_delegate)); |
| 928 | 937 |
| 929 // Kick off initialization. This returns chunks from the DB synchronously. | 938 // Kick off initialization. This returns chunks from the DB synchronously. |
| 930 pm->ForceScheduleNextUpdate(TimeDelta()); | 939 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 931 runner_->RunPendingTasks(); | 940 mock_time_task_runner_->RunUntilIdle(); |
| 932 | 941 |
| 933 // The update response contains a single redirect command. | 942 // The update response contains a single redirect command. |
| 934 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 943 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 935 ValidateUpdateFetcherRequest(url_fetcher); | 944 ValidateUpdateFetcherRequest(url_fetcher); |
| 936 url_fetcher->set_status(net::URLRequestStatus()); | 945 url_fetcher->set_status(net::URLRequestStatus()); |
| 937 url_fetcher->set_response_code(200); | 946 url_fetcher->set_response_code(200); |
| 938 url_fetcher->SetResponseString( | 947 url_fetcher->SetResponseString( |
| 939 base::StringPrintf("i:%s\n" | 948 base::StringPrintf("i:%s\n" |
| 940 "u:redirect-server.example.com/path\n", | 949 "u:redirect-server.example.com/path\n", |
| 941 kDefaultPhishList)); | 950 kDefaultPhishList)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 965 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 974 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 966 std::vector<SBListChunkRanges>(), | 975 std::vector<SBListChunkRanges>(), |
| 967 false))); | 976 false))); |
| 968 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 977 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 969 | 978 |
| 970 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 979 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 971 CreateProtocolManager(&test_delegate)); | 980 CreateProtocolManager(&test_delegate)); |
| 972 | 981 |
| 973 // Kick off initialization. This returns chunks from the DB synchronously. | 982 // Kick off initialization. This returns chunks from the DB synchronously. |
| 974 pm->ForceScheduleNextUpdate(TimeDelta()); | 983 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 975 runner_->RunPendingTasks(); | 984 mock_time_task_runner_->RunUntilIdle(); |
| 976 | 985 |
| 977 // The update response contains a single redirect command. | 986 // The update response contains a single redirect command. |
| 978 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 987 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 979 ValidateUpdateFetcherRequest(url_fetcher); | 988 ValidateUpdateFetcherRequest(url_fetcher); |
| 980 url_fetcher->set_status(net::URLRequestStatus()); | 989 url_fetcher->set_status(net::URLRequestStatus()); |
| 981 url_fetcher->set_response_code(200); | 990 url_fetcher->set_response_code(200); |
| 982 url_fetcher->SetResponseString( | 991 url_fetcher->SetResponseString( |
| 983 base::StringPrintf("i:%s\n" | 992 base::StringPrintf("i:%s\n" |
| 984 "u:redirect-server.example.com/path\n", | 993 "u:redirect-server.example.com/path\n", |
| 985 kDefaultPhishList)); | 994 kDefaultPhishList)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1011 false))); | 1020 false))); |
| 1012 EXPECT_CALL(test_delegate, AddChunksRaw(kDefaultPhishList, _, _)).WillOnce( | 1021 EXPECT_CALL(test_delegate, AddChunksRaw(kDefaultPhishList, _, _)).WillOnce( |
| 1013 Invoke(HandleAddChunks)); | 1022 Invoke(HandleAddChunks)); |
| 1014 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 1023 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 1015 | 1024 |
| 1016 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 1025 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 1017 CreateProtocolManager(&test_delegate)); | 1026 CreateProtocolManager(&test_delegate)); |
| 1018 | 1027 |
| 1019 // Kick off initialization. This returns chunks from the DB synchronously. | 1028 // Kick off initialization. This returns chunks from the DB synchronously. |
| 1020 pm->ForceScheduleNextUpdate(TimeDelta()); | 1029 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 1021 runner_->RunPendingTasks(); | 1030 mock_time_task_runner_->RunUntilIdle(); |
| 1022 | 1031 |
| 1023 // The update response contains a single redirect command. | 1032 // The update response contains a single redirect command. |
| 1024 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 1033 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 1025 ValidateUpdateFetcherRequest(url_fetcher); | 1034 ValidateUpdateFetcherRequest(url_fetcher); |
| 1026 url_fetcher->set_status(net::URLRequestStatus()); | 1035 url_fetcher->set_status(net::URLRequestStatus()); |
| 1027 url_fetcher->set_response_code(200); | 1036 url_fetcher->set_response_code(200); |
| 1028 url_fetcher->SetResponseString( | 1037 url_fetcher->SetResponseString( |
| 1029 base::StringPrintf("i:%s\n" | 1038 base::StringPrintf("i:%s\n" |
| 1030 "u:redirect-server.example.com/path\n", | 1039 "u:redirect-server.example.com/path\n", |
| 1031 kDefaultPhishList)); | 1040 kDefaultPhishList)); |
| 1032 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 1041 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 1033 | 1042 |
| 1034 // The redirect response contains a single chunk. | 1043 // The redirect response contains a single chunk. |
| 1035 net::TestURLFetcher* chunk_url_fetcher = | 1044 net::TestURLFetcher* chunk_url_fetcher = |
| 1036 url_fetcher_factory.GetFetcherByID(1); | 1045 url_fetcher_factory.GetFetcherByID(1); |
| 1037 ValidateRedirectFetcherRequest( | 1046 ValidateRedirectFetcherRequest( |
| 1038 chunk_url_fetcher, "https://redirect-server.example.com/path"); | 1047 chunk_url_fetcher, "https://redirect-server.example.com/path"); |
| 1039 chunk_url_fetcher->set_status(net::URLRequestStatus()); | 1048 chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 1040 chunk_url_fetcher->set_response_code(200); | 1049 chunk_url_fetcher->set_response_code(200); |
| 1041 chunk_url_fetcher->SetResponseString(kChunkPayload1); | 1050 chunk_url_fetcher->SetResponseString(kChunkPayload1); |
| 1042 chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); | 1051 chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); |
| 1043 | 1052 |
| 1044 EXPECT_FALSE(pm->IsUpdateScheduled()); | 1053 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 1045 | 1054 |
| 1046 // The AddChunksCallback needs to be invoked. | 1055 // The AddChunksCallback needs to be invoked. |
| 1047 runner_->RunPendingTasks(); | 1056 mock_time_task_runner_->RunUntilIdle(); |
| 1048 | 1057 |
| 1049 EXPECT_TRUE(pm->IsUpdateScheduled()); | 1058 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 1050 } | 1059 } |
| 1051 | 1060 |
| 1052 // Tests a single valid update response, followed by multiple redirect responses | 1061 // Tests a single valid update response, followed by multiple redirect responses |
| 1053 // containing chunks. | 1062 // containing chunks. |
| 1054 TEST_F(SafeBrowsingProtocolManagerTest, MultipleRedirectResponsesWithChunks) { | 1063 TEST_F(SafeBrowsingProtocolManagerTest, MultipleRedirectResponsesWithChunks) { |
| 1055 net::TestURLFetcherFactory url_fetcher_factory; | 1064 net::TestURLFetcherFactory url_fetcher_factory; |
| 1056 | 1065 |
| 1057 testing::StrictMock<MockProtocolDelegate> test_delegate; | 1066 testing::StrictMock<MockProtocolDelegate> test_delegate; |
| 1058 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | 1067 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
| 1059 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | 1068 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 1060 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 1069 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 1061 std::vector<SBListChunkRanges>(), | 1070 std::vector<SBListChunkRanges>(), |
| 1062 false))); | 1071 false))); |
| 1063 EXPECT_CALL(test_delegate, AddChunksRaw(kDefaultPhishList, _, _)). | 1072 EXPECT_CALL(test_delegate, AddChunksRaw(kDefaultPhishList, _, _)). |
| 1064 WillRepeatedly(Invoke(HandleAddChunks)); | 1073 WillRepeatedly(Invoke(HandleAddChunks)); |
| 1065 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 1074 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 1066 | 1075 |
| 1067 std::unique_ptr<SafeBrowsingProtocolManager> pm( | 1076 std::unique_ptr<SafeBrowsingProtocolManager> pm( |
| 1068 CreateProtocolManager(&test_delegate)); | 1077 CreateProtocolManager(&test_delegate)); |
| 1069 | 1078 |
| 1070 // Kick off initialization. This returns chunks from the DB synchronously. | 1079 // Kick off initialization. This returns chunks from the DB synchronously. |
| 1071 pm->ForceScheduleNextUpdate(TimeDelta()); | 1080 pm->ForceScheduleNextUpdate(TimeDelta()); |
| 1072 runner_->RunPendingTasks(); | 1081 mock_time_task_runner_->RunUntilIdle(); |
| 1073 | 1082 |
| 1074 // The update response contains multiple redirect commands. | 1083 // The update response contains multiple redirect commands. |
| 1075 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 1084 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 1076 ValidateUpdateFetcherRequest(url_fetcher); | 1085 ValidateUpdateFetcherRequest(url_fetcher); |
| 1077 url_fetcher->set_status(net::URLRequestStatus()); | 1086 url_fetcher->set_status(net::URLRequestStatus()); |
| 1078 url_fetcher->set_response_code(200); | 1087 url_fetcher->set_response_code(200); |
| 1079 url_fetcher->SetResponseString( | 1088 url_fetcher->SetResponseString( |
| 1080 base::StringPrintf("i:%s\n" | 1089 base::StringPrintf("i:%s\n" |
| 1081 "u:redirect-server.example.com/one\n" | 1090 "u:redirect-server.example.com/one\n" |
| 1082 "u:redirect-server.example.com/two\n", | 1091 "u:redirect-server.example.com/two\n", |
| 1083 kDefaultPhishList)); | 1092 kDefaultPhishList)); |
| 1084 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 1093 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 1085 | 1094 |
| 1086 // The first redirect response contains a single chunk. | 1095 // The first redirect response contains a single chunk. |
| 1087 net::TestURLFetcher* first_chunk_url_fetcher = | 1096 net::TestURLFetcher* first_chunk_url_fetcher = |
| 1088 url_fetcher_factory.GetFetcherByID(1); | 1097 url_fetcher_factory.GetFetcherByID(1); |
| 1089 ValidateRedirectFetcherRequest( | 1098 ValidateRedirectFetcherRequest( |
| 1090 first_chunk_url_fetcher, "https://redirect-server.example.com/one"); | 1099 first_chunk_url_fetcher, "https://redirect-server.example.com/one"); |
| 1091 first_chunk_url_fetcher->set_status(net::URLRequestStatus()); | 1100 first_chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 1092 first_chunk_url_fetcher->set_response_code(200); | 1101 first_chunk_url_fetcher->set_response_code(200); |
| 1093 first_chunk_url_fetcher->SetResponseString(kChunkPayload1); | 1102 first_chunk_url_fetcher->SetResponseString(kChunkPayload1); |
| 1094 first_chunk_url_fetcher->delegate()->OnURLFetchComplete( | 1103 first_chunk_url_fetcher->delegate()->OnURLFetchComplete( |
| 1095 first_chunk_url_fetcher); | 1104 first_chunk_url_fetcher); |
| 1096 | 1105 |
| 1097 // Invoke the AddChunksCallback to trigger the second request. | 1106 // Invoke the AddChunksCallback to trigger the second request. |
| 1098 runner_->RunPendingTasks(); | 1107 mock_time_task_runner_->RunUntilIdle(); |
| 1099 | 1108 |
| 1100 EXPECT_FALSE(pm->IsUpdateScheduled()); | 1109 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 1101 | 1110 |
| 1102 // The second redirect response contains a single chunk. | 1111 // The second redirect response contains a single chunk. |
| 1103 net::TestURLFetcher* second_chunk_url_fetcher = | 1112 net::TestURLFetcher* second_chunk_url_fetcher = |
| 1104 url_fetcher_factory.GetFetcherByID(2); | 1113 url_fetcher_factory.GetFetcherByID(2); |
| 1105 ValidateRedirectFetcherRequest( | 1114 ValidateRedirectFetcherRequest( |
| 1106 second_chunk_url_fetcher, "https://redirect-server.example.com/two"); | 1115 second_chunk_url_fetcher, "https://redirect-server.example.com/two"); |
| 1107 second_chunk_url_fetcher->set_status(net::URLRequestStatus()); | 1116 second_chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 1108 second_chunk_url_fetcher->set_response_code(200); | 1117 second_chunk_url_fetcher->set_response_code(200); |
| 1109 second_chunk_url_fetcher->SetResponseString(kChunkPayload2); | 1118 second_chunk_url_fetcher->SetResponseString(kChunkPayload2); |
| 1110 second_chunk_url_fetcher->delegate()->OnURLFetchComplete( | 1119 second_chunk_url_fetcher->delegate()->OnURLFetchComplete( |
| 1111 second_chunk_url_fetcher); | 1120 second_chunk_url_fetcher); |
| 1112 | 1121 |
| 1113 EXPECT_FALSE(pm->IsUpdateScheduled()); | 1122 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 1114 | 1123 |
| 1115 // Invoke the AddChunksCallback to finish the update. | 1124 // Invoke the AddChunksCallback to finish the update. |
| 1116 runner_->RunPendingTasks(); | 1125 mock_time_task_runner_->RunUntilIdle(); |
| 1117 | 1126 |
| 1118 EXPECT_TRUE(pm->IsUpdateScheduled()); | 1127 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 1119 } | 1128 } |
| 1120 | 1129 |
| 1121 } // namespace safe_browsing | 1130 } // namespace safe_browsing |
| OLD | NEW |