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

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 build. 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 kEmptyRequest(0UL,
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_(kEmptyRequest), 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_++;
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 int32_t total_expired_requests() { return total_expired_requests_; }
74
75 private:
76 SavePageStatus last_request_expiration_status_;
77 SavePageRequest last_expired_request_;
78 int32_t total_expired_requests_;
79 };
80
41 class RequestPickerTest : public testing::Test { 81 class RequestPickerTest : public testing::Test {
42 public: 82 public:
43 RequestPickerTest(); 83 RequestPickerTest();
44 84
45 ~RequestPickerTest() override; 85 ~RequestPickerTest() override;
46 86
47 void SetUp() override; 87 void SetUp() override;
48 88
49 void PumpLoop(); 89 void PumpLoop();
50 90
51 void AddRequestDone(RequestQueue::AddRequestResult result, 91 void AddRequestDone(RequestQueue::AddRequestResult result,
52 const SavePageRequest& request); 92 const SavePageRequest& request);
53 93
54 void RequestPicked(const SavePageRequest& request); 94 void RequestPicked(const SavePageRequest& request);
55 95
56 void RequestQueueEmpty(); 96 void RequestQueueEmpty();
57 97
58 void QueueRequestsAndChooseOne(const SavePageRequest& request1, 98 void QueueRequestsAndChooseOne(const SavePageRequest& request1,
59 const SavePageRequest& request2); 99 const SavePageRequest& request2);
60 100
101 RequestNotifierStub* GetNotifier() { return notifier_.get(); }
102
61 protected: 103 protected:
62 // The request queue is simple enough we will use a real queue with a memory 104 // The request queue is simple enough we will use a real queue with a memory
63 // store instead of a stub. 105 // store instead of a stub.
64 std::unique_ptr<RequestQueue> queue_; 106 std::unique_ptr<RequestQueue> queue_;
65 std::unique_ptr<RequestPicker> picker_; 107 std::unique_ptr<RequestPicker> picker_;
108 std::unique_ptr<RequestNotifierStub> notifier_;
66 std::unique_ptr<SavePageRequest> last_picked_; 109 std::unique_ptr<SavePageRequest> last_picked_;
67 std::unique_ptr<OfflinerPolicy> policy_; 110 std::unique_ptr<OfflinerPolicy> policy_;
68 bool request_queue_empty_called_; 111 bool request_queue_empty_called_;
69 112
70 private: 113 private:
71 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 114 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
72 base::ThreadTaskRunnerHandle task_runner_handle_; 115 base::ThreadTaskRunnerHandle task_runner_handle_;
73 }; 116 };
74 117
75 RequestPickerTest::RequestPickerTest() 118 RequestPickerTest::RequestPickerTest()
76 : task_runner_(new base::TestSimpleTaskRunner), 119 : task_runner_(new base::TestSimpleTaskRunner),
77 task_runner_handle_(task_runner_) {} 120 task_runner_handle_(task_runner_) {}
78 121
79 RequestPickerTest::~RequestPickerTest() {} 122 RequestPickerTest::~RequestPickerTest() {}
80 123
81 void RequestPickerTest::SetUp() { 124 void RequestPickerTest::SetUp() {
82 std::unique_ptr<RequestQueueInMemoryStore> store( 125 std::unique_ptr<RequestQueueInMemoryStore> store(
83 new RequestQueueInMemoryStore()); 126 new RequestQueueInMemoryStore());
84 queue_.reset(new RequestQueue(std::move(store))); 127 queue_.reset(new RequestQueue(std::move(store)));
85 policy_.reset(new OfflinerPolicy()); 128 policy_.reset(new OfflinerPolicy());
86 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 129 notifier_.reset(new RequestNotifierStub());
130 picker_.reset(
131 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
87 request_queue_empty_called_ = false; 132 request_queue_empty_called_ = false;
88 } 133 }
89 134
90 void RequestPickerTest::PumpLoop() { 135 void RequestPickerTest::PumpLoop() {
91 task_runner_->RunUntilIdle(); 136 task_runner_->RunUntilIdle();
92 } 137 }
93 138
94 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, 139 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result,
95 const SavePageRequest& request) {} 140 const SavePageRequest& request) {}
96 141
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 // callback. 185 // callback.
141 PumpLoop(); 186 PumpLoop();
142 187
143 EXPECT_TRUE(request_queue_empty_called_); 188 EXPECT_TRUE(request_queue_empty_called_);
144 } 189 }
145 190
146 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { 191 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) {
147 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 192 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
148 kPreferRetryCount, kMaxStartedTries, 193 kPreferRetryCount, kMaxStartedTries,
149 kMaxCompletedTries + 1)); 194 kMaxCompletedTries + 1));
150 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 195 picker_.reset(
196 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
151 197
152 base::Time creation_time = base::Time::Now(); 198 base::Time creation_time = base::Time::Now();
153 SavePageRequest request1( 199 SavePageRequest request1(
154 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); 200 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested);
155 SavePageRequest request2( 201 SavePageRequest request2(
156 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); 202 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested);
157 request2.set_completed_attempt_count(kAttemptCount); 203 request2.set_completed_attempt_count(kAttemptCount);
158 204
159 QueueRequestsAndChooseOne(request1, request2); 205 QueueRequestsAndChooseOne(request1, request2);
160 206
(...skipping 14 matching lines...) Expand all
175 221
176 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 222 EXPECT_EQ(kRequestId1, last_picked_->request_id());
177 EXPECT_FALSE(request_queue_empty_called_); 223 EXPECT_FALSE(request_queue_empty_called_);
178 } 224 }
179 225
180 TEST_F(RequestPickerTest, ChooseEarlierRequest) { 226 TEST_F(RequestPickerTest, ChooseEarlierRequest) {
181 // We need a custom policy object prefering recency to retry count. 227 // We need a custom policy object prefering recency to retry count.
182 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 228 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
183 !kPreferRetryCount, kMaxStartedTries, 229 !kPreferRetryCount, kMaxStartedTries,
184 kMaxCompletedTries)); 230 kMaxCompletedTries));
185 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 231 picker_.reset(
232 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
186 233
187 base::Time creation_time1 = 234 base::Time creation_time1 =
188 base::Time::Now() - base::TimeDelta::FromSeconds(10); 235 base::Time::Now() - base::TimeDelta::FromSeconds(10);
189 base::Time creation_time2 = base::Time::Now(); 236 base::Time creation_time2 = base::Time::Now();
190 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 237 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
191 kUserRequested); 238 kUserRequested);
192 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 239 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
193 kUserRequested); 240 kUserRequested);
194 request2.set_completed_attempt_count(kAttemptCount); 241 request2.set_completed_attempt_count(kAttemptCount);
195 242
196 QueueRequestsAndChooseOne(request1, request2); 243 QueueRequestsAndChooseOne(request1, request2);
197 244
198 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 245 EXPECT_EQ(kRequestId1, last_picked_->request_id());
199 EXPECT_FALSE(request_queue_empty_called_); 246 EXPECT_FALSE(request_queue_empty_called_);
200 } 247 }
201 248
202 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { 249 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) {
203 // We need a custom policy object preferring recency to retry count. 250 // We need a custom policy object preferring recency to retry count.
204 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, 251 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
205 !kPreferRetryCount, kMaxStartedTries, 252 !kPreferRetryCount, kMaxStartedTries,
206 kMaxCompletedTries + 1)); 253 kMaxCompletedTries + 1));
207 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 254 picker_.reset(
255 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
208 256
209 base::Time creation_time = base::Time::Now(); 257 base::Time creation_time = base::Time::Now();
210 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 258 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
211 kUserRequested); 259 kUserRequested);
212 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 260 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
213 kUserRequested); 261 kUserRequested);
214 request2.set_completed_attempt_count(kAttemptCount); 262 request2.set_completed_attempt_count(kAttemptCount);
215 263
216 QueueRequestsAndChooseOne(request1, request2); 264 QueueRequestsAndChooseOne(request1, request2);
217 265
218 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 266 EXPECT_EQ(kRequestId2, last_picked_->request_id());
219 EXPECT_FALSE(request_queue_empty_called_); 267 EXPECT_FALSE(request_queue_empty_called_);
220 } 268 }
221 269
222 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { 270 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) {
223 // We need a custom policy object preferring lower retry count. 271 // We need a custom policy object preferring lower retry count.
224 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, 272 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier,
225 kPreferRetryCount, kMaxStartedTries, 273 kPreferRetryCount, kMaxStartedTries,
226 kMaxCompletedTries + 1)); 274 kMaxCompletedTries + 1));
227 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 275 picker_.reset(
276 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
228 277
229 base::Time creation_time = base::Time::Now(); 278 base::Time creation_time = base::Time::Now();
230 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 279 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
231 kUserRequested); 280 kUserRequested);
232 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 281 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
233 kUserRequested); 282 kUserRequested);
234 request2.set_completed_attempt_count(kAttemptCount); 283 request2.set_completed_attempt_count(kAttemptCount);
235 284
236 QueueRequestsAndChooseOne(request1, request2); 285 QueueRequestsAndChooseOne(request1, request2);
237 286
238 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 287 EXPECT_EQ(kRequestId1, last_picked_->request_id());
239 EXPECT_FALSE(request_queue_empty_called_); 288 EXPECT_FALSE(request_queue_empty_called_);
240 } 289 }
241 290
242 TEST_F(RequestPickerTest, ChooseLaterRequest) { 291 TEST_F(RequestPickerTest, ChooseLaterRequest) {
243 // We need a custom policy preferring recency over retry, and later requests. 292 // We need a custom policy preferring recency over retry, and later requests.
244 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, 293 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier,
245 !kPreferRetryCount, kMaxStartedTries, 294 !kPreferRetryCount, kMaxStartedTries,
246 kMaxCompletedTries)); 295 kMaxCompletedTries));
247 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); 296 picker_.reset(
297 new RequestPicker(queue_.get(), policy_.get(), notifier_.get()));
248 298
249 base::Time creation_time1 = 299 base::Time creation_time1 =
250 base::Time::Now() - base::TimeDelta::FromSeconds(10); 300 base::Time::Now() - base::TimeDelta::FromSeconds(10);
251 base::Time creation_time2 = base::Time::Now(); 301 base::Time creation_time2 = base::Time::Now();
252 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 302 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
253 kUserRequested); 303 kUserRequested);
254 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 304 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
255 kUserRequested); 305 kUserRequested);
256 306
257 QueueRequestsAndChooseOne(request1, request2); 307 QueueRequestsAndChooseOne(request1, request2);
258 308
259 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 309 EXPECT_EQ(kRequestId2, last_picked_->request_id());
260 EXPECT_FALSE(request_queue_empty_called_); 310 EXPECT_FALSE(request_queue_empty_called_);
261 } 311 }
262 312
263 TEST_F(RequestPickerTest, ChooseUnexpiredRequest) { 313 TEST_F(RequestPickerTest, ChooseNonExpiredRequest) {
264 base::Time creation_time1 = 314 base::Time creation_time = base::Time::Now();
265 base::Time::Now() - base::TimeDelta::FromSeconds(kTwoWeeksInSeconds); 315 base::Time expired_time =
266 base::Time creation_time2 = base::Time::Now(); 316 creation_time - base::TimeDelta::FromSeconds(
267 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 317 policy_->GetRequestExpirationTimeInSeconds() + 60);
318 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
268 kUserRequested); 319 kUserRequested);
269 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 320 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time,
270 kUserRequested); 321 kUserRequested);
271 322
272 QueueRequestsAndChooseOne(request1, request2); 323 QueueRequestsAndChooseOne(request1, request2);
273 324
274 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 325 PumpLoop();
326
327 EXPECT_EQ(kRequestId1, last_picked_->request_id());
275 EXPECT_FALSE(request_queue_empty_called_); 328 EXPECT_FALSE(request_queue_empty_called_);
329 EXPECT_EQ(kRequestId2, GetNotifier()->last_expired_request().request_id());
330 EXPECT_EQ(RequestNotifier::SavePageStatus::EXPIRED,
331 GetNotifier()->last_request_expiration_status());
332 EXPECT_EQ(1, GetNotifier()->total_expired_requests());
276 } 333 }
277 334
278 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { 335 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) {
279 base::Time creation_time1 = 336 base::Time creation_time1 =
280 base::Time::Now() - base::TimeDelta::FromSeconds(1); 337 base::Time::Now() - base::TimeDelta::FromSeconds(1);
281 base::Time creation_time2 = base::Time::Now(); 338 base::Time creation_time2 = base::Time::Now();
282 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 339 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
283 kUserRequested); 340 kUserRequested);
284 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 341 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
285 kUserRequested); 342 kUserRequested);
(...skipping 20 matching lines...) Expand all
306 // With default policy settings, we should choose the earlier request. 363 // With default policy settings, we should choose the earlier request.
307 // However, we will make the earlier reqeust exceed the limit. 364 // However, we will make the earlier reqeust exceed the limit.
308 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); 365 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries());
309 366
310 QueueRequestsAndChooseOne(request1, request2); 367 QueueRequestsAndChooseOne(request1, request2);
311 368
312 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 369 EXPECT_EQ(kRequestId2, last_picked_->request_id());
313 EXPECT_FALSE(request_queue_empty_called_); 370 EXPECT_FALSE(request_queue_empty_called_);
314 } 371 }
315 } // namespace offline_pages 372 } // 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