| 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 |