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

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: Pulling out the notifier as an interface. 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
« no previous file with comments | « components/offline_pages/background/request_picker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
14 #include "components/offline_pages/background/request_notifier.h"
12 #include "components/offline_pages/background/request_queue.h" 15 #include "components/offline_pages/background/request_queue.h"
13 #include "components/offline_pages/background/request_queue_in_memory_store.h" 16 #include "components/offline_pages/background/request_queue_in_memory_store.h"
14 #include "components/offline_pages/background/save_page_request.h" 17 #include "components/offline_pages/background/save_page_request.h"
15 #include "components/offline_pages/offline_page_item.h" 18 #include "components/offline_pages/offline_page_item.h"
16 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
17 20
18 namespace offline_pages { 21 namespace offline_pages {
19 22
20 namespace { 23 namespace {
21 // Data for request 1. 24 // Data for request 1.
22 const int64_t kRequestId1 = 17; 25 const int64_t kRequestId1 = 17;
23 const GURL kUrl1("https://google.com"); 26 const GURL kUrl1("https://google.com");
24 const ClientId kClientId1("bookmark", "1234"); 27 const ClientId kClientId1("bookmark", "1234");
25 // Data for request 2. 28 // Data for request 2.
26 const int64_t kRequestId2 = 42; 29 const int64_t kRequestId2 = 42;
27 const GURL kUrl2("http://nytimes.com"); 30 const GURL kUrl2("http://nytimes.com");
28 const ClientId kClientId2("bookmark", "5678"); 31 const ClientId kClientId2("bookmark", "5678");
29 const bool kUserRequested = true; 32 const bool kUserRequested = true;
30 const int kAttemptCount = 1; 33 const int kAttemptCount = 1;
31 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;
41
42 // Default request
43 const SavePageRequest kDefaultRequest(0UL,
Pete Williamson 2016/08/18 17:14:46 kEmptyRequest might be a better name than kDefault
romax 2016/08/18 17:48:38 Done.
44 GURL(""),
45 ClientId("", ""),
46 base::Time(),
47 true);
39 } // namespace 48 } // namespace
40 49
50 class RequestNotifierStub : public RequestNotifier {
51 public:
52 RequestNotifierStub()
53 : last_expired_request_(kDefaultRequest), total_expired_requests_(0) {}
54
55 void NotifyAdded(const SavePageRequest& request) override {}
56 void NotifyChanged(const SavePageRequest& request) override {}
57
58 void NotifyCompleted(const SavePageRequest& request,
59 SavePageStatus status) override {
60 last_expired_request_ = request;
61 last_request_expiration_status_ = status;
62 total_expired_requests_++;
Pete Williamson 2016/08/18 17:14:46 I don't see any code to check the number of expire
romax 2016/08/18 17:48:38 Ah i meant to use that to check how many requests
63 }
64
65 const SavePageRequest& last_expired_request() {
66 return last_expired_request_;
67 }
68
69 RequestCoordinator::SavePageStatus last_request_expiration_status() {
70 return last_request_expiration_status_;
71 }
72
73 private:
74 SavePageStatus last_request_expiration_status_;
75 SavePageRequest last_expired_request_;
76 int32_t total_expired_requests_;
77 };
78
41 class RequestPickerTest : public testing::Test { 79 class RequestPickerTest : public testing::Test {
42 public: 80 public:
43 RequestPickerTest(); 81 RequestPickerTest();
44 82
45 ~RequestPickerTest() override; 83 ~RequestPickerTest() override;
46 84
47 void SetUp() override; 85 void SetUp() override;
48 86
49 void PumpLoop(); 87 void PumpLoop();
50 88
51 void AddRequestDone(RequestQueue::AddRequestResult result, 89 void AddRequestDone(RequestQueue::AddRequestResult result,
52 const SavePageRequest& request); 90 const SavePageRequest& request);
53 91
54 void RequestPicked(const SavePageRequest& request); 92 void RequestPicked(const SavePageRequest& request);
55 93
56 void RequestQueueEmpty(); 94 void RequestQueueEmpty();
57 95
58 void QueueRequestsAndChooseOne(const SavePageRequest& request1, 96 void QueueRequestsAndChooseOne(const SavePageRequest& request1,
59 const SavePageRequest& request2); 97 const SavePageRequest& request2);
60 98
99 RequestNotifierStub* GetNotifier() { return notifier_.get(); }
100
61 protected: 101 protected:
62 // The request queue is simple enough we will use a real queue with a memory 102 // The request queue is simple enough we will use a real queue with a memory
63 // store instead of a stub. 103 // store instead of a stub.
64 std::unique_ptr<RequestQueue> queue_; 104 std::unique_ptr<RequestQueue> queue_;
65 std::unique_ptr<RequestPicker> picker_; 105 std::unique_ptr<RequestPicker> picker_;
106 std::unique_ptr<RequestNotifierStub> notifier_;
66 std::unique_ptr<SavePageRequest> last_picked_; 107 std::unique_ptr<SavePageRequest> last_picked_;
67 std::unique_ptr<OfflinerPolicy> policy_; 108 std::unique_ptr<OfflinerPolicy> policy_;
68 bool request_queue_empty_called_; 109 bool request_queue_empty_called_;
69 110
70 private: 111 private:
71 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 112 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
72 base::ThreadTaskRunnerHandle task_runner_handle_; 113 base::ThreadTaskRunnerHandle task_runner_handle_;
73 }; 114 };
74 115
75 RequestPickerTest::RequestPickerTest() 116 RequestPickerTest::RequestPickerTest()
76 : task_runner_(new base::TestSimpleTaskRunner), 117 : task_runner_(new base::TestSimpleTaskRunner),
77 task_runner_handle_(task_runner_) {} 118 task_runner_handle_(task_runner_) {}
78 119
79 RequestPickerTest::~RequestPickerTest() {} 120 RequestPickerTest::~RequestPickerTest() {}
80 121
81 void RequestPickerTest::SetUp() { 122 void RequestPickerTest::SetUp() {
82 std::unique_ptr<RequestQueueInMemoryStore> store( 123 std::unique_ptr<RequestQueueInMemoryStore> store(
83 new RequestQueueInMemoryStore()); 124 new RequestQueueInMemoryStore());
84 queue_.reset(new RequestQueue(std::move(store))); 125 queue_.reset(new RequestQueue(std::move(store)));
85 policy_.reset(new OfflinerPolicy()); 126 policy_.reset(new OfflinerPolicy());
86 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 127 notifier_.reset(new RequestNotifierStub());
128 picker_.reset(
129 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
87 request_queue_empty_called_ = false; 130 request_queue_empty_called_ = false;
88 } 131 }
89 132
90 void RequestPickerTest::PumpLoop() { 133 void RequestPickerTest::PumpLoop() {
91 task_runner_->RunUntilIdle(); 134 task_runner_->RunUntilIdle();
92 } 135 }
93 136
94 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, 137 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result,
95 const SavePageRequest& request) {} 138 const SavePageRequest& request) {}
96 139
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 // callback. 183 // callback.
141 PumpLoop(); 184 PumpLoop();
142 185
143 EXPECT_TRUE(request_queue_empty_called_); 186 EXPECT_TRUE(request_queue_empty_called_);
144 } 187 }
145 188
146 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { 189 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) {
147 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 190 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
148 kPreferRetryCount, kMaxStartedTries, 191 kPreferRetryCount, kMaxStartedTries,
149 kMaxCompletedTries + 1)); 192 kMaxCompletedTries + 1));
150 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 193 picker_.reset(
194 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
151 195
152 base::Time creation_time = base::Time::Now(); 196 base::Time creation_time = base::Time::Now();
153 SavePageRequest request1( 197 SavePageRequest request1(
154 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); 198 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested);
155 SavePageRequest request2( 199 SavePageRequest request2(
156 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); 200 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested);
157 request2.set_completed_attempt_count(kAttemptCount); 201 request2.set_completed_attempt_count(kAttemptCount);
158 202
159 QueueRequestsAndChooseOne(request1, request2); 203 QueueRequestsAndChooseOne(request1, request2);
160 204
(...skipping 14 matching lines...) Expand all
175 219
176 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 220 EXPECT_EQ(kRequestId1, last_picked_->request_id());
177 EXPECT_FALSE(request_queue_empty_called_); 221 EXPECT_FALSE(request_queue_empty_called_);
178 } 222 }
179 223
180 TEST_F(RequestPickerTest, ChooseEarlierRequest) { 224 TEST_F(RequestPickerTest, ChooseEarlierRequest) {
181 // We need a custom policy object prefering recency to retry count. 225 // We need a custom policy object prefering recency to retry count.
182 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 226 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
183 !kPreferRetryCount, kMaxStartedTries, 227 !kPreferRetryCount, kMaxStartedTries,
184 kMaxCompletedTries)); 228 kMaxCompletedTries));
185 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 229 picker_.reset(
230 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
186 231
187 base::Time creation_time1 = 232 base::Time creation_time1 =
188 base::Time::Now() - base::TimeDelta::FromSeconds(10); 233 base::Time::Now() - base::TimeDelta::FromSeconds(10);
189 base::Time creation_time2 = base::Time::Now(); 234 base::Time creation_time2 = base::Time::Now();
190 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 235 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
191 kUserRequested); 236 kUserRequested);
192 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 237 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
193 kUserRequested); 238 kUserRequested);
194 request2.set_completed_attempt_count(kAttemptCount); 239 request2.set_completed_attempt_count(kAttemptCount);
195 240
196 QueueRequestsAndChooseOne(request1, request2); 241 QueueRequestsAndChooseOne(request1, request2);
197 242
198 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 243 EXPECT_EQ(kRequestId1, last_picked_->request_id());
199 EXPECT_FALSE(request_queue_empty_called_); 244 EXPECT_FALSE(request_queue_empty_called_);
200 } 245 }
201 246
202 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { 247 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) {
203 // We need a custom policy object preferring recency to retry count. 248 // We need a custom policy object preferring recency to retry count.
204 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 249 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
205 !kPreferRetryCount, kMaxStartedTries, 250 !kPreferRetryCount, kMaxStartedTries,
206 kMaxCompletedTries + 1)); 251 kMaxCompletedTries + 1));
207 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 252 picker_.reset(
253 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
208 254
209 base::Time creation_time = base::Time::Now(); 255 base::Time creation_time = base::Time::Now();
210 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 256 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
211 kUserRequested); 257 kUserRequested);
212 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 258 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
213 kUserRequested); 259 kUserRequested);
214 request2.set_completed_attempt_count(kAttemptCount); 260 request2.set_completed_attempt_count(kAttemptCount);
215 261
216 QueueRequestsAndChooseOne(request1, request2); 262 QueueRequestsAndChooseOne(request1, request2);
217 263
218 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 264 EXPECT_EQ(kRequestId2, last_picked_->request_id());
219 EXPECT_FALSE(request_queue_empty_called_); 265 EXPECT_FALSE(request_queue_empty_called_);
220 } 266 }
221 267
222 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { 268 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) {
223 // We need a custom policy object preferring lower retry count. 269 // We need a custom policy object preferring lower retry count.
224 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, 270 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier,
225 kPreferRetryCount, kMaxStartedTries, 271 kPreferRetryCount, kMaxStartedTries,
226 kMaxCompletedTries + 1)); 272 kMaxCompletedTries + 1));
227 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 273 picker_.reset(
274 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
228 275
229 base::Time creation_time = base::Time::Now(); 276 base::Time creation_time = base::Time::Now();
230 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 277 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
231 kUserRequested); 278 kUserRequested);
232 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 279 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
233 kUserRequested); 280 kUserRequested);
234 request2.set_completed_attempt_count(kAttemptCount); 281 request2.set_completed_attempt_count(kAttemptCount);
235 282
236 QueueRequestsAndChooseOne(request1, request2); 283 QueueRequestsAndChooseOne(request1, request2);
237 284
238 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 285 EXPECT_EQ(kRequestId1, last_picked_->request_id());
239 EXPECT_FALSE(request_queue_empty_called_); 286 EXPECT_FALSE(request_queue_empty_called_);
240 } 287 }
241 288
242 TEST_F(RequestPickerTest, ChooseLaterRequest) { 289 TEST_F(RequestPickerTest, ChooseLaterRequest) {
243 // We need a custom policy preferring recency over retry, and later requests. 290 // We need a custom policy preferring recency over retry, and later requests.
244 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, 291 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier,
245 !kPreferRetryCount, kMaxStartedTries, 292 !kPreferRetryCount, kMaxStartedTries,
246 kMaxCompletedTries)); 293 kMaxCompletedTries));
247 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 294 picker_.reset(
295 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
248 296
249 base::Time creation_time1 = 297 base::Time creation_time1 =
250 base::Time::Now() - base::TimeDelta::FromSeconds(10); 298 base::Time::Now() - base::TimeDelta::FromSeconds(10);
251 base::Time creation_time2 = base::Time::Now(); 299 base::Time creation_time2 = base::Time::Now();
252 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 300 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
253 kUserRequested); 301 kUserRequested);
254 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 302 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
255 kUserRequested); 303 kUserRequested);
256 304
257 QueueRequestsAndChooseOne(request1, request2); 305 QueueRequestsAndChooseOne(request1, request2);
258 306
259 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 307 EXPECT_EQ(kRequestId2, last_picked_->request_id());
260 EXPECT_FALSE(request_queue_empty_called_); 308 EXPECT_FALSE(request_queue_empty_called_);
261 } 309 }
262 310
263 TEST_F(RequestPickerTest, ChooseUnexpiredRequest) { 311 TEST_F(RequestPickerTest, ChooseNonExpiredRequest) {
264 base::Time creation_time1 = 312 base::Time creation_time = base::Time::Now();
265 base::Time::Now() - base::TimeDelta::FromSeconds(kTwoWeeksInSeconds); 313 base::Time expired_time =
266 base::Time creation_time2 = base::Time::Now(); 314 creation_time -
267 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 315 base::TimeDelta::FromSeconds(kRequestExpirationTimeInSeconds + 60);
Pete Williamson 2016/08/18 17:14:46 How does this compile? I thought that kReqeustExp
romax 2016/08/18 17:48:38 hmm it's not private but those constants are defin
316 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
268 kUserRequested); 317 kUserRequested);
269 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 318 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time,
270 kUserRequested); 319 kUserRequested);
271 320
272 QueueRequestsAndChooseOne(request1, request2); 321 QueueRequestsAndChooseOne(request1, request2);
273 322
274 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 323 PumpLoop();
324
325 EXPECT_EQ(kRequestId1, last_picked_->request_id());
275 EXPECT_FALSE(request_queue_empty_called_); 326 EXPECT_FALSE(request_queue_empty_called_);
327 EXPECT_EQ(kRequestId2, GetNotifier()->last_expired_request().request_id());
328 EXPECT_EQ(RequestNotifier::SavePageStatus::EXPIRED,
329 GetNotifier()->last_request_expiration_status());
276 } 330 }
277 331
278 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { 332 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) {
279 base::Time creation_time1 = 333 base::Time creation_time1 =
280 base::Time::Now() - base::TimeDelta::FromSeconds(1); 334 base::Time::Now() - base::TimeDelta::FromSeconds(1);
281 base::Time creation_time2 = base::Time::Now(); 335 base::Time creation_time2 = base::Time::Now();
282 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 336 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
283 kUserRequested); 337 kUserRequested);
284 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 338 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
285 kUserRequested); 339 kUserRequested);
(...skipping 20 matching lines...) Expand all
306 // With default policy settings, we should choose the earlier request. 360 // With default policy settings, we should choose the earlier request.
307 // However, we will make the earlier reqeust exceed the limit. 361 // However, we will make the earlier reqeust exceed the limit.
308 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); 362 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries());
309 363
310 QueueRequestsAndChooseOne(request1, request2); 364 QueueRequestsAndChooseOne(request1, request2);
311 365
312 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 366 EXPECT_EQ(kRequestId2, last_picked_->request_id());
313 EXPECT_FALSE(request_queue_empty_called_); 367 EXPECT_FALSE(request_queue_empty_called_);
314 } 368 }
315 } // namespace offline_pages 369 } // namespace offline_pages
OLDNEW
« no previous file with comments | « components/offline_pages/background/request_picker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698