Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 const char kClient[] = "unittest"; | 27 const char kClient[] = "unittest"; |
| 28 const char kAppVer[] = "1.0"; | 28 const char kAppVer[] = "1.0"; |
| 29 const char kKeyParam[] = "test_key_param"; | 29 const char kKeyParam[] = "test_key_param"; |
| 30 | 30 |
| 31 } // namespace | 31 } // namespace |
| 32 | 32 |
| 33 namespace safe_browsing { | 33 namespace safe_browsing { |
| 34 | 34 |
| 35 class V4UpdateProtocolManagerTest : public testing::Test { | 35 class V4UpdateProtocolManagerTest : public testing::Test { |
| 36 protected: | 36 protected: |
| 37 static void ValidateGetUpdatesResults( | 37 void ValidateGetUpdatesResults( |
| 38 const std::vector<ListUpdateResponse>& expected_lurs, | 38 const std::vector<ListUpdateResponse>& expected_lurs, |
| 39 const std::vector<ListUpdateResponse>& list_update_responses) { | 39 const std::vector<ListUpdateResponse>& list_update_responses) { |
| 40 // The callback should never be called if expect_callback_to_be_called_ is | |
| 41 // false. | |
| 42 EXPECT_TRUE(expect_callback_to_be_called_); | |
| 40 ASSERT_EQ(expected_lurs.size(), list_update_responses.size()); | 43 ASSERT_EQ(expected_lurs.size(), list_update_responses.size()); |
| 41 | 44 |
| 42 for (unsigned int i = 0; i < list_update_responses.size(); ++i) { | 45 for (unsigned int i = 0; i < list_update_responses.size(); ++i) { |
| 43 const ListUpdateResponse& expected = expected_lurs[i]; | 46 const ListUpdateResponse& expected = expected_lurs[i]; |
| 44 const ListUpdateResponse& actual = list_update_responses[i]; | 47 const ListUpdateResponse& actual = list_update_responses[i]; |
| 45 | 48 |
| 46 EXPECT_EQ(expected.platform_type(), actual.platform_type()); | 49 EXPECT_EQ(expected.platform_type(), actual.platform_type()); |
| 47 EXPECT_EQ(expected.response_type(), actual.response_type()); | 50 EXPECT_EQ(expected.response_type(), actual.response_type()); |
| 48 EXPECT_EQ(expected.threat_entry_type(), actual.threat_entry_type()); | 51 EXPECT_EQ(expected.threat_entry_type(), actual.threat_entry_type()); |
| 49 EXPECT_EQ(expected.threat_type(), actual.threat_type()); | 52 EXPECT_EQ(expected.threat_type(), actual.threat_type()); |
| 50 EXPECT_EQ(expected.new_client_state(), actual.new_client_state()); | 53 EXPECT_EQ(expected.new_client_state(), actual.new_client_state()); |
| 51 | 54 |
| 52 // TODO(vakh): Test more fields from the proto. | 55 // TODO(vakh): Test more fields from the proto. |
| 53 } | 56 } |
| 54 } | 57 } |
| 55 | 58 |
| 56 scoped_ptr<V4UpdateProtocolManager> CreateProtocolManager( | 59 scoped_ptr<V4UpdateProtocolManager> CreateProtocolManager( |
| 57 const base::hash_map<UpdateListIdentifier, std::string> | 60 const base::hash_map<UpdateListIdentifier, std::string> |
| 58 current_list_states, | 61 current_list_states, |
| 59 const std::vector<ListUpdateResponse>& expected_lurs) { | 62 const std::vector<ListUpdateResponse>& expected_lurs) { |
| 60 V4ProtocolConfig config; | 63 V4ProtocolConfig config; |
| 61 config.client_name = kClient; | 64 config.client_name = kClient; |
| 62 config.version = kAppVer; | 65 config.version = kAppVer; |
| 63 config.key_param = kKeyParam; | 66 config.key_param = kKeyParam; |
| 64 config.disable_auto_update = false; | 67 config.disable_auto_update = false; |
| 65 return scoped_ptr<V4UpdateProtocolManager>(V4UpdateProtocolManager::Create( | 68 return scoped_ptr<V4UpdateProtocolManager>(V4UpdateProtocolManager::Create( |
| 66 NULL, config, current_list_states, | 69 NULL, config, current_list_states, |
| 67 base::Bind(ValidateGetUpdatesResults, expected_lurs))); | 70 base::Bind(&V4UpdateProtocolManagerTest::ValidateGetUpdatesResults, |
| 71 base::Unretained(this), expected_lurs))); | |
| 68 } | 72 } |
| 69 | 73 |
| 70 void SetupCurrentListStates( | 74 void SetupCurrentListStates( |
| 71 base::hash_map<UpdateListIdentifier, std::string>* current_list_states) { | 75 base::hash_map<UpdateListIdentifier, std::string>* current_list_states) { |
| 72 UpdateListIdentifier list_identifier; | 76 UpdateListIdentifier list_identifier; |
| 73 list_identifier.platform_type = WINDOWS_PLATFORM; | 77 list_identifier.platform_type = WINDOWS_PLATFORM; |
| 74 list_identifier.threat_entry_type = URL_EXPRESSION; | 78 list_identifier.threat_entry_type = URL_EXPRESSION; |
| 75 list_identifier.threat_type = MALWARE_THREAT; | 79 list_identifier.threat_type = MALWARE_THREAT; |
| 76 current_list_states->insert({list_identifier, "initial_state_1"}); | 80 current_list_states->insert({list_identifier, "initial_state_1"}); |
| 77 | 81 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 lur->set_threat_entry_type(expected_lur.threat_entry_type()); | 127 lur->set_threat_entry_type(expected_lur.threat_entry_type()); |
| 124 lur->set_threat_type(expected_lur.threat_type()); | 128 lur->set_threat_type(expected_lur.threat_type()); |
| 125 } | 129 } |
| 126 | 130 |
| 127 // Serialize. | 131 // Serialize. |
| 128 std::string res_data; | 132 std::string res_data; |
| 129 response.SerializeToString(&res_data); | 133 response.SerializeToString(&res_data); |
| 130 | 134 |
| 131 return res_data; | 135 return res_data; |
| 132 } | 136 } |
| 137 | |
| 138 bool expect_callback_to_be_called_; | |
| 133 }; | 139 }; |
| 134 | 140 |
| 135 // TODO(vakh): Add many more tests. | 141 // TODO(vakh): Add many more tests. |
| 136 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingNetwork) { | 142 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingNetwork) { |
| 137 scoped_refptr<base::TestSimpleTaskRunner> runner( | 143 scoped_refptr<base::TestSimpleTaskRunner> runner( |
| 138 new base::TestSimpleTaskRunner()); | 144 new base::TestSimpleTaskRunner()); |
| 139 base::ThreadTaskRunnerHandle runner_handler(runner); | 145 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 140 net::TestURLFetcherFactory factory; | 146 net::TestURLFetcherFactory factory; |
| 141 const base::hash_map<UpdateListIdentifier, std::string> current_list_states; | 147 const base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
| 142 const std::vector<ListUpdateResponse> expected_lurs; | 148 const std::vector<ListUpdateResponse> expected_lurs; |
| 143 scoped_ptr<V4UpdateProtocolManager> pm( | 149 scoped_ptr<V4UpdateProtocolManager> pm( |
| 144 CreateProtocolManager(current_list_states, expected_lurs)); | 150 CreateProtocolManager(current_list_states, expected_lurs)); |
| 145 runner->ClearPendingTasks(); | 151 runner->ClearPendingTasks(); |
| 146 | 152 |
| 147 // Initial state. No errors. | 153 expect_callback_to_be_called_ = false; |
| 148 EXPECT_EQ(0ul, pm->update_error_count_); | 154 pm->IssueUpdateRequest(); |
| 149 EXPECT_EQ(1ul, pm->update_back_off_mult_); | |
| 150 | 155 |
| 151 pm->IssueUpdateRequest(); | |
| 152 EXPECT_FALSE(pm->IsUpdateScheduled()); | 156 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 153 | 157 |
| 154 runner->RunPendingTasks(); | 158 runner->RunPendingTasks(); |
| 155 | 159 |
| 156 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 160 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 157 DCHECK(fetcher); | 161 DCHECK(fetcher); |
| 158 // Failed request status should result in error. | 162 // Failed request status should result in error. |
| 159 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, | 163 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
| 160 net::ERR_CONNECTION_RESET)); | 164 net::ERR_CONNECTION_RESET)); |
| 161 fetcher->delegate()->OnURLFetchComplete(fetcher); | 165 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 162 | 166 |
| 163 // Should have recorded one error, but back off multiplier is unchanged. | |
| 164 EXPECT_EQ(1ul, pm->update_error_count_); | |
| 165 EXPECT_EQ(1ul, pm->update_back_off_mult_); | |
| 166 EXPECT_TRUE(pm->IsUpdateScheduled()); | 167 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 167 } | 168 } |
| 168 | 169 |
| 169 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingResponseCode) { | 170 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingResponseCode) { |
| 170 scoped_refptr<base::TestSimpleTaskRunner> runner( | 171 scoped_refptr<base::TestSimpleTaskRunner> runner( |
| 171 new base::TestSimpleTaskRunner()); | 172 new base::TestSimpleTaskRunner()); |
| 172 base::ThreadTaskRunnerHandle runner_handler(runner); | 173 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 173 net::TestURLFetcherFactory factory; | 174 net::TestURLFetcherFactory factory; |
| 174 const std::vector<ListUpdateResponse> expected_lurs; | 175 const std::vector<ListUpdateResponse> expected_lurs; |
| 175 const base::hash_map<UpdateListIdentifier, std::string> current_list_states; | 176 const base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
| 176 scoped_ptr<V4UpdateProtocolManager> pm( | 177 scoped_ptr<V4UpdateProtocolManager> pm( |
| 177 CreateProtocolManager(current_list_states, expected_lurs)); | 178 CreateProtocolManager(current_list_states, expected_lurs)); |
| 178 runner->ClearPendingTasks(); | 179 runner->ClearPendingTasks(); |
| 179 | 180 |
| 181 expect_callback_to_be_called_ = false; | |
| 180 pm->IssueUpdateRequest(); | 182 pm->IssueUpdateRequest(); |
| 183 | |
| 181 EXPECT_FALSE(pm->IsUpdateScheduled()); | 184 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 182 | 185 |
| 183 runner->RunPendingTasks(); | 186 runner->RunPendingTasks(); |
| 184 | 187 |
| 185 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 188 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 186 DCHECK(fetcher); | 189 DCHECK(fetcher); |
| 187 fetcher->set_status(net::URLRequestStatus()); | 190 fetcher->set_status(net::URLRequestStatus()); |
| 188 // Response code of anything other than 200 should result in error. | 191 // Response code of anything other than 200 should result in error. |
| 189 fetcher->set_response_code(net::HTTP_NO_CONTENT); | 192 fetcher->set_response_code(net::HTTP_NO_CONTENT); |
| 190 fetcher->SetResponseString(""); | 193 fetcher->SetResponseString(""); |
| 191 fetcher->delegate()->OnURLFetchComplete(fetcher); | 194 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 192 | 195 |
| 193 // Should have recorded one error, but back off multiplier is unchanged. | |
| 194 EXPECT_EQ(1ul, pm->update_error_count_); | |
| 195 EXPECT_EQ(1ul, pm->update_back_off_mult_); | |
| 196 EXPECT_TRUE(pm->IsUpdateScheduled()); | 196 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 197 } | 197 } |
| 198 | 198 |
| 199 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesNoError) { | 199 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesNoError) { |
| 200 scoped_refptr<base::TestSimpleTaskRunner> runner( | 200 scoped_refptr<base::TestSimpleTaskRunner> runner( |
| 201 new base::TestSimpleTaskRunner()); | 201 new base::TestSimpleTaskRunner()); |
| 202 base::ThreadTaskRunnerHandle runner_handler(runner); | 202 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 203 net::TestURLFetcherFactory factory; | 203 net::TestURLFetcherFactory factory; |
| 204 std::vector<ListUpdateResponse> expected_lurs; | 204 std::vector<ListUpdateResponse> expected_lurs; |
| 205 SetupExpectedListUpdateResponse(&expected_lurs); | 205 SetupExpectedListUpdateResponse(&expected_lurs); |
| 206 base::hash_map<UpdateListIdentifier, std::string> current_list_states; | 206 base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
| 207 SetupCurrentListStates(¤t_list_states); | 207 SetupCurrentListStates(¤t_list_states); |
| 208 scoped_ptr<V4UpdateProtocolManager> pm( | 208 scoped_ptr<V4UpdateProtocolManager> pm( |
| 209 CreateProtocolManager(current_list_states, expected_lurs)); | 209 CreateProtocolManager(current_list_states, expected_lurs)); |
| 210 runner->ClearPendingTasks(); | 210 runner->ClearPendingTasks(); |
| 211 | 211 |
| 212 expect_callback_to_be_called_ = true; | |
| 212 pm->IssueUpdateRequest(); | 213 pm->IssueUpdateRequest(); |
| 214 | |
| 213 EXPECT_FALSE(pm->IsUpdateScheduled()); | 215 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 214 | 216 |
| 215 runner->RunPendingTasks(); | 217 runner->RunPendingTasks(); |
| 218 | |
| 219 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | |
| 220 DCHECK(fetcher); | |
| 221 fetcher->set_status(net::URLRequestStatus()); | |
| 222 fetcher->set_response_code(net::HTTP_OK); | |
| 223 fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); | |
| 224 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 225 | |
| 226 EXPECT_TRUE(pm->IsUpdateScheduled()); | |
| 227 } | |
| 228 | |
| 229 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesWithOneBackoff) { | |
| 230 scoped_refptr<base::TestSimpleTaskRunner> runner( | |
| 231 new base::TestSimpleTaskRunner()); | |
| 232 base::ThreadTaskRunnerHandle runner_handler(runner); | |
| 233 net::TestURLFetcherFactory factory; | |
| 234 std::vector<ListUpdateResponse> expected_lurs; | |
| 235 SetupExpectedListUpdateResponse(&expected_lurs); | |
| 236 base::hash_map<UpdateListIdentifier, std::string> current_list_states; | |
| 237 SetupCurrentListStates(¤t_list_states); | |
| 238 scoped_ptr<V4UpdateProtocolManager> pm( | |
| 239 CreateProtocolManager(current_list_states, expected_lurs)); | |
| 240 runner->ClearPendingTasks(); | |
| 241 | |
| 242 expect_callback_to_be_called_ = false; | |
| 243 pm->IssueUpdateRequest(); | |
| 244 | |
| 245 EXPECT_FALSE(pm->IsUpdateScheduled()); | |
| 246 | |
| 247 runner->RunPendingTasks(); | |
| 216 | 248 |
| 217 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 249 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 218 DCHECK(fetcher); | 250 DCHECK(fetcher); |
| 219 fetcher->set_status(net::URLRequestStatus()); | 251 fetcher->set_status(net::URLRequestStatus()); |
| 252 // Response code of anything other than 200 should result in error. | |
| 253 fetcher->set_response_code(net::HTTP_NO_CONTENT); | |
| 254 fetcher->SetResponseString(""); | |
| 255 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 256 | |
| 257 EXPECT_TRUE(pm->IsUpdateScheduled()); | |
| 258 | |
| 259 // Retry, now no backoff. | |
| 260 expect_callback_to_be_called_ = true; | |
| 261 runner->RunPendingTasks(); | |
| 262 | |
| 263 fetcher = factory.GetFetcherByID(1); | |
| 264 DCHECK(fetcher); | |
| 265 fetcher->set_status(net::URLRequestStatus()); | |
| 220 fetcher->set_response_code(net::HTTP_OK); | 266 fetcher->set_response_code(net::HTTP_OK); |
| 221 fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); | 267 fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); |
| 222 fetcher->delegate()->OnURLFetchComplete(fetcher); | 268 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 223 | 269 |
| 224 // No error, back off multiplier is unchanged. | |
| 225 EXPECT_EQ(0ul, pm->update_error_count_); | |
| 226 EXPECT_EQ(1ul, pm->update_back_off_mult_); | |
| 227 EXPECT_TRUE(pm->IsUpdateScheduled()); | 270 EXPECT_TRUE(pm->IsUpdateScheduled()); |
|
Nathan Parker
2016/04/01 23:10:10
Why remove the checks of pm->update_*
vakh (use Gerrit instead)
2016/04/01 23:13:23
That code is covered by https://code.google.com/p/
| |
| 228 } | 271 } |
| 229 | 272 |
| 230 } // namespace safe_browsing | 273 } // namespace safe_browsing |
| OLD | NEW |