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.
5 #include "components/policy/core/common/cloud/external_policy_data_updater.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/test/test_pending_task.h"
13 #include "base/test/test_simple_task_runner.h"
14 #include "base/time/time.h"
15 #include "components/policy/core/common/cloud/external_policy_data_fetcher.h"
16 #include "crypto/sha2.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"
27 using testing::Return;
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";
41 const int64 kExternalPolicyDataMaxSize = 5 * 1024 * 1024; // 5 MB.
43 class MockFetchSuccessCallbackListener {
45 MOCK_METHOD2(OnFetchSuccess, bool(const std::string&, const std::string&));
47 ExternalPolicyDataUpdater::FetchSuccessCallback CreateCallback(
48 const std::string& key);
51 ExternalPolicyDataUpdater::FetchSuccessCallback
52 MockFetchSuccessCallbackListener::CreateCallback(const std::string& key) {
53 return base::Bind(&MockFetchSuccessCallbackListener::OnFetchSuccess,
54 base::Unretained(this),
60 class ExternalPolicyDataUpdaterTest : public testing::Test {
62 void SetUp() override;
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);
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_;
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();
84 void ExternalPolicyDataUpdaterTest::CreateUpdater(size_t max_parallel_fetches) {
85 fetcher_backend_.reset(new ExternalPolicyDataFetcherBackend(
87 scoped_refptr<net::URLRequestContextGetter>()));
88 updater_.reset(new ExternalPolicyDataUpdater(
90 fetcher_backend_->CreateFrontend(backend_task_runner_),
91 max_parallel_fetches));
94 void ExternalPolicyDataUpdaterTest::RequestExternalDataFetch(int key_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();
104 void ExternalPolicyDataUpdaterTest::RequestExternalDataFetch(int index) {
105 RequestExternalDataFetch(index, index);
108 ExternalPolicyDataUpdater::Request
109 ExternalPolicyDataUpdaterTest::CreateRequest(const std::string& url) const {
110 return ExternalPolicyDataUpdater::Request(
112 crypto::SHA256HashString(kExternalPolicyDataPayload),
113 kExternalPolicyDataMaxSize);
116 TEST_F(ExternalPolicyDataUpdaterTest, FetchSuccess) {
117 // Create an updater that runs one fetch at a time.
120 // Make two fetch requests.
121 RequestExternalDataFetch(0);
122 RequestExternalDataFetch(1);
124 // Verify that the second fetch has not been started yet.
125 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
132 // Complete the first fetch.
133 fetcher->set_response_code(200);
134 fetcher->SetResponseString(kExternalPolicyDataPayload);
135 fetcher->delegate()->OnURLFetchComplete(fetcher);
137 // Accept the data when the callback is invoked.
138 EXPECT_CALL(callback_listener_,
139 OnFetchSuccess(kExternalPolicyDataKeys[0],
140 kExternalPolicyDataPayload))
142 .WillOnce(Return(true));
143 backend_task_runner_->RunPendingTasks();
144 Mock::VerifyAndClearExpectations(&callback_listener_);
145 io_task_runner_->RunUntilIdle();
147 // Verify that the first fetch is no longer running.
148 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
155 // Verify that no retries have been scheduled.
156 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
159 TEST_F(ExternalPolicyDataUpdaterTest, PayloadSizeExceedsLimit) {
160 // Create an updater that runs one fetch at a time.
163 // Make two fetch requests.
164 RequestExternalDataFetch(0);
165 RequestExternalDataFetch(1);
167 // Verify that the second fetch has not been started yet.
168 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
175 // Indicate that the payload size will exceed allowed maximum.
176 fetcher->delegate()->OnURLFetchDownloadProgress(
178 kExternalPolicyDataMaxSize + 1,
180 backend_task_runner_->RunPendingTasks();
181 io_task_runner_->RunUntilIdle();
183 // Verify that the first fetch is no longer running.
184 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
191 // Verify that a retry has been scheduled for the first fetch.
192 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
195 TEST_F(ExternalPolicyDataUpdaterTest, FetchFailure) {
196 // Create an updater that runs one fetch at a time.
199 // Make two fetch requests.
200 RequestExternalDataFetch(0);
201 RequestExternalDataFetch(1);
203 // Verify that the second fetch has not been started yet.
204 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
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();
218 // Verify that the first fetch is no longer running.
219 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
226 // Verify that a retry has been scheduled for the first fetch.
227 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
230 TEST_F(ExternalPolicyDataUpdaterTest, ServerFailure) {
231 // Create an updater that runs one fetch at a time.
234 // Make two fetch requests.
235 RequestExternalDataFetch(0);
236 RequestExternalDataFetch(1);
238 // Verify that the second fetch has not been started yet.
239 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
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();
252 // Verify that the first fetch is no longer running.
253 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
260 // Verify that a retry has been scheduled for the first fetch.
261 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
264 TEST_F(ExternalPolicyDataUpdaterTest, RetryLimit) {
265 // Create an updater that runs one fetch at a time.
268 // Make a fetch request.
269 RequestExternalDataFetch(0);
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());
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();
286 // Verify that the fetch is no longer running.
287 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id));
289 // Verify that a retry has been scheduled.
290 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
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());
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());
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();
311 // Verify that the fetch is no longer running.
312 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id));
314 // Verify that no further retries have been scheduled.
315 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
318 TEST_F(ExternalPolicyDataUpdaterTest, RetryWithBackoff) {
319 // Create an updater that runs one fetch at a time.
322 // Make a fetch request.
323 RequestExternalDataFetch(0);
325 base::TimeDelta expected_delay = base::TimeDelta::FromSeconds(60);
326 const base::TimeDelta delay_cap = base::TimeDelta::FromHours(12);
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());
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();
344 // Verify that the fetch is no longer running.
345 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id));
347 // Verify that a retry has been scheduled.
348 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
350 // Verify that the retry delay has been doubled, with random jitter from 80%
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);
360 // The delay cap has not been reached yet.
361 EXPECT_LT(expected_delay, delay_cap);
365 // The last doubling reached the cap.
366 EXPECT_GT(expected_delay, delay_cap);
367 expected_delay = delay_cap;
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());
379 TEST_F(ExternalPolicyDataUpdaterTest, HashInvalid) {
380 // Create an updater that runs one fetch at a time.
383 // Make two fetch requests.
384 RequestExternalDataFetch(0);
385 RequestExternalDataFetch(1);
387 // Verify that the second fetch has not been started yet.
388 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
395 // Make the first fetch retrieve data whose hash does not match the expected
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();
403 // Verify that the first fetch is no longer running.
404 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
411 // Verify that a retry has been scheduled for the first fetch.
412 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
415 TEST_F(ExternalPolicyDataUpdaterTest, DataRejectedByCallback) {
416 // Create an updater that runs one fetch at a time.
419 // Make a fetch request.
420 RequestExternalDataFetch(0);
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());
427 // Complete the fetch.
428 fetcher->set_response_code(200);
429 fetcher->SetResponseString(kExternalPolicyDataPayload);
430 fetcher->delegate()->OnURLFetchComplete(fetcher);
432 // Reject the data when the callback is invoked.
433 EXPECT_CALL(callback_listener_,
434 OnFetchSuccess(kExternalPolicyDataKeys[0],
435 kExternalPolicyDataPayload))
437 .WillOnce(Return(false));
438 backend_task_runner_->RunPendingTasks();
439 Mock::VerifyAndClearExpectations(&callback_listener_);
440 io_task_runner_->RunUntilIdle();
442 // Verify that the fetch is no longer running.
443 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
445 // Verify that a retry has been scheduled.
446 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
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());
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());
458 // Complete the fetch.
459 fetcher->set_response_code(200);
460 fetcher->SetResponseString(kExternalPolicyDataPayload);
461 fetcher->delegate()->OnURLFetchComplete(fetcher);
463 // Accept the data when the callback is invoked this time.
464 EXPECT_CALL(callback_listener_,
465 OnFetchSuccess(kExternalPolicyDataKeys[0],
466 kExternalPolicyDataPayload))
468 .WillOnce(Return(true));
469 backend_task_runner_->RunPendingTasks();
470 Mock::VerifyAndClearExpectations(&callback_listener_);
471 io_task_runner_->RunUntilIdle();
473 // Verify that no retries have been scheduled.
474 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
477 TEST_F(ExternalPolicyDataUpdaterTest, URLChanged) {
478 // Create an updater that runs one fetch at a time.
481 // Make a fetch request.
482 RequestExternalDataFetch(0);
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());
489 // Make another fetch request with the same key but an updated URL.
490 RequestExternalDataFetch(0, 1);
492 // Verify that the original fetch is no longer running.
493 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
500 // Verify that no retries have been scheduled.
501 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
504 TEST_F(ExternalPolicyDataUpdaterTest, JobInvalidated) {
505 // Create an updater that runs one fetch at a time.
508 // Make two fetch requests.
509 RequestExternalDataFetch(0);
510 RequestExternalDataFetch(1);
512 // Verify that the second fetch has not been started yet.
513 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
520 // Make another fetch request with the same key as the second request but an
522 RequestExternalDataFetch(1, 2);
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());
529 // Verify that the second fetch has still not been started.
530 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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();
538 // Verify that the first fetch is no longer running.
539 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
541 // Verify that the second fetch was invalidated and the third fetch has been
543 fetcher = fetcher_factory_.GetFetcherByID(1);
544 ASSERT_TRUE(fetcher);
545 EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL());
548 TEST_F(ExternalPolicyDataUpdaterTest, FetchCanceled) {
549 // Create an updater that runs one fetch at a time.
552 // Make a fetch request.
553 RequestExternalDataFetch(0);
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());
560 // Cancel the fetch request.
561 updater_->CancelExternalDataFetch(kExternalPolicyDataKeys[0]);
562 io_task_runner_->RunUntilIdle();
563 backend_task_runner_->RunPendingTasks();
565 // Verify that the fetch is no longer running.
566 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
568 // Verify that no retries have been scheduled.
569 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
572 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobs) {
573 // Create an updater that runs up to two fetches in parallel.
576 // Make three fetch requests.
577 RequestExternalDataFetch(0);
578 RequestExternalDataFetch(1);
579 RequestExternalDataFetch(2);
581 // Verify that the third fetch has not been started yet.
582 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
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());
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());
594 // Complete the first fetch.
595 fetcher->set_response_code(200);
596 fetcher->SetResponseString(kExternalPolicyDataPayload);
597 fetcher->delegate()->OnURLFetchComplete(fetcher);
599 // Accept the data when the callback is invoked.
600 EXPECT_CALL(callback_listener_,
601 OnFetchSuccess(kExternalPolicyDataKeys[0],
602 kExternalPolicyDataPayload))
604 .WillOnce(Return(true));
605 backend_task_runner_->RunPendingTasks();
606 Mock::VerifyAndClearExpectations(&callback_listener_);
607 io_task_runner_->RunUntilIdle();
609 // Verify that the first fetch is no longer running.
610 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
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());
622 // Complete the second fetch.
623 fetcher->set_response_code(200);
624 fetcher->SetResponseString(kExternalPolicyDataPayload);
625 fetcher->delegate()->OnURLFetchComplete(fetcher);
627 // Accept the data when the callback is invoked.
628 EXPECT_CALL(callback_listener_,
629 OnFetchSuccess(kExternalPolicyDataKeys[1],
630 kExternalPolicyDataPayload))
632 .WillOnce(Return(true));
633 backend_task_runner_->RunPendingTasks();
634 Mock::VerifyAndClearExpectations(&callback_listener_);
635 io_task_runner_->RunUntilIdle();
637 // Verify that the second fetch is no longer running.
638 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
645 // Complete the third fetch.
646 fetcher->set_response_code(200);
647 fetcher->SetResponseString(kExternalPolicyDataPayload);
648 fetcher->delegate()->OnURLFetchComplete(fetcher);
650 // Accept the data when the callback is invoked.
651 EXPECT_CALL(callback_listener_,
652 OnFetchSuccess(kExternalPolicyDataKeys[2],
653 kExternalPolicyDataPayload))
655 .WillOnce(Return(true));
656 backend_task_runner_->RunPendingTasks();
657 Mock::VerifyAndClearExpectations(&callback_listener_);
658 io_task_runner_->RunUntilIdle();
660 // Verify that the third fetch is no longer running.
661 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
663 // Verify that no retries have been scheduled.
664 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
667 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsFinishingOutOfOrder) {
668 // Create an updater that runs up to two fetches in parallel.
671 // Make three fetch requests.
672 RequestExternalDataFetch(0);
673 RequestExternalDataFetch(1);
674 RequestExternalDataFetch(2);
676 // Verify that the third fetch has not been started yet.
677 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
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());
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());
689 // Complete the second fetch.
690 fetcher->set_response_code(200);
691 fetcher->SetResponseString(kExternalPolicyDataPayload);
692 fetcher->delegate()->OnURLFetchComplete(fetcher);
694 // Accept the data when the callback is invoked.
695 EXPECT_CALL(callback_listener_,
696 OnFetchSuccess(kExternalPolicyDataKeys[1],
697 kExternalPolicyDataPayload))
699 .WillOnce(Return(true));
700 backend_task_runner_->RunPendingTasks();
701 Mock::VerifyAndClearExpectations(&callback_listener_);
702 io_task_runner_->RunUntilIdle();
704 // Verify that the second fetch is no longer running.
705 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
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());
717 // Complete the first fetch.
718 fetcher->set_response_code(200);
719 fetcher->SetResponseString(kExternalPolicyDataPayload);
720 fetcher->delegate()->OnURLFetchComplete(fetcher);
722 // Accept the data when the callback is invoked.
723 EXPECT_CALL(callback_listener_,
724 OnFetchSuccess(kExternalPolicyDataKeys[0],
725 kExternalPolicyDataPayload))
727 .WillOnce(Return(true));
728 backend_task_runner_->RunPendingTasks();
729 Mock::VerifyAndClearExpectations(&callback_listener_);
730 io_task_runner_->RunUntilIdle();
732 // Verify that the first fetch is no longer running.
733 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
740 // Complete the third fetch.
741 fetcher->set_response_code(200);
742 fetcher->SetResponseString(kExternalPolicyDataPayload);
743 fetcher->delegate()->OnURLFetchComplete(fetcher);
745 // Accept the data when the callback is invoked.
746 EXPECT_CALL(callback_listener_,
747 OnFetchSuccess(kExternalPolicyDataKeys[2],
748 kExternalPolicyDataPayload))
750 .WillOnce(Return(true));
751 backend_task_runner_->RunPendingTasks();
752 Mock::VerifyAndClearExpectations(&callback_listener_);
753 io_task_runner_->RunUntilIdle();
755 // Verify that the third fetch is no longer running.
756 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
758 // Verify that no retries have been scheduled.
759 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
762 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithRetry) {
763 // Create an updater that runs up to two fetches in parallel.
766 // Make three fetch requests.
767 RequestExternalDataFetch(0);
768 RequestExternalDataFetch(1);
769 RequestExternalDataFetch(2);
771 // Verify that the third fetch has not been started yet.
772 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
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());
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());
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();
790 // Verify that the first fetch is no longer running.
791 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
798 // Verify that a retry has been scheduled for the first fetch.
799 EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size());
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());
806 // Verify that the first fetch has not been restarted yet.
807 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(3));
809 // Complete the third fetch.
810 fetcher->set_response_code(200);
811 fetcher->SetResponseString(kExternalPolicyDataPayload);
812 fetcher->delegate()->OnURLFetchComplete(fetcher);
814 // Accept the data when the callback is invoked.
815 EXPECT_CALL(callback_listener_,
816 OnFetchSuccess(kExternalPolicyDataKeys[2],
817 kExternalPolicyDataPayload))
819 .WillOnce(Return(true));
820 backend_task_runner_->RunPendingTasks();
821 Mock::VerifyAndClearExpectations(&callback_listener_);
822 io_task_runner_->RunUntilIdle();
824 // Verify that the third fetch is no longer running.
825 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
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());
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());
837 // Verify that no further retries have been scheduled.
838 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
841 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithCancel) {
842 // Create an updater that runs up to two fetches in parallel.
845 // Make three fetch requests.
846 RequestExternalDataFetch(0);
847 RequestExternalDataFetch(1);
848 RequestExternalDataFetch(2);
850 // Verify that the third fetch has not been started yet.
851 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
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());
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());
863 // Cancel the fetch request.
864 updater_->CancelExternalDataFetch(kExternalPolicyDataKeys[0]);
865 io_task_runner_->RunUntilIdle();
866 backend_task_runner_->RunPendingTasks();
868 // Verify that the fetch is no longer running.
869 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0));
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());
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());
881 // Complete the second fetch.
882 fetcher->set_response_code(200);
883 fetcher->SetResponseString(kExternalPolicyDataPayload);
884 fetcher->delegate()->OnURLFetchComplete(fetcher);
886 // Accept the data when the callback is invoked.
887 EXPECT_CALL(callback_listener_,
888 OnFetchSuccess(kExternalPolicyDataKeys[1],
889 kExternalPolicyDataPayload))
891 .WillOnce(Return(true));
892 backend_task_runner_->RunPendingTasks();
893 Mock::VerifyAndClearExpectations(&callback_listener_);
894 io_task_runner_->RunUntilIdle();
896 // Verify that the second fetch is no longer running.
897 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
904 // Complete the third fetch.
905 fetcher->set_response_code(200);
906 fetcher->SetResponseString(kExternalPolicyDataPayload);
907 fetcher->delegate()->OnURLFetchComplete(fetcher);
909 // Accept the data when the callback is invoked.
910 EXPECT_CALL(callback_listener_,
911 OnFetchSuccess(kExternalPolicyDataKeys[2],
912 kExternalPolicyDataPayload))
914 .WillOnce(Return(true));
915 backend_task_runner_->RunPendingTasks();
916 Mock::VerifyAndClearExpectations(&callback_listener_);
917 io_task_runner_->RunUntilIdle();
919 // Verify that the third fetch is no longer running.
920 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2));
922 // Verify that no retries have been scheduled.
923 EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty());
926 TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithInvalidatedJob) {
927 // Create an updater that runs up to two fetches in parallel.
930 // Make two fetch requests.
931 RequestExternalDataFetch(0);
932 RequestExternalDataFetch(1);
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());
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());
944 // Make another fetch request with the same key as the second request but an
946 RequestExternalDataFetch(1, 2);
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());
953 // Verify that the second fetch is no longer running.
954 EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1));
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());
962 } // namespace policy