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 "components/offline_pages/background/request_coordinator.h" | 5 #include "components/offline_pages/background/request_coordinator.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 void WaitingCallbackFunction(bool result) { | 201 void WaitingCallbackFunction(bool result) { |
202 waiter_.Signal(); | 202 waiter_.Signal(); |
203 } | 203 } |
204 | 204 |
205 // Callback for Add requests. | 205 // Callback for Add requests. |
206 void AddRequestDone(RequestQueue::AddRequestResult result, | 206 void AddRequestDone(RequestQueue::AddRequestResult result, |
207 const SavePageRequest& request); | 207 const SavePageRequest& request); |
208 | 208 |
209 // Callback for getting requests. | 209 // Callback for getting requests. |
210 void GetRequestsDone(RequestQueue::GetRequestsResult result, | 210 void GetRequestsDone(RequestQueue::GetRequestsResult result, |
211 const std::vector<SavePageRequest>& requests); | 211 std::vector<std::unique_ptr<SavePageRequest>> requests); |
212 | 212 |
213 // Callback for removing requests. | 213 // Callback for removing requests. |
214 void RemoveRequestsDone( | 214 void RemoveRequestsDone( |
215 const RequestQueue::UpdateMultipleRequestResults& results); | 215 const RequestQueue::UpdateMultipleRequestResults& results); |
216 | 216 |
217 // Callback for getting request statuses. | 217 // Callback for getting request statuses. |
218 void GetQueuedRequestsDone(const std::vector<SavePageRequest>& requests); | 218 void GetQueuedRequestsDone( |
| 219 std::vector<std::unique_ptr<SavePageRequest>> requests); |
219 | 220 |
220 void SendOfflinerDoneCallback(const SavePageRequest& request, | 221 void SendOfflinerDoneCallback(const SavePageRequest& request, |
221 Offliner::RequestStatus status); | 222 Offliner::RequestStatus status); |
222 | 223 |
223 RequestQueue::GetRequestsResult last_get_requests_result() const { | 224 RequestQueue::GetRequestsResult last_get_requests_result() const { |
224 return last_get_requests_result_; | 225 return last_get_requests_result_; |
225 } | 226 } |
226 | 227 |
227 const std::vector<SavePageRequest>& last_requests() const { | 228 const std::vector<std::unique_ptr<SavePageRequest>>& last_requests() const { |
228 return last_requests_; | 229 return last_requests_; |
229 } | 230 } |
230 | 231 |
231 const RequestQueue::UpdateMultipleRequestResults& last_remove_results() | 232 const RequestQueue::UpdateMultipleRequestResults& last_remove_results() |
232 const { | 233 const { |
233 return last_remove_results_; | 234 return last_remove_results_; |
234 } | 235 } |
235 | 236 |
236 void EnableOfflinerCallback(bool enable) { | 237 void EnableOfflinerCallback(bool enable) { |
237 offliner_->enable_callback(enable); | 238 offliner_->enable_callback(enable); |
(...skipping 29 matching lines...) Expand all Loading... |
267 Offliner::RequestStatus last_offlining_status() const { | 268 Offliner::RequestStatus last_offlining_status() const { |
268 return coordinator_->last_offlining_status_; | 269 return coordinator_->last_offlining_status_; |
269 } | 270 } |
270 | 271 |
271 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } | 272 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } |
272 | 273 |
273 ObserverStub observer() { return observer_; } | 274 ObserverStub observer() { return observer_; } |
274 | 275 |
275 private: | 276 private: |
276 RequestQueue::GetRequestsResult last_get_requests_result_; | 277 RequestQueue::GetRequestsResult last_get_requests_result_; |
277 std::vector<SavePageRequest> last_requests_; | |
278 RequestQueue::UpdateMultipleRequestResults last_remove_results_; | 278 RequestQueue::UpdateMultipleRequestResults last_remove_results_; |
| 279 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; |
279 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; | 280 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
280 base::ThreadTaskRunnerHandle task_runner_handle_; | 281 base::ThreadTaskRunnerHandle task_runner_handle_; |
281 std::unique_ptr<RequestCoordinator> coordinator_; | 282 std::unique_ptr<RequestCoordinator> coordinator_; |
282 OfflinerStub* offliner_; | 283 OfflinerStub* offliner_; |
283 base::WaitableEvent waiter_; | 284 base::WaitableEvent waiter_; |
284 ObserverStub observer_; | 285 ObserverStub observer_; |
285 }; | 286 }; |
286 | 287 |
287 RequestCoordinatorTest::RequestCoordinatorTest() | 288 RequestCoordinatorTest::RequestCoordinatorTest() |
288 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), | 289 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), |
(...skipping 20 matching lines...) Expand all Loading... |
309 std::move(scheduler_stub))); | 310 std::move(scheduler_stub))); |
310 coordinator_->AddObserver(&observer_); | 311 coordinator_->AddObserver(&observer_); |
311 } | 312 } |
312 | 313 |
313 void RequestCoordinatorTest::PumpLoop() { | 314 void RequestCoordinatorTest::PumpLoop() { |
314 task_runner_->RunUntilIdle(); | 315 task_runner_->RunUntilIdle(); |
315 } | 316 } |
316 | 317 |
317 void RequestCoordinatorTest::GetRequestsDone( | 318 void RequestCoordinatorTest::GetRequestsDone( |
318 RequestQueue::GetRequestsResult result, | 319 RequestQueue::GetRequestsResult result, |
319 const std::vector<SavePageRequest>& requests) { | 320 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
320 last_get_requests_result_ = result; | 321 last_get_requests_result_ = result; |
321 last_requests_ = requests; | 322 last_requests_ = std::move(requests); |
322 } | 323 } |
323 | 324 |
324 void RequestCoordinatorTest::RemoveRequestsDone( | 325 void RequestCoordinatorTest::RemoveRequestsDone( |
325 const RequestQueue::UpdateMultipleRequestResults& results) { | 326 const RequestQueue::UpdateMultipleRequestResults& results) { |
326 last_remove_results_ = results; | 327 last_remove_results_ = results; |
327 waiter_.Signal(); | 328 waiter_.Signal(); |
328 } | 329 } |
329 | 330 |
330 void RequestCoordinatorTest::GetQueuedRequestsDone( | 331 void RequestCoordinatorTest::GetQueuedRequestsDone( |
331 const std::vector<SavePageRequest>& requests) { | 332 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
332 last_requests_ = requests; | 333 last_requests_ = std::move(requests); |
333 waiter_.Signal(); | 334 waiter_.Signal(); |
334 } | 335 } |
335 | 336 |
336 void RequestCoordinatorTest::AddRequestDone( | 337 void RequestCoordinatorTest::AddRequestDone( |
337 RequestQueue::AddRequestResult result, | 338 RequestQueue::AddRequestResult result, |
338 const SavePageRequest& request) {} | 339 const SavePageRequest& request) {} |
339 | 340 |
340 void RequestCoordinatorTest::SendOfflinerDoneCallback( | 341 void RequestCoordinatorTest::SendOfflinerDoneCallback( |
341 const SavePageRequest& request, Offliner::RequestStatus status) { | 342 const SavePageRequest& request, Offliner::RequestStatus status) { |
342 // Using the fact that the test class is a friend, call to the callback | 343 // Using the fact that the test class is a friend, call to the callback |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 // Expect that a request got placed on the queue. | 386 // Expect that a request got placed on the queue. |
386 coordinator()->queue()->GetRequests( | 387 coordinator()->queue()->GetRequests( |
387 base::Bind(&RequestCoordinatorTest::GetRequestsDone, | 388 base::Bind(&RequestCoordinatorTest::GetRequestsDone, |
388 base::Unretained(this))); | 389 base::Unretained(this))); |
389 | 390 |
390 // Wait for callbacks to finish, both request queue and offliner. | 391 // Wait for callbacks to finish, both request queue and offliner. |
391 PumpLoop(); | 392 PumpLoop(); |
392 | 393 |
393 // Check the request queue is as expected. | 394 // Check the request queue is as expected. |
394 EXPECT_EQ(1UL, last_requests().size()); | 395 EXPECT_EQ(1UL, last_requests().size()); |
395 EXPECT_EQ(kUrl1, last_requests()[0].url()); | 396 EXPECT_EQ(kUrl1, last_requests().at(0)->url()); |
396 EXPECT_EQ(kClientId1, last_requests()[0].client_id()); | 397 EXPECT_EQ(kClientId1, last_requests().at(0)->client_id()); |
397 | 398 |
398 // Expect that the scheduler got notified. | 399 // Expect that the scheduler got notified. |
399 SchedulerStub* scheduler_stub = reinterpret_cast<SchedulerStub*>( | 400 SchedulerStub* scheduler_stub = reinterpret_cast<SchedulerStub*>( |
400 coordinator()->scheduler()); | 401 coordinator()->scheduler()); |
401 EXPECT_TRUE(scheduler_stub->schedule_called()); | 402 EXPECT_TRUE(scheduler_stub->schedule_called()); |
402 EXPECT_EQ(coordinator() | 403 EXPECT_EQ(coordinator() |
403 ->GetTriggerConditions(last_requests()[0].user_requested()) | 404 ->GetTriggerConditions(last_requests()[0]->user_requested()) |
404 .minimum_battery_percentage, | 405 .minimum_battery_percentage, |
405 scheduler_stub->conditions()->minimum_battery_percentage); | 406 scheduler_stub->conditions()->minimum_battery_percentage); |
406 | 407 |
407 // Check that the observer got the notification that a page is available | 408 // Check that the observer got the notification that a page is available |
408 EXPECT_TRUE(observer().added_called()); | 409 EXPECT_TRUE(observer().added_called()); |
409 } | 410 } |
410 | 411 |
411 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestSucceeded) { | 412 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestSucceeded) { |
412 // Add a request to the queue, wait for callbacks to finish. | 413 // Add a request to the queue, wait for callbacks to finish. |
413 offline_pages::SavePageRequest request( | 414 offline_pages::SavePageRequest request( |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 PumpLoop(); | 542 PumpLoop(); |
542 | 543 |
543 // Verify the request is not removed from the queue, and wait for callbacks. | 544 // Verify the request is not removed from the queue, and wait for callbacks. |
544 coordinator()->queue()->GetRequests(base::Bind( | 545 coordinator()->queue()->GetRequests(base::Bind( |
545 &RequestCoordinatorTest::GetRequestsDone, base::Unretained(this))); | 546 &RequestCoordinatorTest::GetRequestsDone, base::Unretained(this))); |
546 PumpLoop(); | 547 PumpLoop(); |
547 | 548 |
548 // Request no longer in the queue (for single attempt policy). | 549 // Request no longer in the queue (for single attempt policy). |
549 EXPECT_EQ(1UL, last_requests().size()); | 550 EXPECT_EQ(1UL, last_requests().size()); |
550 // Verify foreground cancel not counted as an attempt after all. | 551 // Verify foreground cancel not counted as an attempt after all. |
551 const SavePageRequest& found_request = last_requests().front(); | 552 EXPECT_EQ(0L, last_requests().at(0)->completed_attempt_count()); |
552 EXPECT_EQ(0L, found_request.completed_attempt_count()); | |
553 } | 553 } |
554 | 554 |
555 TEST_F(RequestCoordinatorTest, OfflinerDonePrerenderingCancel) { | 555 TEST_F(RequestCoordinatorTest, OfflinerDonePrerenderingCancel) { |
556 // Add a request to the queue, wait for callbacks to finish. | 556 // Add a request to the queue, wait for callbacks to finish. |
557 offline_pages::SavePageRequest request(kRequestId1, kUrl1, kClientId1, | 557 offline_pages::SavePageRequest request(kRequestId1, kUrl1, kClientId1, |
558 base::Time::Now(), kUserRequested); | 558 base::Time::Now(), kUserRequested); |
559 request.MarkAttemptStarted(base::Time::Now()); | 559 request.MarkAttemptStarted(base::Time::Now()); |
560 coordinator()->queue()->AddRequest( | 560 coordinator()->queue()->AddRequest( |
561 request, base::Bind(&RequestCoordinatorTest::AddRequestDone, | 561 request, base::Bind(&RequestCoordinatorTest::AddRequestDone, |
562 base::Unretained(this))); | 562 base::Unretained(this))); |
(...skipping 17 matching lines...) Expand all Loading... |
580 PumpLoop(); | 580 PumpLoop(); |
581 | 581 |
582 // Verify the request is not removed from the queue, and wait for callbacks. | 582 // Verify the request is not removed from the queue, and wait for callbacks. |
583 coordinator()->queue()->GetRequests(base::Bind( | 583 coordinator()->queue()->GetRequests(base::Bind( |
584 &RequestCoordinatorTest::GetRequestsDone, base::Unretained(this))); | 584 &RequestCoordinatorTest::GetRequestsDone, base::Unretained(this))); |
585 PumpLoop(); | 585 PumpLoop(); |
586 | 586 |
587 // Request still in the queue. | 587 // Request still in the queue. |
588 EXPECT_EQ(1UL, last_requests().size()); | 588 EXPECT_EQ(1UL, last_requests().size()); |
589 // Verify prerendering cancel not counted as an attempt after all. | 589 // Verify prerendering cancel not counted as an attempt after all. |
590 const SavePageRequest& found_request = last_requests().front(); | 590 const std::unique_ptr<SavePageRequest>& found_request = |
591 EXPECT_EQ(0L, found_request.completed_attempt_count()); | 591 last_requests().front(); |
| 592 EXPECT_EQ(0L, found_request->completed_attempt_count()); |
592 } | 593 } |
593 | 594 |
594 // If one item completes, and there are no more user requeted items left, | 595 // If one item completes, and there are no more user requeted items left, |
595 // we should make a scheduler entry for a non-user requested item. | 596 // we should make a scheduler entry for a non-user requested item. |
596 TEST_F(RequestCoordinatorTest, RequestNotPickedNonUserRequestedItemsRemain) { | 597 TEST_F(RequestCoordinatorTest, RequestNotPickedNonUserRequestedItemsRemain) { |
597 // Call start processing just to set up a scheduler callback. | 598 // Call start processing just to set up a scheduler callback. |
598 DeviceConditions device_conditions(false, 75, | 599 DeviceConditions device_conditions(false, 75, |
599 net::NetworkChangeNotifier::CONNECTION_3G); | 600 net::NetworkChangeNotifier::CONNECTION_3G); |
600 base::Callback<void(bool)> callback = base::Bind( | 601 base::Callback<void(bool)> callback = base::Bind( |
601 &RequestCoordinatorTest::EmptyCallbackFunction, base::Unretained(this)); | 602 &RequestCoordinatorTest::EmptyCallbackFunction, base::Unretained(this)); |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
880 coordinator()->GetAllRequests(base::Bind( | 881 coordinator()->GetAllRequests(base::Bind( |
881 &RequestCoordinatorTest::GetQueuedRequestsDone, base::Unretained(this))); | 882 &RequestCoordinatorTest::GetQueuedRequestsDone, base::Unretained(this))); |
882 PumpLoop(); | 883 PumpLoop(); |
883 | 884 |
884 // Wait for async get to finish. | 885 // Wait for async get to finish. |
885 WaitForCallback(); | 886 WaitForCallback(); |
886 PumpLoop(); | 887 PumpLoop(); |
887 | 888 |
888 // Check that the statuses found in the callback match what we expect. | 889 // Check that the statuses found in the callback match what we expect. |
889 EXPECT_EQ(2UL, last_requests().size()); | 890 EXPECT_EQ(2UL, last_requests().size()); |
890 EXPECT_EQ(kRequestId1, last_requests().at(0).request_id()); | 891 EXPECT_EQ(kRequestId1, last_requests().at(0)->request_id()); |
891 EXPECT_EQ(kRequestId2, last_requests().at(1).request_id()); | 892 EXPECT_EQ(kRequestId2, last_requests().at(1)->request_id()); |
892 } | 893 } |
893 | 894 |
894 TEST_F(RequestCoordinatorTest, PauseAndResumeObserver) { | 895 TEST_F(RequestCoordinatorTest, PauseAndResumeObserver) { |
895 // Add a request to the queue. | 896 // Add a request to the queue. |
896 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1, | 897 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1, |
897 base::Time::Now(), kUserRequested); | 898 base::Time::Now(), kUserRequested); |
898 coordinator()->queue()->AddRequest( | 899 coordinator()->queue()->AddRequest( |
899 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone, | 900 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone, |
900 base::Unretained(this))); | 901 base::Unretained(this))); |
901 PumpLoop(); | 902 PumpLoop(); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); | 997 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); |
997 | 998 |
998 // Resume the request while connected. | 999 // Resume the request while connected. |
999 coordinator()->ResumeRequests(request_ids); | 1000 coordinator()->ResumeRequests(request_ids); |
1000 EXPECT_FALSE(is_busy()); | 1001 EXPECT_FALSE(is_busy()); |
1001 PumpLoop(); | 1002 PumpLoop(); |
1002 EXPECT_TRUE(is_busy()); | 1003 EXPECT_TRUE(is_busy()); |
1003 } | 1004 } |
1004 | 1005 |
1005 } // namespace offline_pages | 1006 } // namespace offline_pages |
OLD | NEW |