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