Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1066)

Side by Side Diff: components/offline_pages/background/request_coordinator_unittest.cc

Issue 2202113002: API to provide status of save page reqeusts to API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698