OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/policy/cloud/external_policy_data_updater.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/callback.h" | |
10 #include "base/compiler_specific.h" | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/sha1.h" | |
13 #include "base/test/test_pending_task.h" | |
14 #include "base/test/test_simple_task_runner.h" | |
15 #include "base/time/time.h" | |
16 #include "chrome/browser/policy/cloud/external_policy_data_fetcher.h" | |
17 #include "net/base/net_errors.h" | |
18 #include "net/url_request/test_url_fetcher_factory.h" | |
19 #include "net/url_request/url_fetcher_delegate.h" | |
20 #include "net/url_request/url_request_context_getter.h" | |
21 #include "net/url_request/url_request_status.h" | |
22 #include "testing/gmock/include/gmock/gmock.h" | |
23 #include "testing/gtest/include/gtest/gtest.h" | |
24 #include "url/gurl.h" | |
25 | |
26 using testing::Mock; | |
27 using testing::Return; | |
28 | |
29 namespace policy { | |
30 | |
31 namespace { | |
32 | |
33 const char* kExternalPolicyDataKeys[] = {"external_policy_data_1", | |
34 "external_policy_data_2", | |
35 "external_policy_data_3"}; | |
36 const char* kExternalPolicyDataURLs[] = {"http://example.com/data_1", | |
37 "http://example.com/data_2", | |
38 "http://example.com/data_3"}; | |
39 const char* kExternalPolicyDataPayload = "External policy data"; | |
40 | |
41 const int64 kExternalPolicyDataMaxSize = 5 * 1024 * 1024; // 5 MB. | |
42 | |
43 class MockFetchSuccessCallbackListener { | |
44 public: | |
45 MOCK_METHOD2(OnFetchSuccess, bool(const std::string&, const std::string&)); | |
46 | |
47 ExternalPolicyDataUpdater::FetchSuccessCallback CreateCallback( | |
48 const std::string& key); | |
49 }; | |
50 | |
51 ExternalPolicyDataUpdater::FetchSuccessCallback | |
52 MockFetchSuccessCallbackListener::CreateCallback(const std::string& key) { | |
53 return base::Bind(&MockFetchSuccessCallbackListener::OnFetchSuccess, | |
54 base::Unretained(this), | |
55 key); | |
56 } | |
57 | |
58 } // namespace | |
59 | |
60 class ExternalPolicyDataUpdaterTest : public testing::Test { | |
61 protected: | |
62 virtual void SetUp() OVERRIDE; | |
63 | |
64 void CreateUpdater(size_t max_parallel_fetches); | |
65 ExternalPolicyDataUpdater::Request CreateRequest( | |
66 const std::string& url) const; | |
67 void RequestExternalDataFetch(int key_index, int url_index); | |
68 void RequestExternalDataFetch(int index); | |
69 | |
70 net::TestURLFetcherFactory fetcher_factory_; | |
71 MockFetchSuccessCallbackListener callback_listener_; | |
72 scoped_refptr<base::TestSimpleTaskRunner> backend_task_runner_; | |
73 scoped_refptr<base::TestSimpleTaskRunner> io_task_runner_; | |
74 scoped_ptr<ExternalPolicyDataFetcherBackend> fetcher_backend_; | |
75 scoped_ptr<ExternalPolicyDataUpdater> updater_; | |
76 }; | |
77 | |
78 void ExternalPolicyDataUpdaterTest::SetUp() { | |
79 fetcher_factory_.set_remove_fetcher_on_delete(true); | |
80 backend_task_runner_ = new base::TestSimpleTaskRunner(); | |
81 io_task_runner_ = new base::TestSimpleTaskRunner(); | |
82 } | |
83 | |
84 void ExternalPolicyDataUpdaterTest::CreateUpdater(size_t max_parallel_fetches) { | |
85 fetcher_backend_.reset(new ExternalPolicyDataFetcherBackend( | |
86 io_task_runner_, | |
87 scoped_refptr<net::URLRequestContextGetter>())); | |
88 updater_.reset(new ExternalPolicyDataUpdater( | |
89 backend_task_runner_, | |
90 fetcher_backend_->CreateFrontend(backend_task_runner_), | |
91 max_parallel_fetches)); | |
92 } | |
93 | |
94 void ExternalPolicyDataUpdaterTest::RequestExternalDataFetch(int key_index, | |
95 int url_index) { | |
96 updater_->FetchExternalData( | |
97 kExternalPolicyDataKeys[key_index], | |
98 CreateRequest(kExternalPolicyDataURLs[url_index]), | |
99 callback_listener_.CreateCallback(kExternalPolicyDataKeys[key_index])); | |
100 io_task_runner_->RunUntilIdle(); | |
101 backend_task_runner_->RunPendingTasks(); | |
102 } | |
103 | |
104 void ExternalPolicyDataUpdaterTest::RequestExternalDataFetch(int index) { | |
105 RequestExternalDataFetch(index, index); | |
106 } | |
107 | |
108 ExternalPolicyDataUpdater::Request | |
109 ExternalPolicyDataUpdaterTest::CreateRequest(const std::string& url) const { | |
110 return ExternalPolicyDataUpdater::Request( | |
111 url, | |
112 base::SHA1HashString(kExternalPolicyDataPayload), | |
113 kExternalPolicyDataMaxSize); | |
114 } | |
115 | |
116 TEST_F(ExternalPolicyDataUpdaterTest, FetchSuccess) { | |
117 // Create an updater that runs one fetch at a time. | |
118 CreateUpdater(1); | |
119 | |
120 // Make two fetch requests. | |
121 RequestExternalDataFetch(0); | |
122 RequestExternalDataFetch(1); | |
123 | |
124 // Verify that the second fetch has not been started yet. | |
125 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
126 | |
127 // Verify that the first fetch has been started. | |
128 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
129 ASSERT_TRUE(fetcher); | |
130 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
131 | |
132 // Complete the first fetch. | |
133 fetcher->set_response_code(200); | |
134 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
135 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
136 | |
137 // Accept the data when the callback is invoked. | |
138 EXPECT_CALL(callback_listener_, | |
139 OnFetchSuccess(kExternalPolicyDataKeys[0], | |
140 kExternalPolicyDataPayload)) | |
141 .Times(1) | |
142 .WillOnce(Return(true)); | |
143 backend_task_runner_->RunPendingTasks(); | |
144 Mock::VerifyAndClearExpectations(&callback_listener_); | |
145 io_task_runner_->RunUntilIdle(); | |
146 | |
147 // Verify that the first fetch is no longer running. | |
148 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
149 | |
150 // Verify that the second fetch has been started. | |
151 fetcher = fetcher_factory_.GetFetcherByID(1); | |
152 ASSERT_TRUE(fetcher); | |
153 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
154 | |
155 // Verify that no retries have been scheduled. | |
156 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
157 } | |
158 | |
159 TEST_F(ExternalPolicyDataUpdaterTest, PayloadSizeExceedsLimit) { | |
160 // Create an updater that runs one fetch at a time. | |
161 CreateUpdater(1); | |
162 | |
163 // Make two fetch requests. | |
164 RequestExternalDataFetch(0); | |
165 RequestExternalDataFetch(1); | |
166 | |
167 // Verify that the second fetch has not been started yet. | |
168 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
169 | |
170 // Verify that the first fetch has been started. | |
171 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
172 ASSERT_TRUE(fetcher); | |
173 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
174 | |
175 // Indicate that the payload size will exceed allowed maximum. | |
176 fetcher->delegate()->OnURLFetchDownloadProgress( | |
177 fetcher, | |
178 kExternalPolicyDataMaxSize + 1, | |
179 -1); | |
180 backend_task_runner_->RunPendingTasks(); | |
181 io_task_runner_->RunUntilIdle(); | |
182 | |
183 // Verify that the first fetch is no longer running. | |
184 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
185 | |
186 // Verify that the second fetch has been started. | |
187 fetcher = fetcher_factory_.GetFetcherByID(1); | |
188 ASSERT_TRUE(fetcher); | |
189 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
190 | |
191 // Verify that a retry has been scheduled for the first fetch. | |
192 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
193 } | |
194 | |
195 TEST_F(ExternalPolicyDataUpdaterTest, FetchFailure) { | |
196 // Create an updater that runs one fetch at a time. | |
197 CreateUpdater(1); | |
198 | |
199 // Make two fetch requests. | |
200 RequestExternalDataFetch(0); | |
201 RequestExternalDataFetch(1); | |
202 | |
203 // Verify that the second fetch has not been started yet. | |
204 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
205 | |
206 // Verify that the first fetch has been started. | |
207 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
208 ASSERT_TRUE(fetcher); | |
209 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
210 | |
211 // Make the first fetch fail due to an interrupted connection. | |
212 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, | |
213 net::ERR_NETWORK_CHANGED)); | |
214 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
215 backend_task_runner_->RunPendingTasks(); | |
216 io_task_runner_->RunUntilIdle(); | |
217 | |
218 // Verify that the first fetch is no longer running. | |
219 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
220 | |
221 // Verify that the second fetch has been started. | |
222 fetcher = fetcher_factory_.GetFetcherByID(1); | |
223 ASSERT_TRUE(fetcher); | |
224 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
225 | |
226 // Verify that a retry has been scheduled for the first fetch. | |
227 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
228 } | |
229 | |
230 TEST_F(ExternalPolicyDataUpdaterTest, ServerFailure) { | |
231 // Create an updater that runs one fetch at a time. | |
232 CreateUpdater(1); | |
233 | |
234 // Make two fetch requests. | |
235 RequestExternalDataFetch(0); | |
236 RequestExternalDataFetch(1); | |
237 | |
238 // Verify that the second fetch has not been started yet. | |
239 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
240 | |
241 // Verify that the first fetch has been started. | |
242 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
243 ASSERT_TRUE(fetcher); | |
244 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
245 | |
246 // Make the first fetch fail with a server error. | |
247 fetcher->set_response_code(500); | |
248 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
249 backend_task_runner_->RunPendingTasks(); | |
250 io_task_runner_->RunUntilIdle(); | |
251 | |
252 // Verify that the first fetch is no longer running. | |
253 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
254 | |
255 // Verify that the second fetch has been started. | |
256 fetcher = fetcher_factory_.GetFetcherByID(1); | |
257 ASSERT_TRUE(fetcher); | |
258 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
259 | |
260 // Verify that a retry has been scheduled for the first fetch. | |
261 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
262 } | |
263 | |
264 TEST_F(ExternalPolicyDataUpdaterTest, RetryLimit) { | |
265 // Create an updater that runs one fetch at a time. | |
266 CreateUpdater(1); | |
267 | |
268 // Make a fetch request. | |
269 RequestExternalDataFetch(0); | |
270 | |
271 int fetcher_id = 0; | |
272 | |
273 // Verify that client failures cause the fetch to be retried three times. | |
274 for (int i = 0; i < 3; ++i) { | |
275 // Verify that the fetch has been (re)started. | |
276 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(fetcher_id); | |
277 ASSERT_TRUE(fetcher); | |
278 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
279 | |
280 // Make the fetch fail with a client error. | |
281 fetcher->set_response_code(400); | |
282 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
283 backend_task_runner_->RunPendingTasks(); | |
284 io_task_runner_->RunUntilIdle(); | |
285 | |
286 // Verify that the fetch is no longer running. | |
287 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id)); | |
288 | |
289 // Verify that a retry has been scheduled. | |
290 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
291 | |
292 // Fast-forward time to the scheduled retry. | |
293 backend_task_runner_->RunPendingTasks(); | |
294 io_task_runner_->RunUntilIdle(); | |
295 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
296 ++fetcher_id; | |
297 } | |
298 | |
299 // Verify that the fetch has been restarted. | |
300 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(fetcher_id); | |
301 ASSERT_TRUE(fetcher); | |
302 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
303 | |
304 // Make the fetch fail once more. | |
305 fetcher->set_response_code(400); | |
306 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
307 backend_task_runner_->RunPendingTasks(); | |
308 io_task_runner_->RunUntilIdle(); | |
309 ++fetcher_id; | |
310 | |
311 // Verify that the fetch is no longer running. | |
312 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id)); | |
313 | |
314 // Verify that no further retries have been scheduled. | |
315 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
316 } | |
317 | |
318 TEST_F(ExternalPolicyDataUpdaterTest, RetryWithBackoff) { | |
319 // Create an updater that runs one fetch at a time. | |
320 CreateUpdater(1); | |
321 | |
322 // Make a fetch request. | |
323 RequestExternalDataFetch(0); | |
324 | |
325 base::TimeDelta expected_delay = base::TimeDelta::FromSeconds(60); | |
326 const base::TimeDelta delay_cap = base::TimeDelta::FromHours(12); | |
327 | |
328 int fetcher_id = 0; | |
329 | |
330 // The backoff delay is capped at 12 hours, which is reached after 10 retries: | |
331 // 60 * 2^10 == 61440 > 43200 == 12 * 60 * 60 | |
332 for (int i = 0; i < 20; ++i) { | |
333 // Verify that the fetch has been (re)started. | |
334 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(fetcher_id); | |
335 ASSERT_TRUE(fetcher); | |
336 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
337 | |
338 // Make the fetch fail with a server error. | |
339 fetcher->set_response_code(500); | |
340 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
341 backend_task_runner_->RunPendingTasks(); | |
342 io_task_runner_->RunUntilIdle(); | |
343 | |
344 // Verify that the fetch is no longer running. | |
345 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id)); | |
346 | |
347 // Verify that a retry has been scheduled. | |
348 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
349 | |
350 // Verify that the retry delay has been doubled, with random jitter from 80% | |
351 // to 100%. | |
352 const base::TestPendingTask& task = | |
353 backend_task_runner_->GetPendingTasks().front(); | |
354 EXPECT_GT(task.delay, | |
355 base::TimeDelta::FromMilliseconds( | |
356 0.799 * expected_delay.InMilliseconds())); | |
357 EXPECT_LE(task.delay, expected_delay); | |
358 | |
359 if (i < 10) { | |
360 // The delay cap has not been reached yet. | |
361 EXPECT_LT(expected_delay, delay_cap); | |
362 expected_delay *= 2; | |
363 | |
364 if (i == 9) { | |
365 // The last doubling reached the cap. | |
366 EXPECT_GT(expected_delay, delay_cap); | |
367 expected_delay = delay_cap; | |
368 } | |
369 } | |
370 | |
371 // Fast-forward time to the scheduled retry. | |
372 backend_task_runner_->RunPendingTasks(); | |
373 io_task_runner_->RunUntilIdle(); | |
374 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
375 ++fetcher_id; | |
376 } | |
377 } | |
378 | |
379 TEST_F(ExternalPolicyDataUpdaterTest, HashInvalid) { | |
380 // Create an updater that runs one fetch at a time. | |
381 CreateUpdater(1); | |
382 | |
383 // Make two fetch requests. | |
384 RequestExternalDataFetch(0); | |
385 RequestExternalDataFetch(1); | |
386 | |
387 // Verify that the second fetch has not been started yet. | |
388 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
389 | |
390 // Verify that the first fetch has been started. | |
391 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
392 ASSERT_TRUE(fetcher); | |
393 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
394 | |
395 // Make the first fetch retrieve data whose hash does not match the expected | |
396 // value. | |
397 fetcher->set_response_code(200); | |
398 fetcher->SetResponseString("Invalid external policy data"); | |
399 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
400 backend_task_runner_->RunPendingTasks(); | |
401 io_task_runner_->RunUntilIdle(); | |
402 | |
403 // Verify that the first fetch is no longer running. | |
404 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
405 | |
406 // Verify that the second fetch has been started. | |
407 fetcher = fetcher_factory_.GetFetcherByID(1); | |
408 ASSERT_TRUE(fetcher); | |
409 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
410 | |
411 // Verify that a retry has been scheduled for the first fetch. | |
412 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
413 } | |
414 | |
415 TEST_F(ExternalPolicyDataUpdaterTest, DataRejectedByCallback) { | |
416 // Create an updater that runs one fetch at a time. | |
417 CreateUpdater(1); | |
418 | |
419 // Make a fetch request. | |
420 RequestExternalDataFetch(0); | |
421 | |
422 // Verify that the fetch has been started. | |
423 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
424 ASSERT_TRUE(fetcher); | |
425 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
426 | |
427 // Complete the fetch. | |
428 fetcher->set_response_code(200); | |
429 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
430 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
431 | |
432 // Reject the data when the callback is invoked. | |
433 EXPECT_CALL(callback_listener_, | |
434 OnFetchSuccess(kExternalPolicyDataKeys[0], | |
435 kExternalPolicyDataPayload)) | |
436 .Times(1) | |
437 .WillOnce(Return(false)); | |
438 backend_task_runner_->RunPendingTasks(); | |
439 Mock::VerifyAndClearExpectations(&callback_listener_); | |
440 io_task_runner_->RunUntilIdle(); | |
441 | |
442 // Verify that the fetch is no longer running. | |
443 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
444 | |
445 // Verify that a retry has been scheduled. | |
446 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
447 | |
448 // Fast-forward time to the scheduled retry. | |
449 backend_task_runner_->RunPendingTasks(); | |
450 io_task_runner_->RunUntilIdle(); | |
451 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
452 | |
453 // Verify that the fetch has been restarted. | |
454 fetcher = fetcher_factory_.GetFetcherByID(1); | |
455 ASSERT_TRUE(fetcher); | |
456 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
457 | |
458 // Complete the fetch. | |
459 fetcher->set_response_code(200); | |
460 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
461 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
462 | |
463 // Accept the data when the callback is invoked this time. | |
464 EXPECT_CALL(callback_listener_, | |
465 OnFetchSuccess(kExternalPolicyDataKeys[0], | |
466 kExternalPolicyDataPayload)) | |
467 .Times(1) | |
468 .WillOnce(Return(true)); | |
469 backend_task_runner_->RunPendingTasks(); | |
470 Mock::VerifyAndClearExpectations(&callback_listener_); | |
471 io_task_runner_->RunUntilIdle(); | |
472 | |
473 // Verify that no retries have been scheduled. | |
474 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
475 } | |
476 | |
477 TEST_F(ExternalPolicyDataUpdaterTest, URLChanged) { | |
478 // Create an updater that runs one fetch at a time. | |
479 CreateUpdater(1); | |
480 | |
481 // Make a fetch request. | |
482 RequestExternalDataFetch(0); | |
483 | |
484 // Verify that the fetch has been started. | |
485 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
486 ASSERT_TRUE(fetcher); | |
487 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
488 | |
489 // Make another fetch request with the same key but an updated URL. | |
490 RequestExternalDataFetch(0, 1); | |
491 | |
492 // Verify that the original fetch is no longer running. | |
493 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
494 | |
495 // Verify that a new fetch has been started with the updated URL. | |
496 fetcher = fetcher_factory_.GetFetcherByID(1); | |
497 ASSERT_TRUE(fetcher); | |
498 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
499 | |
500 // Verify that no retries have been scheduled. | |
501 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
502 } | |
503 | |
504 TEST_F(ExternalPolicyDataUpdaterTest, JobInvalidated) { | |
505 // Create an updater that runs one fetch at a time. | |
506 CreateUpdater(1); | |
507 | |
508 // Make two fetch requests. | |
509 RequestExternalDataFetch(0); | |
510 RequestExternalDataFetch(1); | |
511 | |
512 // Verify that the second fetch has not been started yet. | |
513 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
514 | |
515 // Verify that the first fetch has been started. | |
516 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
517 ASSERT_TRUE(fetcher); | |
518 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
519 | |
520 // Make another fetch request with the same key as the second request but an | |
521 // updated URL. | |
522 RequestExternalDataFetch(1, 2); | |
523 | |
524 // Verify that the first fetch is still running. | |
525 fetcher = fetcher_factory_.GetFetcherByID(0); | |
526 ASSERT_TRUE(fetcher); | |
527 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
528 | |
529 // Verify that the second fetch has still not been started. | |
530 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
531 | |
532 // Make the first fetch fail with a server error. | |
533 fetcher->set_response_code(500); | |
534 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
535 backend_task_runner_->RunPendingTasks(); | |
536 io_task_runner_->RunUntilIdle(); | |
537 | |
538 // Verify that the first fetch is no longer running. | |
539 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
540 | |
541 // Verify that the second fetch was invalidated and the third fetch has been | |
542 // started instead. | |
543 fetcher = fetcher_factory_.GetFetcherByID(1); | |
544 ASSERT_TRUE(fetcher); | |
545 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
546 } | |
547 | |
548 TEST_F(ExternalPolicyDataUpdaterTest, FetchCanceled) { | |
549 // Create an updater that runs one fetch at a time. | |
550 CreateUpdater(1); | |
551 | |
552 // Make a fetch request. | |
553 RequestExternalDataFetch(0); | |
554 | |
555 // Verify that the fetch has been started. | |
556 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
557 ASSERT_TRUE(fetcher); | |
558 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
559 | |
560 // Cancel the fetch request. | |
561 updater_->CancelExternalDataFetch(kExternalPolicyDataKeys[0]); | |
562 io_task_runner_->RunUntilIdle(); | |
563 backend_task_runner_->RunPendingTasks(); | |
564 | |
565 // Verify that the fetch is no longer running. | |
566 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
567 | |
568 // Verify that no retries have been scheduled. | |
569 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
570 } | |
571 | |
572 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobs) { | |
573 // Create an updater that runs up to two fetches in parallel. | |
574 CreateUpdater(2); | |
575 | |
576 // Make three fetch requests. | |
577 RequestExternalDataFetch(0); | |
578 RequestExternalDataFetch(1); | |
579 RequestExternalDataFetch(2); | |
580 | |
581 // Verify that the third fetch has not been started yet. | |
582 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
583 | |
584 // Verify that the second fetch has been started. | |
585 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); | |
586 ASSERT_TRUE(fetcher); | |
587 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
588 | |
589 // Verify that the first fetch has been started. | |
590 fetcher = fetcher_factory_.GetFetcherByID(0); | |
591 ASSERT_TRUE(fetcher); | |
592 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
593 | |
594 // Complete the first fetch. | |
595 fetcher->set_response_code(200); | |
596 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
597 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
598 | |
599 // Accept the data when the callback is invoked. | |
600 EXPECT_CALL(callback_listener_, | |
601 OnFetchSuccess(kExternalPolicyDataKeys[0], | |
602 kExternalPolicyDataPayload)) | |
603 .Times(1) | |
604 .WillOnce(Return(true)); | |
605 backend_task_runner_->RunPendingTasks(); | |
606 Mock::VerifyAndClearExpectations(&callback_listener_); | |
607 io_task_runner_->RunUntilIdle(); | |
608 | |
609 // Verify that the first fetch is no longer running. | |
610 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
611 | |
612 // Verify that the third fetch has been started. | |
613 fetcher = fetcher_factory_.GetFetcherByID(2); | |
614 ASSERT_TRUE(fetcher); | |
615 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
616 | |
617 // Verify that the second fetch is still running. | |
618 fetcher = fetcher_factory_.GetFetcherByID(1); | |
619 ASSERT_TRUE(fetcher); | |
620 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
621 | |
622 // Complete the second fetch. | |
623 fetcher->set_response_code(200); | |
624 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
625 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
626 | |
627 // Accept the data when the callback is invoked. | |
628 EXPECT_CALL(callback_listener_, | |
629 OnFetchSuccess(kExternalPolicyDataKeys[1], | |
630 kExternalPolicyDataPayload)) | |
631 .Times(1) | |
632 .WillOnce(Return(true)); | |
633 backend_task_runner_->RunPendingTasks(); | |
634 Mock::VerifyAndClearExpectations(&callback_listener_); | |
635 io_task_runner_->RunUntilIdle(); | |
636 | |
637 // Verify that the second fetch is no longer running. | |
638 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
639 | |
640 // Verify that the third fetch is still running. | |
641 fetcher = fetcher_factory_.GetFetcherByID(2); | |
642 ASSERT_TRUE(fetcher); | |
643 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
644 | |
645 // Complete the third fetch. | |
646 fetcher->set_response_code(200); | |
647 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
648 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
649 | |
650 // Accept the data when the callback is invoked. | |
651 EXPECT_CALL(callback_listener_, | |
652 OnFetchSuccess(kExternalPolicyDataKeys[2], | |
653 kExternalPolicyDataPayload)) | |
654 .Times(1) | |
655 .WillOnce(Return(true)); | |
656 backend_task_runner_->RunPendingTasks(); | |
657 Mock::VerifyAndClearExpectations(&callback_listener_); | |
658 io_task_runner_->RunUntilIdle(); | |
659 | |
660 // Verify that the third fetch is no longer running. | |
661 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
662 | |
663 // Verify that no retries have been scheduled. | |
664 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
665 } | |
666 | |
667 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsFinishingOutOfOrder) { | |
668 // Create an updater that runs up to two fetches in parallel. | |
669 CreateUpdater(2); | |
670 | |
671 // Make three fetch requests. | |
672 RequestExternalDataFetch(0); | |
673 RequestExternalDataFetch(1); | |
674 RequestExternalDataFetch(2); | |
675 | |
676 // Verify that the third fetch has not been started yet. | |
677 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
678 | |
679 // Verify that the first fetch has been started. | |
680 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
681 ASSERT_TRUE(fetcher); | |
682 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
683 | |
684 // Verify that the second fetch has been started. | |
685 fetcher = fetcher_factory_.GetFetcherByID(1); | |
686 ASSERT_TRUE(fetcher); | |
687 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
688 | |
689 // Complete the second fetch. | |
690 fetcher->set_response_code(200); | |
691 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
692 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
693 | |
694 // Accept the data when the callback is invoked. | |
695 EXPECT_CALL(callback_listener_, | |
696 OnFetchSuccess(kExternalPolicyDataKeys[1], | |
697 kExternalPolicyDataPayload)) | |
698 .Times(1) | |
699 .WillOnce(Return(true)); | |
700 backend_task_runner_->RunPendingTasks(); | |
701 Mock::VerifyAndClearExpectations(&callback_listener_); | |
702 io_task_runner_->RunUntilIdle(); | |
703 | |
704 // Verify that the second fetch is no longer running. | |
705 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
706 | |
707 // Verify that the third fetch has been started. | |
708 fetcher = fetcher_factory_.GetFetcherByID(2); | |
709 ASSERT_TRUE(fetcher); | |
710 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
711 | |
712 // Verify that the first fetch is still running. | |
713 fetcher = fetcher_factory_.GetFetcherByID(0); | |
714 ASSERT_TRUE(fetcher); | |
715 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
716 | |
717 // Complete the first fetch. | |
718 fetcher->set_response_code(200); | |
719 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
720 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
721 | |
722 // Accept the data when the callback is invoked. | |
723 EXPECT_CALL(callback_listener_, | |
724 OnFetchSuccess(kExternalPolicyDataKeys[0], | |
725 kExternalPolicyDataPayload)) | |
726 .Times(1) | |
727 .WillOnce(Return(true)); | |
728 backend_task_runner_->RunPendingTasks(); | |
729 Mock::VerifyAndClearExpectations(&callback_listener_); | |
730 io_task_runner_->RunUntilIdle(); | |
731 | |
732 // Verify that the first fetch is no longer running. | |
733 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
734 | |
735 // Verify that the third fetch is still running. | |
736 fetcher = fetcher_factory_.GetFetcherByID(2); | |
737 ASSERT_TRUE(fetcher); | |
738 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
739 | |
740 // Complete the third fetch. | |
741 fetcher->set_response_code(200); | |
742 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
743 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
744 | |
745 // Accept the data when the callback is invoked. | |
746 EXPECT_CALL(callback_listener_, | |
747 OnFetchSuccess(kExternalPolicyDataKeys[2], | |
748 kExternalPolicyDataPayload)) | |
749 .Times(1) | |
750 .WillOnce(Return(true)); | |
751 backend_task_runner_->RunPendingTasks(); | |
752 Mock::VerifyAndClearExpectations(&callback_listener_); | |
753 io_task_runner_->RunUntilIdle(); | |
754 | |
755 // Verify that the third fetch is no longer running. | |
756 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
757 | |
758 // Verify that no retries have been scheduled. | |
759 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
760 } | |
761 | |
762 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithRetry) { | |
763 // Create an updater that runs up to two fetches in parallel. | |
764 CreateUpdater(2); | |
765 | |
766 // Make three fetch requests. | |
767 RequestExternalDataFetch(0); | |
768 RequestExternalDataFetch(1); | |
769 RequestExternalDataFetch(2); | |
770 | |
771 // Verify that the third fetch has not been started yet. | |
772 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
773 | |
774 // Verify that the second fetch has been started. | |
775 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); | |
776 ASSERT_TRUE(fetcher); | |
777 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
778 | |
779 // Verify that the first fetch has been started. | |
780 fetcher = fetcher_factory_.GetFetcherByID(0); | |
781 ASSERT_TRUE(fetcher); | |
782 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
783 | |
784 // Make the first fetch fail with a client error. | |
785 fetcher->set_response_code(400); | |
786 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
787 backend_task_runner_->RunPendingTasks(); | |
788 io_task_runner_->RunUntilIdle(); | |
789 | |
790 // Verify that the first fetch is no longer running. | |
791 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
792 | |
793 // Verify that the third fetch has been started. | |
794 fetcher = fetcher_factory_.GetFetcherByID(2); | |
795 ASSERT_TRUE(fetcher); | |
796 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
797 | |
798 // Verify that a retry has been scheduled for the first fetch. | |
799 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); | |
800 | |
801 // Fast-forward time to the scheduled retry. | |
802 backend_task_runner_->RunPendingTasks(); | |
803 io_task_runner_->RunUntilIdle(); | |
804 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
805 | |
806 // Verify that the first fetch has not been restarted yet. | |
807 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(3)); | |
808 | |
809 // Complete the third fetch. | |
810 fetcher->set_response_code(200); | |
811 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
812 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
813 | |
814 // Accept the data when the callback is invoked. | |
815 EXPECT_CALL(callback_listener_, | |
816 OnFetchSuccess(kExternalPolicyDataKeys[2], | |
817 kExternalPolicyDataPayload)) | |
818 .Times(1) | |
819 .WillOnce(Return(true)); | |
820 backend_task_runner_->RunPendingTasks(); | |
821 Mock::VerifyAndClearExpectations(&callback_listener_); | |
822 io_task_runner_->RunUntilIdle(); | |
823 | |
824 // Verify that the third fetch is no longer running. | |
825 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
826 | |
827 // Verify that the second fetch is still running | |
828 fetcher = fetcher_factory_.GetFetcherByID(1); | |
829 ASSERT_TRUE(fetcher); | |
830 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
831 | |
832 // Verify that the first fetch has been restarted. | |
833 fetcher = fetcher_factory_.GetFetcherByID(3); | |
834 ASSERT_TRUE(fetcher); | |
835 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
836 | |
837 // Verify that no further retries have been scheduled. | |
838 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
839 } | |
840 | |
841 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithCancel) { | |
842 // Create an updater that runs up to two fetches in parallel. | |
843 CreateUpdater(2); | |
844 | |
845 // Make three fetch requests. | |
846 RequestExternalDataFetch(0); | |
847 RequestExternalDataFetch(1); | |
848 RequestExternalDataFetch(2); | |
849 | |
850 // Verify that the third fetch has not been started yet. | |
851 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
852 | |
853 // Verify that the second fetch has been started. | |
854 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); | |
855 ASSERT_TRUE(fetcher); | |
856 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
857 | |
858 // Verify that the first fetch has been started. | |
859 fetcher = fetcher_factory_.GetFetcherByID(0); | |
860 ASSERT_TRUE(fetcher); | |
861 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
862 | |
863 // Cancel the fetch request. | |
864 updater_->CancelExternalDataFetch(kExternalPolicyDataKeys[0]); | |
865 io_task_runner_->RunUntilIdle(); | |
866 backend_task_runner_->RunPendingTasks(); | |
867 | |
868 // Verify that the fetch is no longer running. | |
869 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); | |
870 | |
871 // Verify that the third fetch has been started. | |
872 fetcher = fetcher_factory_.GetFetcherByID(2); | |
873 ASSERT_TRUE(fetcher); | |
874 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
875 | |
876 // Verify that the second fetch is still running. | |
877 fetcher = fetcher_factory_.GetFetcherByID(1); | |
878 ASSERT_TRUE(fetcher); | |
879 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
880 | |
881 // Complete the second fetch. | |
882 fetcher->set_response_code(200); | |
883 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
884 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
885 | |
886 // Accept the data when the callback is invoked. | |
887 EXPECT_CALL(callback_listener_, | |
888 OnFetchSuccess(kExternalPolicyDataKeys[1], | |
889 kExternalPolicyDataPayload)) | |
890 .Times(1) | |
891 .WillOnce(Return(true)); | |
892 backend_task_runner_->RunPendingTasks(); | |
893 Mock::VerifyAndClearExpectations(&callback_listener_); | |
894 io_task_runner_->RunUntilIdle(); | |
895 | |
896 // Verify that the second fetch is no longer running. | |
897 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
898 | |
899 // Verify that the third fetch is still running. | |
900 fetcher = fetcher_factory_.GetFetcherByID(2); | |
901 ASSERT_TRUE(fetcher); | |
902 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
903 | |
904 // Complete the third fetch. | |
905 fetcher->set_response_code(200); | |
906 fetcher->SetResponseString(kExternalPolicyDataPayload); | |
907 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
908 | |
909 // Accept the data when the callback is invoked. | |
910 EXPECT_CALL(callback_listener_, | |
911 OnFetchSuccess(kExternalPolicyDataKeys[2], | |
912 kExternalPolicyDataPayload)) | |
913 .Times(1) | |
914 .WillOnce(Return(true)); | |
915 backend_task_runner_->RunPendingTasks(); | |
916 Mock::VerifyAndClearExpectations(&callback_listener_); | |
917 io_task_runner_->RunUntilIdle(); | |
918 | |
919 // Verify that the third fetch is no longer running. | |
920 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); | |
921 | |
922 // Verify that no retries have been scheduled. | |
923 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); | |
924 } | |
925 | |
926 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithInvalidatedJob) { | |
927 // Create an updater that runs up to two fetches in parallel. | |
928 CreateUpdater(2); | |
929 | |
930 // Make two fetch requests. | |
931 RequestExternalDataFetch(0); | |
932 RequestExternalDataFetch(1); | |
933 | |
934 // Verify that the first fetch has been started. | |
935 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
936 ASSERT_TRUE(fetcher); | |
937 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
938 | |
939 // Verify that the second fetch has been started. | |
940 fetcher = fetcher_factory_.GetFetcherByID(1); | |
941 ASSERT_TRUE(fetcher); | |
942 EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); | |
943 | |
944 // Make another fetch request with the same key as the second request but an | |
945 // updated URL. | |
946 RequestExternalDataFetch(1, 2); | |
947 | |
948 // Verify that the first fetch is still running. | |
949 fetcher = fetcher_factory_.GetFetcherByID(0); | |
950 ASSERT_TRUE(fetcher); | |
951 EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); | |
952 | |
953 // Verify that the second fetch is no longer running. | |
954 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); | |
955 | |
956 // Verify that the third fetch has been started. | |
957 fetcher = fetcher_factory_.GetFetcherByID(2); | |
958 ASSERT_TRUE(fetcher); | |
959 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); | |
960 } | |
961 | |
962 } // namespace policy | |
OLD | NEW |