Chromium Code Reviews| 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 12 matching lines...) Expand all Loading... | |
| 23 #include "components/offline_pages/background/request_queue_in_memory_store.h" | 23 #include "components/offline_pages/background/request_queue_in_memory_store.h" |
| 24 #include "components/offline_pages/background/save_page_request.h" | 24 #include "components/offline_pages/background/save_page_request.h" |
| 25 #include "components/offline_pages/background/scheduler.h" | 25 #include "components/offline_pages/background/scheduler.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 27 | 27 |
| 28 namespace offline_pages { | 28 namespace offline_pages { |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 // put test constants here | 31 // put test constants here |
| 32 const GURL kUrl("http://universe.com/everything"); | 32 const GURL kUrl("http://universe.com/everything"); |
| 33 const ClientId kClientId("bookmark", "42"); | 33 const GURL kUrl2("http://universe.com/nothing"); |
| 34 const std::string kClientNamespace("bookmark"); | |
| 35 const std::string kId1("42"); | |
| 36 const std::string kId2("life*universe+everything"); | |
| 37 const ClientId kClientId(kClientNamespace, kId1); | |
| 38 const ClientId kClientId2(kClientNamespace, kId2); | |
| 34 const int kRequestId(1); | 39 const int kRequestId(1); |
| 35 const long kTestTimeoutSeconds = 1; | 40 const long kTestTimeoutSeconds = 1; |
| 36 const long kTestTimeBudgetSeconds = 200; | 41 const long kTestTimeBudgetSeconds = 200; |
| 37 const int kBatteryPercentageHigh = 75; | 42 const int kBatteryPercentageHigh = 75; |
| 38 const bool kPowerRequired = true; | 43 const bool kPowerRequired = true; |
| 39 const bool kUserRequested = true; | 44 const bool kUserRequested = true; |
| 40 const int kAttemptCount = 1; | 45 const int kAttemptCount = 1; |
| 41 } // namespace | 46 } // namespace |
| 42 | 47 |
| 43 class SchedulerStub : public Scheduler { | 48 class SchedulerStub : public Scheduler { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 void PumpLoop(); | 136 void PumpLoop(); |
| 132 | 137 |
| 133 RequestCoordinator* coordinator() { | 138 RequestCoordinator* coordinator() { |
| 134 return coordinator_.get(); | 139 return coordinator_.get(); |
| 135 } | 140 } |
| 136 | 141 |
| 137 bool is_busy() { | 142 bool is_busy() { |
| 138 return coordinator_->is_busy(); | 143 return coordinator_->is_busy(); |
| 139 } | 144 } |
| 140 | 145 |
| 141 // Empty callback function | 146 // Empty callback function. |
| 142 void EmptyCallbackFunction(bool result) { | 147 void EmptyCallbackFunction(bool result) { |
| 143 } | 148 } |
| 144 | 149 |
| 145 // Callback function which releases a wait for it. | 150 // Callback function which releases a wait for it. |
| 146 void WaitingCallbackFunction(bool result) { | 151 void WaitingCallbackFunction(bool result) { |
| 147 waiter_.Signal(); | 152 waiter_.Signal(); |
| 148 } | 153 } |
| 149 | 154 |
| 150 // Callback for Add requests | 155 // Callback for Add requests. |
| 151 void AddRequestDone(RequestQueue::AddRequestResult result, | 156 void AddRequestDone(RequestQueue::AddRequestResult result, |
| 152 const SavePageRequest& request); | 157 const SavePageRequest& request); |
| 153 | 158 |
| 154 // Callback for getting requests. | 159 // Callback for getting requests. |
| 155 void GetRequestsDone(RequestQueue::GetRequestsResult result, | 160 void GetRequestsDone(RequestQueue::GetRequestsResult result, |
| 156 const std::vector<SavePageRequest>& requests); | 161 const std::vector<SavePageRequest>& requests); |
| 157 | 162 |
| 163 // Callback for getting request statuses. | |
| 164 void GetQueuedRequestsDone(const std::vector<ClientId>& statuses); | |
|
dougarnett
2016/08/03 04:27:19
statuses => client_ids
Pete Williamson
2016/08/03 20:13:45
Done.
| |
| 165 | |
| 158 void SendOfflinerDoneCallback(const SavePageRequest& request, | 166 void SendOfflinerDoneCallback(const SavePageRequest& request, |
| 159 Offliner::RequestStatus status); | 167 Offliner::RequestStatus status); |
| 160 | 168 |
| 161 RequestQueue::GetRequestsResult last_get_requests_result() const { | 169 RequestQueue::GetRequestsResult last_get_requests_result() const { |
| 162 return last_get_requests_result_; | 170 return last_get_requests_result_; |
| 163 } | 171 } |
| 164 | 172 |
| 165 const std::vector<SavePageRequest>& last_requests() const { | 173 const std::vector<SavePageRequest>& last_requests() const { |
| 166 return last_requests_; | 174 return last_requests_; |
| 167 } | 175 } |
| 168 | 176 |
| 177 const std::vector<ClientId>& last_client_ids() const { | |
| 178 return last_client_ids_; | |
| 179 } | |
| 180 | |
| 169 void EnableOfflinerCallback(bool enable) { | 181 void EnableOfflinerCallback(bool enable) { |
| 170 offliner_->enable_callback(enable); | 182 offliner_->enable_callback(enable); |
| 171 } | 183 } |
| 172 | 184 |
| 173 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { | 185 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { |
| 174 coordinator_->SetOfflinerTimeoutForTest(timeout); | 186 coordinator_->SetOfflinerTimeoutForTest(timeout); |
| 175 } | 187 } |
| 176 | 188 |
| 177 void SetDeviceConditionsForTest(DeviceConditions device_conditions) { | 189 void SetDeviceConditionsForTest(DeviceConditions device_conditions) { |
| 178 coordinator_->SetDeviceConditionsForTest(device_conditions); | 190 coordinator_->SetDeviceConditionsForTest(device_conditions); |
| 179 } | 191 } |
| 180 | 192 |
| 181 void WaitForCallback() { | 193 void WaitForCallback() { |
| 182 waiter_.Wait(); | 194 waiter_.Wait(); |
| 183 } | 195 } |
| 184 | 196 |
| 185 void AdvanceClockBy(base::TimeDelta delta) { | 197 void AdvanceClockBy(base::TimeDelta delta) { |
| 186 task_runner_->FastForwardBy(delta); | 198 task_runner_->FastForwardBy(delta); |
| 187 } | 199 } |
| 188 | 200 |
| 189 Offliner::RequestStatus last_offlining_status() const { | 201 Offliner::RequestStatus last_offlining_status() const { |
| 190 return coordinator_->last_offlining_status_; | 202 return coordinator_->last_offlining_status_; |
| 191 } | 203 } |
| 192 | 204 |
| 193 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } | 205 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } |
| 194 | 206 |
| 195 private: | 207 private: |
| 196 RequestQueue::GetRequestsResult last_get_requests_result_; | 208 RequestQueue::GetRequestsResult last_get_requests_result_; |
| 197 std::vector<SavePageRequest> last_requests_; | 209 std::vector<SavePageRequest> last_requests_; |
| 210 std::vector<ClientId> last_client_ids_; | |
| 198 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; | 211 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
| 199 base::ThreadTaskRunnerHandle task_runner_handle_; | 212 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 200 std::unique_ptr<RequestCoordinator> coordinator_; | 213 std::unique_ptr<RequestCoordinator> coordinator_; |
| 201 OfflinerStub* offliner_; | 214 OfflinerStub* offliner_; |
| 202 base::WaitableEvent waiter_; | 215 base::WaitableEvent waiter_; |
| 203 }; | 216 }; |
| 204 | 217 |
| 205 RequestCoordinatorTest::RequestCoordinatorTest() | 218 RequestCoordinatorTest::RequestCoordinatorTest() |
| 206 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), | 219 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), |
| 207 task_runner_(new base::TestMockTimeTaskRunner), | 220 task_runner_(new base::TestMockTimeTaskRunner), |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 231 task_runner_->RunUntilIdle(); | 244 task_runner_->RunUntilIdle(); |
| 232 } | 245 } |
| 233 | 246 |
| 234 void RequestCoordinatorTest::GetRequestsDone( | 247 void RequestCoordinatorTest::GetRequestsDone( |
| 235 RequestQueue::GetRequestsResult result, | 248 RequestQueue::GetRequestsResult result, |
| 236 const std::vector<SavePageRequest>& requests) { | 249 const std::vector<SavePageRequest>& requests) { |
| 237 last_get_requests_result_ = result; | 250 last_get_requests_result_ = result; |
| 238 last_requests_ = requests; | 251 last_requests_ = requests; |
| 239 } | 252 } |
| 240 | 253 |
| 254 void RequestCoordinatorTest::GetQueuedRequestsDone( | |
| 255 const std::vector<ClientId>& client_ids) { | |
| 256 last_client_ids_ = client_ids; | |
| 257 waiter_.Signal(); | |
| 258 } | |
| 259 | |
| 241 void RequestCoordinatorTest::AddRequestDone( | 260 void RequestCoordinatorTest::AddRequestDone( |
| 242 RequestQueue::AddRequestResult result, | 261 RequestQueue::AddRequestResult result, |
| 243 const SavePageRequest& request) {} | 262 const SavePageRequest& request) {} |
| 244 | 263 |
| 245 void RequestCoordinatorTest::SendOfflinerDoneCallback( | 264 void RequestCoordinatorTest::SendOfflinerDoneCallback( |
| 246 const SavePageRequest& request, Offliner::RequestStatus status) { | 265 const SavePageRequest& request, Offliner::RequestStatus status) { |
| 247 // Using the fact that the test class is a friend, call to the callback | 266 // Using the fact that the test class is a friend, call to the callback |
| 248 coordinator_->OfflinerDoneCallback(request, status); | 267 coordinator_->OfflinerDoneCallback(request, status); |
| 249 } | 268 } |
| 250 | 269 |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 509 // which won't time out immediately, so the watchdog thread doesn't kill valid | 528 // which won't time out immediately, so the watchdog thread doesn't kill valid |
| 510 // tasks too soon. | 529 // tasks too soon. |
| 511 WaitForCallback(); | 530 WaitForCallback(); |
| 512 PumpLoop(); | 531 PumpLoop(); |
| 513 | 532 |
| 514 EXPECT_TRUE(OfflinerWasCanceled()); | 533 EXPECT_TRUE(OfflinerWasCanceled()); |
| 515 EXPECT_EQ(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED, | 534 EXPECT_EQ(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED, |
| 516 last_offlining_status()); | 535 last_offlining_status()); |
| 517 } | 536 } |
| 518 | 537 |
| 519 | |
| 520 TEST_F(RequestCoordinatorTest, TimeBudgetExceeded) { | 538 TEST_F(RequestCoordinatorTest, TimeBudgetExceeded) { |
| 521 // Build a request to use with the pre-renderer, and put it on the queue. | 539 // Build two requests to use with the pre-renderer, and put it on the queue. |
| 522 offline_pages::SavePageRequest request1( | 540 offline_pages::SavePageRequest request1( |
| 523 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); | 541 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 524 offline_pages::SavePageRequest request2( | 542 offline_pages::SavePageRequest request2( |
| 525 kRequestId + 1, kUrl, kClientId, base::Time::Now(), kUserRequested); | 543 kRequestId + 1, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 526 request2.set_attempt_count(kAttemptCount); | 544 request2.set_attempt_count(kAttemptCount); |
| 527 coordinator()->queue()->AddRequest( | 545 coordinator()->queue()->AddRequest( |
| 528 request1, | 546 request1, |
| 529 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 547 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 530 base::Unretained(this))); | 548 base::Unretained(this))); |
| 531 coordinator()->queue()->AddRequest( | 549 coordinator()->queue()->AddRequest( |
| 532 request1, | 550 request1, // TODO(petewil): This is a bug, should be request2. |
| 533 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 551 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 534 base::Unretained(this))); | 552 base::Unretained(this))); |
| 535 PumpLoop(); | 553 PumpLoop(); |
| 536 | 554 |
| 537 // Set up for the call to StartProcessing. | 555 // Set up for the call to StartProcessing. |
| 538 DeviceConditions device_conditions( | 556 DeviceConditions device_conditions( |
| 539 !kPowerRequired, kBatteryPercentageHigh, | 557 !kPowerRequired, kBatteryPercentageHigh, |
| 540 net::NetworkChangeNotifier::CONNECTION_3G); | 558 net::NetworkChangeNotifier::CONNECTION_3G); |
| 541 base::Callback<void(bool)> callback = | 559 base::Callback<void(bool)> callback = |
| 542 base::Bind(&RequestCoordinatorTest::WaitingCallbackFunction, | 560 base::Bind(&RequestCoordinatorTest::WaitingCallbackFunction, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 556 // Verify the request gets removed from the queue, and wait for callbacks. | 574 // Verify the request gets removed from the queue, and wait for callbacks. |
| 557 coordinator()->queue()->GetRequests( | 575 coordinator()->queue()->GetRequests( |
| 558 base::Bind(&RequestCoordinatorTest::GetRequestsDone, | 576 base::Bind(&RequestCoordinatorTest::GetRequestsDone, |
| 559 base::Unretained(this))); | 577 base::Unretained(this))); |
| 560 PumpLoop(); | 578 PumpLoop(); |
| 561 | 579 |
| 562 // We should find one request in the queue. | 580 // We should find one request in the queue. |
| 563 EXPECT_EQ(1UL, last_requests().size()); | 581 EXPECT_EQ(1UL, last_requests().size()); |
| 564 } | 582 } |
| 565 | 583 |
| 584 TEST_F(RequestCoordinatorTest, GetQueuedRequests) { | |
| 585 // Add two requests to the queue. | |
| 586 offline_pages::SavePageRequest request1(kRequestId, kUrl, kClientId, | |
| 587 base::Time::Now(), kUserRequested); | |
| 588 offline_pages::SavePageRequest request2(kRequestId + 1, kUrl2, kClientId2, | |
| 589 base::Time::Now(), kUserRequested); | |
| 590 coordinator()->queue()->AddRequest( | |
| 591 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone, | |
| 592 base::Unretained(this))); | |
| 593 coordinator()->queue()->AddRequest( | |
| 594 request2, base::Bind(&RequestCoordinatorTest::AddRequestDone, | |
| 595 base::Unretained(this))); | |
| 596 PumpLoop(); | |
| 597 | |
| 598 // Start the async status fetching. | |
| 599 coordinator()->GetQueuedRequests( | |
| 600 kClientNamespace, | |
| 601 base::Bind(&RequestCoordinatorTest::GetQueuedRequestsDone, | |
| 602 base::Unretained(this))); | |
| 603 PumpLoop(); | |
| 604 | |
| 605 // Wait for async get to finish. | |
| 606 WaitForCallback(); | |
| 607 PumpLoop(); | |
| 608 | |
| 609 // Check that the statuses found in the callback match what we expect. | |
| 610 EXPECT_EQ(2UL, last_client_ids().size()); | |
| 611 EXPECT_EQ(kId1, last_client_ids().at(0).id); | |
| 612 EXPECT_EQ(kId2, last_client_ids().at(1).id); | |
| 613 } | |
| 614 | |
| 566 } // namespace offline_pages | 615 } // namespace offline_pages |
| OLD | NEW |