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

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

Issue 2219393004: Adds an observer for the request coordinator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@resumeAPI
Patch Set: CR feedback per Dimich - Changed return values 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 if (offliner_.get() == nullptr) { 119 if (offliner_.get() == nullptr) {
120 offliner_.reset(new OfflinerStub()); 120 offliner_.reset(new OfflinerStub());
121 } 121 }
122 return offliner_.get(); 122 return offliner_.get();
123 } 123 }
124 124
125 private: 125 private:
126 std::unique_ptr<OfflinerStub> offliner_; 126 std::unique_ptr<OfflinerStub> offliner_;
127 }; 127 };
128 128
129 class ObserverStub : public RequestCoordinator::Observer {
130 public:
131 ObserverStub()
132 : added_called_(false),
133 succeeded_called_(false),
134 failed_called_(false),
135 changed_called_(false),
136 removed_called_(false),
137 state_(SavePageRequest::RequestState::PRERENDERING) {}
138
139 void Clear() {
140 added_called_ = false;
141 succeeded_called_ = false;
142 failed_called_ = false;
143 changed_called_ = false;
144 removed_called_ = false;
145 state_ = SavePageRequest::RequestState::PRERENDERING;
146 }
147
148 void OnAdded(const SavePageRequest& request) override {
149 added_called_ = true;
150 }
151
152 void OnSucceeded(const SavePageRequest& request) override {
153 succeeded_called_ = true;
154 }
155
156 void OnFailed(const SavePageRequest& request,
157 RequestCoordinator::SavePageStatus status) override {
158 failed_called_ = true;
159 }
160
161 void OnChanged(const SavePageRequest& request) override {
162 changed_called_ = true;
163 state_ = request.request_state();
164 }
165
166 void OnRemoved(const SavePageRequest& request,
167 RequestCoordinator::SavePageStatus status) override {
168 removed_called_ = true;
169 }
170
171 bool added_called() { return added_called_; }
172 bool succeeded_called() { return succeeded_called_; }
173 bool failed_called() { return failed_called_; }
174 bool changed_called() { return changed_called_; }
175 bool removed_called() { return removed_called_; }
176 SavePageRequest::RequestState state() { return state_; }
177
178 private:
179 bool added_called_;
180 bool succeeded_called_;
181 bool failed_called_;
182 bool changed_called_;
183 bool removed_called_;
184 SavePageRequest::RequestState state_;
185 };
186
129 class RequestCoordinatorTest 187 class RequestCoordinatorTest
130 : public testing::Test { 188 : public testing::Test {
131 public: 189 public:
132 RequestCoordinatorTest(); 190 RequestCoordinatorTest();
133 ~RequestCoordinatorTest() override; 191 ~RequestCoordinatorTest() override;
134 192
135 void SetUp() override; 193 void SetUp() override;
136 194
137 void PumpLoop(); 195 void PumpLoop();
138 196
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 void AdvanceClockBy(base::TimeDelta delta) { 252 void AdvanceClockBy(base::TimeDelta delta) {
195 task_runner_->FastForwardBy(delta); 253 task_runner_->FastForwardBy(delta);
196 } 254 }
197 255
198 Offliner::RequestStatus last_offlining_status() const { 256 Offliner::RequestStatus last_offlining_status() const {
199 return coordinator_->last_offlining_status_; 257 return coordinator_->last_offlining_status_;
200 } 258 }
201 259
202 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } 260 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); }
203 261
262 ObserverStub observer() { return observer_; }
263
204 private: 264 private:
205 RequestQueue::GetRequestsResult last_get_requests_result_; 265 RequestQueue::GetRequestsResult last_get_requests_result_;
206 std::vector<SavePageRequest> last_requests_; 266 std::vector<SavePageRequest> last_requests_;
207 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; 267 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
208 base::ThreadTaskRunnerHandle task_runner_handle_; 268 base::ThreadTaskRunnerHandle task_runner_handle_;
209 std::unique_ptr<RequestCoordinator> coordinator_; 269 std::unique_ptr<RequestCoordinator> coordinator_;
210 OfflinerStub* offliner_; 270 OfflinerStub* offliner_;
211 base::WaitableEvent waiter_; 271 base::WaitableEvent waiter_;
272 ObserverStub observer_;
212 }; 273 };
213 274
214 RequestCoordinatorTest::RequestCoordinatorTest() 275 RequestCoordinatorTest::RequestCoordinatorTest()
215 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), 276 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE),
216 task_runner_(new base::TestMockTimeTaskRunner), 277 task_runner_(new base::TestMockTimeTaskRunner),
217 task_runner_handle_(task_runner_), 278 task_runner_handle_(task_runner_),
218 offliner_(nullptr), 279 offliner_(nullptr),
219 waiter_(base::WaitableEvent::ResetPolicy::MANUAL, 280 waiter_(base::WaitableEvent::ResetPolicy::MANUAL,
220 base::WaitableEvent::InitialState::NOT_SIGNALED) {} 281 base::WaitableEvent::InitialState::NOT_SIGNALED) {}
221 282
222 RequestCoordinatorTest::~RequestCoordinatorTest() {} 283 RequestCoordinatorTest::~RequestCoordinatorTest() {}
223 284
224 void RequestCoordinatorTest::SetUp() { 285 void RequestCoordinatorTest::SetUp() {
225 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy()); 286 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy());
226 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub()); 287 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub());
227 // Save the offliner for use by the tests. 288 // Save the offliner for use by the tests.
228 offliner_ = 289 offliner_ =
229 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get())); 290 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get()));
230 std::unique_ptr<RequestQueueInMemoryStore> 291 std::unique_ptr<RequestQueueInMemoryStore>
231 store(new RequestQueueInMemoryStore()); 292 store(new RequestQueueInMemoryStore());
232 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store))); 293 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store)));
233 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub()); 294 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub());
234 coordinator_.reset(new RequestCoordinator( 295 coordinator_.reset(new RequestCoordinator(
235 std::move(policy), std::move(factory), std::move(queue), 296 std::move(policy), std::move(factory), std::move(queue),
236 std::move(scheduler_stub))); 297 std::move(scheduler_stub)));
298 coordinator_->AddObserver(&observer_);
237 } 299 }
238 300
239 void RequestCoordinatorTest::PumpLoop() { 301 void RequestCoordinatorTest::PumpLoop() {
240 task_runner_->RunUntilIdle(); 302 task_runner_->RunUntilIdle();
241 } 303 }
242 304
243 void RequestCoordinatorTest::GetRequestsDone( 305 void RequestCoordinatorTest::GetRequestsDone(
244 RequestQueue::GetRequestsResult result, 306 RequestQueue::GetRequestsResult result,
245 const std::vector<SavePageRequest>& requests) { 307 const std::vector<SavePageRequest>& requests) {
246 last_get_requests_result_ = result; 308 last_get_requests_result_ = result;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 EXPECT_EQ(kClientId1, last_requests()[0].client_id()); 376 EXPECT_EQ(kClientId1, last_requests()[0].client_id());
315 377
316 // Expect that the scheduler got notified. 378 // Expect that the scheduler got notified.
317 SchedulerStub* scheduler_stub = reinterpret_cast<SchedulerStub*>( 379 SchedulerStub* scheduler_stub = reinterpret_cast<SchedulerStub*>(
318 coordinator()->scheduler()); 380 coordinator()->scheduler());
319 EXPECT_TRUE(scheduler_stub->schedule_called()); 381 EXPECT_TRUE(scheduler_stub->schedule_called());
320 EXPECT_EQ(coordinator() 382 EXPECT_EQ(coordinator()
321 ->GetTriggerConditionsForUserRequest() 383 ->GetTriggerConditionsForUserRequest()
322 .minimum_battery_percentage, 384 .minimum_battery_percentage,
323 scheduler_stub->conditions()->minimum_battery_percentage); 385 scheduler_stub->conditions()->minimum_battery_percentage);
386
387 // Check that the observer got the notification that a page is available
388 EXPECT_TRUE(observer().added_called());
324 } 389 }
325 390
326 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestSucceeded) { 391 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestSucceeded) {
327 // Add a request to the queue, wait for callbacks to finish. 392 // Add a request to the queue, wait for callbacks to finish.
328 offline_pages::SavePageRequest request( 393 offline_pages::SavePageRequest request(
329 kRequestId1, kUrl1, kClientId1, base::Time::Now(), kUserRequested); 394 kRequestId1, kUrl1, kClientId1, base::Time::Now(), kUserRequested);
330 request.MarkAttemptStarted(base::Time::Now()); 395 request.MarkAttemptStarted(base::Time::Now());
331 coordinator()->queue()->AddRequest( 396 coordinator()->queue()->AddRequest(
332 request, 397 request,
333 base::Bind(&RequestCoordinatorTest::AddRequestDone, 398 base::Bind(&RequestCoordinatorTest::AddRequestDone,
(...skipping 21 matching lines...) Expand all
355 // Verify the request gets removed from the queue, and wait for callbacks. 420 // Verify the request gets removed from the queue, and wait for callbacks.
356 coordinator()->queue()->GetRequests( 421 coordinator()->queue()->GetRequests(
357 base::Bind(&RequestCoordinatorTest::GetRequestsDone, 422 base::Bind(&RequestCoordinatorTest::GetRequestsDone,
358 base::Unretained(this))); 423 base::Unretained(this)));
359 PumpLoop(); 424 PumpLoop();
360 425
361 // We should not find any requests in the queue anymore. 426 // We should not find any requests in the queue anymore.
362 // RequestPicker should *not* have tried to start an additional job, 427 // RequestPicker should *not* have tried to start an additional job,
363 // because the request queue is empty now. 428 // because the request queue is empty now.
364 EXPECT_EQ(0UL, last_requests().size()); 429 EXPECT_EQ(0UL, last_requests().size());
430 // Check that the observer got the notification that we succeeded.
431 EXPECT_TRUE(observer().succeeded_called());
365 } 432 }
366 433
367 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestFailed) { 434 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestFailed) {
368 // Add a request to the queue, wait for callbacks to finish. 435 // Add a request to the queue, wait for callbacks to finish.
369 offline_pages::SavePageRequest request( 436 offline_pages::SavePageRequest request(
370 kRequestId1, kUrl1, kClientId1, base::Time::Now(), kUserRequested); 437 kRequestId1, kUrl1, kClientId1, base::Time::Now(), kUserRequested);
371 request.MarkAttemptStarted(base::Time::Now()); 438 request.MarkAttemptStarted(base::Time::Now());
372 coordinator()->queue()->AddRequest( 439 coordinator()->queue()->AddRequest(
373 request, 440 request,
374 base::Bind(&RequestCoordinatorTest::AddRequestDone, 441 base::Bind(&RequestCoordinatorTest::AddRequestDone,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 476
410 // Verify neither request is removed from the queue; wait for callbacks. 477 // Verify neither request is removed from the queue; wait for callbacks.
411 coordinator()->queue()->GetRequests( 478 coordinator()->queue()->GetRequests(
412 base::Bind(&RequestCoordinatorTest::GetRequestsDone, 479 base::Bind(&RequestCoordinatorTest::GetRequestsDone,
413 base::Unretained(this))); 480 base::Unretained(this)));
414 PumpLoop(); 481 PumpLoop();
415 482
416 // Now just one request in the queue since failed request removed 483 // Now just one request in the queue since failed request removed
417 // (for single attempt policy). 484 // (for single attempt policy).
418 EXPECT_EQ(1UL, last_requests().size()); 485 EXPECT_EQ(1UL, last_requests().size());
486 // Check that the observer got the notification that we failed
487 EXPECT_TRUE(observer().failed_called());
419 } 488 }
420 489
421 TEST_F(RequestCoordinatorTest, OfflinerDoneForegroundCancel) { 490 TEST_F(RequestCoordinatorTest, OfflinerDoneForegroundCancel) {
422 // Add a request to the queue, wait for callbacks to finish. 491 // Add a request to the queue, wait for callbacks to finish.
423 offline_pages::SavePageRequest request( 492 offline_pages::SavePageRequest request(
424 kRequestId1, kUrl1, kClientId1, base::Time::Now(), kUserRequested); 493 kRequestId1, kUrl1, kClientId1, base::Time::Now(), kUserRequested);
425 request.MarkAttemptStarted(base::Time::Now()); 494 request.MarkAttemptStarted(base::Time::Now());
426 coordinator()->queue()->AddRequest( 495 coordinator()->queue()->AddRequest(
427 request, base::Bind(&RequestCoordinatorTest::AddRequestDone, 496 request, base::Bind(&RequestCoordinatorTest::AddRequestDone,
428 base::Unretained(this))); 497 base::Unretained(this)));
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 // Wait for async get to finish. 714 // Wait for async get to finish.
646 WaitForCallback(); 715 WaitForCallback();
647 PumpLoop(); 716 PumpLoop();
648 717
649 // Check that the statuses found in the callback match what we expect. 718 // Check that the statuses found in the callback match what we expect.
650 EXPECT_EQ(2UL, last_requests().size()); 719 EXPECT_EQ(2UL, last_requests().size());
651 EXPECT_EQ(kRequestId1, last_requests().at(0).request_id()); 720 EXPECT_EQ(kRequestId1, last_requests().at(0).request_id());
652 EXPECT_EQ(kRequestId2, last_requests().at(1).request_id()); 721 EXPECT_EQ(kRequestId2, last_requests().at(1).request_id());
653 } 722 }
654 723
724 TEST_F(RequestCoordinatorTest, PauseAndResumeObserver) {
725 // Add a request to the queue.
726 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1,
727 base::Time::Now(), kUserRequested);
728 coordinator()->queue()->AddRequest(
729 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone,
730 base::Unretained(this)));
731 PumpLoop();
732
733 // Pause the request.
734 std::vector<int64_t> request_ids;
735 request_ids.push_back(kRequestId1);
736 coordinator()->PauseRequests(request_ids);
737 PumpLoop();
738
739 EXPECT_TRUE(observer().changed_called());
740 EXPECT_EQ(SavePageRequest::RequestState::PAUSED, observer().state());
741
742 // Clear out the observer before the next call.
743 observer().Clear();
744
745 // Resume the request.
746 coordinator()->ResumeRequests(request_ids);
747 PumpLoop();
748
749 EXPECT_TRUE(observer().changed_called());
750 EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, observer().state());
751 }
752
753 TEST_F(RequestCoordinatorTest, RemoveObserver) {
fgorski 2016/08/15 17:51:44 nit: this is unfortunate name. ObservedRemoveReque
Pete Williamson 2016/08/15 20:22:52 Done.
754 // Add a request to the queue.
755 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1,
756 base::Time::Now(), kUserRequested);
757 coordinator()->queue()->AddRequest(
758 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone,
759 base::Unretained(this)));
760 PumpLoop();
761
762 // Remove the request.
763 std::vector<int64_t> request_ids;
764 request_ids.push_back(kRequestId1);
765 coordinator()->RemoveRequests(request_ids);
766 PumpLoop();
767
768 EXPECT_TRUE(observer().removed_called());
769 }
770
655 } // namespace offline_pages 771 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698