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