Index: components/safe_browsing_db/v4_update_protocol_manager_unittest.cc |
diff --git a/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc b/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc |
index 5ea6182c5a7d72afda3fbc25168e5ba84816d370..c7665cd8fa06a5d4a851d159f10a623989d002a6 100644 |
--- a/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc |
+++ b/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc |
@@ -34,9 +34,12 @@ namespace safe_browsing { |
class V4UpdateProtocolManagerTest : public testing::Test { |
protected: |
- static void ValidateGetUpdatesResults( |
+ void ValidateGetUpdatesResults( |
const std::vector<ListUpdateResponse>& expected_lurs, |
const std::vector<ListUpdateResponse>& list_update_responses) { |
+ // The callback should never be called if expect_callback_to_be_called_ is |
+ // false. |
+ EXPECT_TRUE(expect_callback_to_be_called_); |
ASSERT_EQ(expected_lurs.size(), list_update_responses.size()); |
for (unsigned int i = 0; i < list_update_responses.size(); ++i) { |
@@ -64,7 +67,8 @@ class V4UpdateProtocolManagerTest : public testing::Test { |
config.disable_auto_update = false; |
return V4UpdateProtocolManager::Create( |
NULL, config, current_list_states, |
- base::Bind(ValidateGetUpdatesResults, expected_lurs)); |
+ base::Bind(&V4UpdateProtocolManagerTest::ValidateGetUpdatesResults, |
+ base::Unretained(this), expected_lurs)); |
} |
void SetupCurrentListStates( |
@@ -130,6 +134,8 @@ class V4UpdateProtocolManagerTest : public testing::Test { |
return res_data; |
} |
+ |
+ bool expect_callback_to_be_called_; |
}; |
// TODO(vakh): Add many more tests. |
@@ -147,8 +153,9 @@ TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingNetwork) { |
// Initial state. No errors. |
EXPECT_EQ(0ul, pm->update_error_count_); |
EXPECT_EQ(1ul, pm->update_back_off_mult_); |
- |
+ expect_callback_to_be_called_ = false; |
pm->IssueUpdateRequest(); |
+ |
EXPECT_FALSE(pm->IsUpdateScheduled()); |
runner->RunPendingTasks(); |
@@ -177,7 +184,12 @@ TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingResponseCode) { |
CreateProtocolManager(current_list_states, expected_lurs)); |
runner->ClearPendingTasks(); |
+ // Initial state. No errors. |
+ EXPECT_EQ(0ul, pm->update_error_count_); |
+ EXPECT_EQ(1ul, pm->update_back_off_mult_); |
+ expect_callback_to_be_called_ = false; |
pm->IssueUpdateRequest(); |
+ |
EXPECT_FALSE(pm->IsUpdateScheduled()); |
runner->RunPendingTasks(); |
@@ -209,7 +221,12 @@ TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesNoError) { |
CreateProtocolManager(current_list_states, expected_lurs)); |
runner->ClearPendingTasks(); |
+ // Initial state. No errors. |
+ EXPECT_EQ(0ul, pm->update_error_count_); |
+ EXPECT_EQ(1ul, pm->update_back_off_mult_); |
+ expect_callback_to_be_called_ = true; |
pm->IssueUpdateRequest(); |
+ |
EXPECT_FALSE(pm->IsUpdateScheduled()); |
runner->RunPendingTasks(); |
@@ -227,4 +244,57 @@ TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesNoError) { |
EXPECT_TRUE(pm->IsUpdateScheduled()); |
} |
+TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesWithOneBackoff) { |
+ scoped_refptr<base::TestSimpleTaskRunner> runner( |
+ new base::TestSimpleTaskRunner()); |
+ base::ThreadTaskRunnerHandle runner_handler(runner); |
+ net::TestURLFetcherFactory factory; |
+ std::vector<ListUpdateResponse> expected_lurs; |
+ SetupExpectedListUpdateResponse(&expected_lurs); |
+ base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
+ SetupCurrentListStates(¤t_list_states); |
+ scoped_ptr<V4UpdateProtocolManager> pm( |
+ CreateProtocolManager(current_list_states, expected_lurs)); |
+ runner->ClearPendingTasks(); |
+ |
+ // Initial state. No errors. |
+ EXPECT_EQ(0ul, pm->update_error_count_); |
+ EXPECT_EQ(1ul, pm->update_back_off_mult_); |
+ expect_callback_to_be_called_ = false; |
+ pm->IssueUpdateRequest(); |
+ |
+ EXPECT_FALSE(pm->IsUpdateScheduled()); |
+ |
+ runner->RunPendingTasks(); |
+ |
+ net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
+ DCHECK(fetcher); |
+ fetcher->set_status(net::URLRequestStatus()); |
+ // Response code of anything other than 200 should result in error. |
+ fetcher->set_response_code(net::HTTP_NO_CONTENT); |
+ fetcher->SetResponseString(""); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher); |
+ |
+ // Should have recorded one error, but back off multiplier is unchanged. |
+ EXPECT_EQ(1ul, pm->update_error_count_); |
+ EXPECT_EQ(1ul, pm->update_back_off_mult_); |
+ EXPECT_TRUE(pm->IsUpdateScheduled()); |
+ |
+ // Retry, now no backoff. |
+ expect_callback_to_be_called_ = true; |
+ runner->RunPendingTasks(); |
+ |
+ fetcher = factory.GetFetcherByID(1); |
+ DCHECK(fetcher); |
+ fetcher->set_status(net::URLRequestStatus()); |
+ fetcher->set_response_code(net::HTTP_OK); |
+ fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher); |
+ |
+ // No error, back off multiplier is unchanged. |
+ EXPECT_EQ(0ul, pm->update_error_count_); |
+ EXPECT_EQ(1ul, pm->update_back_off_mult_); |
+ EXPECT_TRUE(pm->IsUpdateScheduled()); |
+} |
+ |
} // namespace safe_browsing |