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

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

Issue 2233493003: [Offline Pages] Remove expired requests from the queue. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing patching error. 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_picker.h" 5 #include "components/offline_pages/background/request_picker.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/test/test_simple_task_runner.h" 8 #include "base/test/test_simple_task_runner.h"
9 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
11 #include "components/offline_pages/background/device_conditions.h" 11 #include "components/offline_pages/background/device_conditions.h"
12 #include "components/offline_pages/background/offliner_factory.h"
13 #include "components/offline_pages/background/offliner_policy.h"
12 #include "components/offline_pages/background/request_queue.h" 14 #include "components/offline_pages/background/request_queue.h"
13 #include "components/offline_pages/background/request_queue_in_memory_store.h" 15 #include "components/offline_pages/background/request_queue_in_memory_store.h"
14 #include "components/offline_pages/background/save_page_request.h" 16 #include "components/offline_pages/background/save_page_request.h"
15 #include "components/offline_pages/offline_page_item.h" 17 #include "components/offline_pages/offline_page_item.h"
16 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
17 19
18 namespace offline_pages { 20 namespace offline_pages {
19 21
20 namespace { 22 namespace {
21 // Data for request 1. 23 // Data for request 1.
22 const int64_t kRequestId1 = 17; 24 const int64_t kRequestId1 = 17;
23 const GURL kUrl1("https://google.com"); 25 const GURL kUrl1("https://google.com");
24 const ClientId kClientId1("bookmark", "1234"); 26 const ClientId kClientId1("bookmark", "1234");
25 // Data for request 2. 27 // Data for request 2.
26 const int64_t kRequestId2 = 42; 28 const int64_t kRequestId2 = 42;
27 const GURL kUrl2("http://nytimes.com"); 29 const GURL kUrl2("http://nytimes.com");
28 const ClientId kClientId2("bookmark", "5678"); 30 const ClientId kClientId2("bookmark", "5678");
29 const bool kUserRequested = true; 31 const bool kUserRequested = true;
30 const int kAttemptCount = 1; 32 const int kAttemptCount = 1;
31 const int kTwoWeeksInSeconds = 60 * 60 * 24 * 7 * 2; 33 const int kTwoWeeksInSeconds = 60 * 60 * 24 * 7 * 2;
32 const int kMaxStartedTries = 5; 34 const int kMaxStartedTries = 5;
33 const int kMaxCompletedTries = 1; 35 const int kMaxCompletedTries = 1;
34 36
35 // Constants for policy values - These settings represent the default values. 37 // Constants for policy values - These settings represent the default values.
36 const bool kPreferUntried = false; 38 const bool kPreferUntried = false;
37 const bool kPreferEarlier = true; 39 const bool kPreferEarlier = true;
38 const bool kPreferRetryCount = true; 40 const bool kPreferRetryCount = true;
39 } // namespace 41 } // namespace
40 42
43 class SchedulerStub : public Scheduler {
44 public:
45 SchedulerStub()
46 : schedule_called_(false),
47 unschedule_called_(false),
48 conditions_(false, 0, false) {}
49
50 void Schedule(const TriggerConditions& trigger_conditions) override {
51 schedule_called_ = true;
52 conditions_ = trigger_conditions;
53 }
54
55 // Unschedules the currently scheduled task, if any.
56 void Unschedule() override { unschedule_called_ = true; }
57
58 bool schedule_called() const { return schedule_called_; }
59
60 bool unschedule_called() const { return unschedule_called_; }
61
62 TriggerConditions const* conditions() const { return &conditions_; }
63
64 private:
65 bool schedule_called_;
66 bool unschedule_called_;
67 TriggerConditions conditions_;
68 };
69
70 class OfflinerStub : public Offliner {
71 public:
72 OfflinerStub()
73 : request_(kRequestId1,
74 kUrl1,
75 kClientId1,
76 base::Time::Now(),
77 kUserRequested),
78 enable_callback_(false),
79 cancel_called_(false) {}
80
81 bool LoadAndSave(const SavePageRequest& request,
82 const CompletionCallback& callback) override {
83 callback_ = callback;
84 request_ = request;
85 // Post the callback on the run loop.
86 if (enable_callback_) {
87 base::ThreadTaskRunnerHandle::Get()->PostTask(
88 FROM_HERE,
89 base::Bind(callback, request, Offliner::RequestStatus::SAVED));
90 }
91 return true;
92 }
93
94 void Cancel() override { cancel_called_ = true; }
95
96 void enable_callback(bool enable) { enable_callback_ = enable; }
97
98 bool cancel_called() { return cancel_called_; }
99
100 private:
101 CompletionCallback callback_;
102 SavePageRequest request_;
103 bool enable_callback_;
104 bool cancel_called_;
105 };
106
107 class OfflinerFactoryStub : public OfflinerFactory {
108 public:
109 OfflinerFactoryStub() : offliner_(nullptr) {}
110
111 Offliner* GetOffliner(const OfflinerPolicy* policy) override {
112 if (offliner_.get() == nullptr) {
113 offliner_.reset(new OfflinerStub());
114 }
115 return offliner_.get();
116 }
117
118 private:
119 std::unique_ptr<OfflinerStub> offliner_;
120 };
121
122 class RequestCoordinatorStub : public RequestCoordinator {
123 public:
124 RequestCoordinatorStub()
125 : RequestCoordinator(
126 std::unique_ptr<OfflinerPolicy>(new OfflinerPolicy()),
127 std::unique_ptr<OfflinerFactory>(new OfflinerFactoryStub()),
128 std::unique_ptr<RequestQueue>(
129 new RequestQueue(std::unique_ptr<RequestQueueInMemoryStore>(
130 new RequestQueueInMemoryStore()))),
131 std::unique_ptr<Scheduler>(new SchedulerStub())) {}
132
133 void NotifyRequestsExpired(
134 const std::vector<SavePageRequest>& expired_requests,
135 RequestQueue::UpdateRequestResult result) override {
136 last_request_expiration_result_ = result;
137 last_expired_requests_ = expired_requests;
138 }
139
140 const std::vector<SavePageRequest>& last_expired_requests() {
141 return last_expired_requests_;
142 }
143
144 RequestQueue::UpdateRequestResult last_request_expiration_result() {
145 return last_request_expiration_result_;
146 }
147
148 private:
149 RequestQueue::UpdateRequestResult last_request_expiration_result_;
150 std::vector<SavePageRequest> last_expired_requests_;
151 };
152
41 class RequestPickerTest : public testing::Test { 153 class RequestPickerTest : public testing::Test {
42 public: 154 public:
43 RequestPickerTest(); 155 RequestPickerTest();
44 156
45 ~RequestPickerTest() override; 157 ~RequestPickerTest() override;
46 158
47 void SetUp() override; 159 void SetUp() override;
48 160
49 void PumpLoop(); 161 void PumpLoop();
50 162
51 void AddRequestDone(RequestQueue::AddRequestResult result, 163 void AddRequestDone(RequestQueue::AddRequestResult result,
52 const SavePageRequest& request); 164 const SavePageRequest& request);
53 165
54 void RequestPicked(const SavePageRequest& request); 166 void RequestPicked(const SavePageRequest& request);
55 167
56 void RequestQueueEmpty(); 168 void RequestQueueEmpty();
57 169
58 void QueueRequestsAndChooseOne(const SavePageRequest& request1, 170 void QueueRequestsAndChooseOne(const SavePageRequest& request1,
59 const SavePageRequest& request2); 171 const SavePageRequest& request2);
60 172
173 RequestCoordinatorStub* GetCoordinator() { return coordinator_.get(); }
174
61 protected: 175 protected:
62 // The request queue is simple enough we will use a real queue with a memory 176 // The request queue is simple enough we will use a real queue with a memory
63 // store instead of a stub. 177 // store instead of a stub.
64 std::unique_ptr<RequestQueue> queue_; 178 std::unique_ptr<RequestQueue> queue_;
65 std::unique_ptr<RequestPicker> picker_; 179 std::unique_ptr<RequestPicker> picker_;
180 std::unique_ptr<RequestCoordinatorStub> coordinator_;
66 std::unique_ptr<SavePageRequest> last_picked_; 181 std::unique_ptr<SavePageRequest> last_picked_;
67 std::unique_ptr<OfflinerPolicy> policy_; 182 std::unique_ptr<OfflinerPolicy> policy_;
68 bool request_queue_empty_called_; 183 bool request_queue_empty_called_;
69 184
70 private: 185 private:
71 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 186 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
72 base::ThreadTaskRunnerHandle task_runner_handle_; 187 base::ThreadTaskRunnerHandle task_runner_handle_;
73 }; 188 };
74 189
75 RequestPickerTest::RequestPickerTest() 190 RequestPickerTest::RequestPickerTest()
76 : task_runner_(new base::TestSimpleTaskRunner), 191 : task_runner_(new base::TestSimpleTaskRunner),
77 task_runner_handle_(task_runner_) {} 192 task_runner_handle_(task_runner_) {}
78 193
79 RequestPickerTest::~RequestPickerTest() {} 194 RequestPickerTest::~RequestPickerTest() {}
80 195
81 void RequestPickerTest::SetUp() { 196 void RequestPickerTest::SetUp() {
82 std::unique_ptr<RequestQueueInMemoryStore> store( 197 std::unique_ptr<RequestQueueInMemoryStore> store(
83 new RequestQueueInMemoryStore()); 198 new RequestQueueInMemoryStore());
84 queue_.reset(new RequestQueue(std::move(store))); 199 queue_.reset(new RequestQueue(std::move(store)));
85 policy_.reset(new OfflinerPolicy()); 200 policy_.reset(new OfflinerPolicy());
86 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 201 coordinator_.reset(new RequestCoordinatorStub());
202 picker_.reset(
203 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
87 request_queue_empty_called_ = false; 204 request_queue_empty_called_ = false;
88 } 205 }
89 206
90 void RequestPickerTest::PumpLoop() { 207 void RequestPickerTest::PumpLoop() {
91 task_runner_->RunUntilIdle(); 208 task_runner_->RunUntilIdle();
92 } 209 }
93 210
94 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, 211 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result,
95 const SavePageRequest& request) {} 212 const SavePageRequest& request) {}
96 213
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 &conditions); 253 &conditions);
137 254
138 // Pump the loop again to give the async queue the opportunity to return 255 // Pump the loop again to give the async queue the opportunity to return
139 // results from the Get operation, and for the picker to call the "QueueEmpty" 256 // results from the Get operation, and for the picker to call the "QueueEmpty"
140 // callback. 257 // callback.
141 PumpLoop(); 258 PumpLoop();
142 259
143 EXPECT_TRUE(request_queue_empty_called_); 260 EXPECT_TRUE(request_queue_empty_called_);
144 } 261 }
145 262
263 TEST_F(RequestPickerTest, ChooseNonExpiredRequest) {
264 base::Time creation_time = base::Time::Now();
265 base::Time expired_time =
266 creation_time -
267 base::TimeDelta::FromSeconds(kRequestExpirationTimeInSeconds + 60);
268 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
269 kUserRequested);
270 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time,
271 kUserRequested);
272
273 QueueRequestsAndChooseOne(request1, request2);
274
275 PumpLoop();
276
277 EXPECT_EQ(kRequestId1, last_picked_->request_id());
278 EXPECT_FALSE(request_queue_empty_called_);
279 EXPECT_EQ(kRequestId2,
280 GetCoordinator()->last_expired_requests()[0].request_id());
281 EXPECT_EQ(RequestQueue::UpdateRequestResult::SUCCESS,
282 GetCoordinator()->last_request_expiration_result());
283 }
284
146 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { 285 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) {
147 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 286 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
148 kPreferRetryCount, kMaxStartedTries, 287 kPreferRetryCount, kMaxStartedTries,
149 kMaxCompletedTries + 1)); 288 kMaxCompletedTries + 1));
150 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 289 picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
151 290
152 base::Time creation_time = base::Time::Now(); 291 base::Time creation_time = base::Time::Now();
153 SavePageRequest request1( 292 SavePageRequest request1(
154 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); 293 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested);
155 SavePageRequest request2( 294 SavePageRequest request2(
(...skipping 19 matching lines...) Expand all
175 314
176 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 315 EXPECT_EQ(kRequestId1, last_picked_->request_id());
177 EXPECT_FALSE(request_queue_empty_called_); 316 EXPECT_FALSE(request_queue_empty_called_);
178 } 317 }
179 318
180 TEST_F(RequestPickerTest, ChooseEarlierRequest) { 319 TEST_F(RequestPickerTest, ChooseEarlierRequest) {
181 // We need a custom policy object prefering recency to retry count. 320 // We need a custom policy object prefering recency to retry count.
182 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 321 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
183 !kPreferRetryCount, kMaxStartedTries, 322 !kPreferRetryCount, kMaxStartedTries,
184 kMaxCompletedTries)); 323 kMaxCompletedTries));
185 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 324 picker_.reset(
325 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
186 326
187 base::Time creation_time1 = 327 base::Time creation_time1 =
188 base::Time::Now() - base::TimeDelta::FromSeconds(10); 328 base::Time::Now() - base::TimeDelta::FromSeconds(10);
189 base::Time creation_time2 = base::Time::Now(); 329 base::Time creation_time2 = base::Time::Now();
190 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 330 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
191 kUserRequested); 331 kUserRequested);
192 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 332 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
193 kUserRequested); 333 kUserRequested);
194 request2.set_completed_attempt_count(kAttemptCount); 334 request2.set_completed_attempt_count(kAttemptCount);
195 335
196 QueueRequestsAndChooseOne(request1, request2); 336 QueueRequestsAndChooseOne(request1, request2);
197 337
198 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 338 EXPECT_EQ(kRequestId1, last_picked_->request_id());
199 EXPECT_FALSE(request_queue_empty_called_); 339 EXPECT_FALSE(request_queue_empty_called_);
200 } 340 }
201 341
202 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { 342 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) {
203 // We need a custom policy object preferring recency to retry count. 343 // We need a custom policy object preferring recency to retry count.
204 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 344 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
205 !kPreferRetryCount, kMaxStartedTries, 345 !kPreferRetryCount, kMaxStartedTries,
206 kMaxCompletedTries + 1)); 346 kMaxCompletedTries + 1));
207 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 347 picker_.reset(
348 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
208 349
209 base::Time creation_time = base::Time::Now(); 350 base::Time creation_time = base::Time::Now();
210 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 351 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
211 kUserRequested); 352 kUserRequested);
212 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 353 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
213 kUserRequested); 354 kUserRequested);
214 request2.set_completed_attempt_count(kAttemptCount); 355 request2.set_completed_attempt_count(kAttemptCount);
215 356
216 QueueRequestsAndChooseOne(request1, request2); 357 QueueRequestsAndChooseOne(request1, request2);
217 358
218 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 359 EXPECT_EQ(kRequestId2, last_picked_->request_id());
219 EXPECT_FALSE(request_queue_empty_called_); 360 EXPECT_FALSE(request_queue_empty_called_);
220 } 361 }
221 362
222 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { 363 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) {
223 // We need a custom policy object preferring lower retry count. 364 // We need a custom policy object preferring lower retry count.
224 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, 365 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier,
225 kPreferRetryCount, kMaxStartedTries, 366 kPreferRetryCount, kMaxStartedTries,
226 kMaxCompletedTries + 1)); 367 kMaxCompletedTries + 1));
227 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 368 picker_.reset(
369 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
228 370
229 base::Time creation_time = base::Time::Now(); 371 base::Time creation_time = base::Time::Now();
230 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 372 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
231 kUserRequested); 373 kUserRequested);
232 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 374 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
233 kUserRequested); 375 kUserRequested);
234 request2.set_completed_attempt_count(kAttemptCount); 376 request2.set_completed_attempt_count(kAttemptCount);
235 377
236 QueueRequestsAndChooseOne(request1, request2); 378 QueueRequestsAndChooseOne(request1, request2);
237 379
238 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 380 EXPECT_EQ(kRequestId1, last_picked_->request_id());
239 EXPECT_FALSE(request_queue_empty_called_); 381 EXPECT_FALSE(request_queue_empty_called_);
240 } 382 }
241 383
242 TEST_F(RequestPickerTest, ChooseLaterRequest) { 384 TEST_F(RequestPickerTest, ChooseLaterRequest) {
243 // We need a custom policy preferring recency over retry, and later requests. 385 // We need a custom policy preferring recency over retry, and later requests.
244 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, 386 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier,
245 !kPreferRetryCount, kMaxStartedTries, 387 !kPreferRetryCount, kMaxStartedTries,
246 kMaxCompletedTries)); 388 kMaxCompletedTries));
247 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 389 picker_.reset(
390 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
248 391
249 base::Time creation_time1 = 392 base::Time creation_time1 =
250 base::Time::Now() - base::TimeDelta::FromSeconds(10); 393 base::Time::Now() - base::TimeDelta::FromSeconds(10);
251 base::Time creation_time2 = base::Time::Now(); 394 base::Time creation_time2 = base::Time::Now();
252 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 395 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
253 kUserRequested); 396 kUserRequested);
254 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 397 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
255 kUserRequested); 398 kUserRequested);
256 399
257 QueueRequestsAndChooseOne(request1, request2); 400 QueueRequestsAndChooseOne(request1, request2);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 // With default policy settings, we should choose the earlier request. 449 // With default policy settings, we should choose the earlier request.
307 // However, we will make the earlier reqeust exceed the limit. 450 // However, we will make the earlier reqeust exceed the limit.
308 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); 451 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries());
309 452
310 QueueRequestsAndChooseOne(request1, request2); 453 QueueRequestsAndChooseOne(request1, request2);
311 454
312 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 455 EXPECT_EQ(kRequestId2, last_picked_->request_id());
313 EXPECT_FALSE(request_queue_empty_called_); 456 EXPECT_FALSE(request_queue_empty_called_);
314 } 457 }
315 } // namespace offline_pages 458 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698