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 V4UpdateProtocolManager::Create( | 68 return 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 // Initial state. No errors. |
148 EXPECT_EQ(0ul, pm->update_error_count_); | 154 EXPECT_EQ(0ul, pm->update_error_count_); |
149 EXPECT_EQ(1ul, pm->update_back_off_mult_); | 155 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
| 156 expect_callback_to_be_called_ = false; |
| 157 pm->IssueUpdateRequest(); |
150 | 158 |
151 pm->IssueUpdateRequest(); | |
152 EXPECT_FALSE(pm->IsUpdateScheduled()); | 159 EXPECT_FALSE(pm->IsUpdateScheduled()); |
153 | 160 |
154 runner->RunPendingTasks(); | 161 runner->RunPendingTasks(); |
155 | 162 |
156 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 163 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
157 DCHECK(fetcher); | 164 DCHECK(fetcher); |
158 // Failed request status should result in error. | 165 // Failed request status should result in error. |
159 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, | 166 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
160 net::ERR_CONNECTION_RESET)); | 167 net::ERR_CONNECTION_RESET)); |
161 fetcher->delegate()->OnURLFetchComplete(fetcher); | 168 fetcher->delegate()->OnURLFetchComplete(fetcher); |
162 | 169 |
163 // Should have recorded one error, but back off multiplier is unchanged. | 170 // Should have recorded one error, but back off multiplier is unchanged. |
164 EXPECT_EQ(1ul, pm->update_error_count_); | 171 EXPECT_EQ(1ul, pm->update_error_count_); |
165 EXPECT_EQ(1ul, pm->update_back_off_mult_); | 172 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
166 EXPECT_TRUE(pm->IsUpdateScheduled()); | 173 EXPECT_TRUE(pm->IsUpdateScheduled()); |
167 } | 174 } |
168 | 175 |
169 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingResponseCode) { | 176 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesErrorHandlingResponseCode) { |
170 scoped_refptr<base::TestSimpleTaskRunner> runner( | 177 scoped_refptr<base::TestSimpleTaskRunner> runner( |
171 new base::TestSimpleTaskRunner()); | 178 new base::TestSimpleTaskRunner()); |
172 base::ThreadTaskRunnerHandle runner_handler(runner); | 179 base::ThreadTaskRunnerHandle runner_handler(runner); |
173 net::TestURLFetcherFactory factory; | 180 net::TestURLFetcherFactory factory; |
174 const std::vector<ListUpdateResponse> expected_lurs; | 181 const std::vector<ListUpdateResponse> expected_lurs; |
175 const base::hash_map<UpdateListIdentifier, std::string> current_list_states; | 182 const base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
176 scoped_ptr<V4UpdateProtocolManager> pm( | 183 scoped_ptr<V4UpdateProtocolManager> pm( |
177 CreateProtocolManager(current_list_states, expected_lurs)); | 184 CreateProtocolManager(current_list_states, expected_lurs)); |
178 runner->ClearPendingTasks(); | 185 runner->ClearPendingTasks(); |
179 | 186 |
| 187 // Initial state. No errors. |
| 188 EXPECT_EQ(0ul, pm->update_error_count_); |
| 189 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
| 190 expect_callback_to_be_called_ = false; |
180 pm->IssueUpdateRequest(); | 191 pm->IssueUpdateRequest(); |
| 192 |
181 EXPECT_FALSE(pm->IsUpdateScheduled()); | 193 EXPECT_FALSE(pm->IsUpdateScheduled()); |
182 | 194 |
183 runner->RunPendingTasks(); | 195 runner->RunPendingTasks(); |
184 | 196 |
185 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 197 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
186 DCHECK(fetcher); | 198 DCHECK(fetcher); |
187 fetcher->set_status(net::URLRequestStatus()); | 199 fetcher->set_status(net::URLRequestStatus()); |
188 // Response code of anything other than 200 should result in error. | 200 // Response code of anything other than 200 should result in error. |
189 fetcher->set_response_code(net::HTTP_NO_CONTENT); | 201 fetcher->set_response_code(net::HTTP_NO_CONTENT); |
190 fetcher->SetResponseString(""); | 202 fetcher->SetResponseString(""); |
(...skipping 11 matching lines...) Expand all Loading... |
202 base::ThreadTaskRunnerHandle runner_handler(runner); | 214 base::ThreadTaskRunnerHandle runner_handler(runner); |
203 net::TestURLFetcherFactory factory; | 215 net::TestURLFetcherFactory factory; |
204 std::vector<ListUpdateResponse> expected_lurs; | 216 std::vector<ListUpdateResponse> expected_lurs; |
205 SetupExpectedListUpdateResponse(&expected_lurs); | 217 SetupExpectedListUpdateResponse(&expected_lurs); |
206 base::hash_map<UpdateListIdentifier, std::string> current_list_states; | 218 base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
207 SetupCurrentListStates(¤t_list_states); | 219 SetupCurrentListStates(¤t_list_states); |
208 scoped_ptr<V4UpdateProtocolManager> pm( | 220 scoped_ptr<V4UpdateProtocolManager> pm( |
209 CreateProtocolManager(current_list_states, expected_lurs)); | 221 CreateProtocolManager(current_list_states, expected_lurs)); |
210 runner->ClearPendingTasks(); | 222 runner->ClearPendingTasks(); |
211 | 223 |
| 224 // Initial state. No errors. |
| 225 EXPECT_EQ(0ul, pm->update_error_count_); |
| 226 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
| 227 expect_callback_to_be_called_ = true; |
212 pm->IssueUpdateRequest(); | 228 pm->IssueUpdateRequest(); |
| 229 |
213 EXPECT_FALSE(pm->IsUpdateScheduled()); | 230 EXPECT_FALSE(pm->IsUpdateScheduled()); |
214 | 231 |
215 runner->RunPendingTasks(); | 232 runner->RunPendingTasks(); |
216 | 233 |
217 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 234 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
218 DCHECK(fetcher); | 235 DCHECK(fetcher); |
219 fetcher->set_status(net::URLRequestStatus()); | 236 fetcher->set_status(net::URLRequestStatus()); |
220 fetcher->set_response_code(net::HTTP_OK); | 237 fetcher->set_response_code(net::HTTP_OK); |
221 fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); | 238 fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); |
222 fetcher->delegate()->OnURLFetchComplete(fetcher); | 239 fetcher->delegate()->OnURLFetchComplete(fetcher); |
223 | 240 |
224 // No error, back off multiplier is unchanged. | 241 // No error, back off multiplier is unchanged. |
225 EXPECT_EQ(0ul, pm->update_error_count_); | 242 EXPECT_EQ(0ul, pm->update_error_count_); |
226 EXPECT_EQ(1ul, pm->update_back_off_mult_); | 243 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
227 EXPECT_TRUE(pm->IsUpdateScheduled()); | 244 EXPECT_TRUE(pm->IsUpdateScheduled()); |
228 } | 245 } |
229 | 246 |
| 247 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesWithOneBackoff) { |
| 248 scoped_refptr<base::TestSimpleTaskRunner> runner( |
| 249 new base::TestSimpleTaskRunner()); |
| 250 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 251 net::TestURLFetcherFactory factory; |
| 252 std::vector<ListUpdateResponse> expected_lurs; |
| 253 SetupExpectedListUpdateResponse(&expected_lurs); |
| 254 base::hash_map<UpdateListIdentifier, std::string> current_list_states; |
| 255 SetupCurrentListStates(¤t_list_states); |
| 256 scoped_ptr<V4UpdateProtocolManager> pm( |
| 257 CreateProtocolManager(current_list_states, expected_lurs)); |
| 258 runner->ClearPendingTasks(); |
| 259 |
| 260 // Initial state. No errors. |
| 261 EXPECT_EQ(0ul, pm->update_error_count_); |
| 262 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
| 263 expect_callback_to_be_called_ = false; |
| 264 pm->IssueUpdateRequest(); |
| 265 |
| 266 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 267 |
| 268 runner->RunPendingTasks(); |
| 269 |
| 270 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 271 DCHECK(fetcher); |
| 272 fetcher->set_status(net::URLRequestStatus()); |
| 273 // Response code of anything other than 200 should result in error. |
| 274 fetcher->set_response_code(net::HTTP_NO_CONTENT); |
| 275 fetcher->SetResponseString(""); |
| 276 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 277 |
| 278 // Should have recorded one error, but back off multiplier is unchanged. |
| 279 EXPECT_EQ(1ul, pm->update_error_count_); |
| 280 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
| 281 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 282 |
| 283 // Retry, now no backoff. |
| 284 expect_callback_to_be_called_ = true; |
| 285 runner->RunPendingTasks(); |
| 286 |
| 287 fetcher = factory.GetFetcherByID(1); |
| 288 DCHECK(fetcher); |
| 289 fetcher->set_status(net::URLRequestStatus()); |
| 290 fetcher->set_response_code(net::HTTP_OK); |
| 291 fetcher->SetResponseString(GetExpectedV4UpdateResponse(expected_lurs)); |
| 292 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 293 |
| 294 // No error, back off multiplier is unchanged. |
| 295 EXPECT_EQ(0ul, pm->update_error_count_); |
| 296 EXPECT_EQ(1ul, pm->update_back_off_mult_); |
| 297 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 298 } |
| 299 |
230 } // namespace safe_browsing | 300 } // namespace safe_browsing |
OLD | NEW |