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

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

Issue 2473553004: Request Picker task (Closed)
Patch Set: CR feedback per EStade, FGorski, and DougArnett Created 4 years, 1 month 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/pick_request_task.h"
6
7 #include <memory>
8 #include <set>
6 9
7 #include "base/bind.h" 10 #include "base/bind.h"
8 #include "base/test/test_simple_task_runner.h" 11 #include "base/test/test_simple_task_runner.h"
9 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
10 #include "base/time/time.h"
11 #include "components/offline_pages/background/device_conditions.h" 13 #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/offliner_policy.h"
15 #include "components/offline_pages/background/request_coordinator.h"
16 #include "components/offline_pages/background/request_coordinator_event_logger.h "
14 #include "components/offline_pages/background/request_notifier.h" 17 #include "components/offline_pages/background/request_notifier.h"
15 #include "components/offline_pages/background/request_queue.h"
16 #include "components/offline_pages/background/request_queue_in_memory_store.h" 18 #include "components/offline_pages/background/request_queue_in_memory_store.h"
19 #include "components/offline_pages/background/request_queue_store.h"
17 #include "components/offline_pages/background/save_page_request.h" 20 #include "components/offline_pages/background/save_page_request.h"
18 #include "components/offline_pages/offline_page_item.h"
19 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
20 22
21 namespace offline_pages { 23 namespace offline_pages {
22 24
23 namespace { 25 namespace {
24 // Data for request 1. 26 // Data for request 1.
25 const int64_t kRequestId1 = 17; 27 const int64_t kRequestId1 = 17;
26 const GURL kUrl1("https://google.com"); 28 const GURL kUrl1("https://google.com");
27 const ClientId kClientId1("bookmark", "1234"); 29 const ClientId kClientId1("bookmark", "1234");
28 // Data for request 2. 30 // Data for request 2.
(...skipping 12 matching lines...) Expand all
41 const int kBackgroundProcessingTimeBudgetSeconds = 170; 43 const int kBackgroundProcessingTimeBudgetSeconds = 170;
42 44
43 // Default request 45 // Default request
44 const SavePageRequest kEmptyRequest(0UL, 46 const SavePageRequest kEmptyRequest(0UL,
45 GURL(""), 47 GURL(""),
46 ClientId("", ""), 48 ClientId("", ""),
47 base::Time(), 49 base::Time(),
48 true); 50 true);
49 } // namespace 51 } // namespace
50 52
53 // Helper class needed by the PickRequestTask
51 class RequestNotifierStub : public RequestNotifier { 54 class RequestNotifierStub : public RequestNotifier {
52 public: 55 public:
53 RequestNotifierStub() 56 RequestNotifierStub()
54 : last_expired_request_(kEmptyRequest), total_expired_requests_(0) {} 57 : last_expired_request_(kEmptyRequest), total_expired_requests_(0) {}
55 58
56 void NotifyAdded(const SavePageRequest& request) override {} 59 void NotifyAdded(const SavePageRequest& request) override {}
57 void NotifyChanged(const SavePageRequest& request) override {} 60 void NotifyChanged(const SavePageRequest& request) override {}
58 61
59 void NotifyCompleted(const SavePageRequest& request, 62 void NotifyCompleted(const SavePageRequest& request,
60 BackgroundSavePageResult status) override { 63 BackgroundSavePageResult status) override {
(...skipping 12 matching lines...) Expand all
73 } 76 }
74 77
75 int32_t total_expired_requests() { return total_expired_requests_; } 78 int32_t total_expired_requests() { return total_expired_requests_; }
76 79
77 private: 80 private:
78 BackgroundSavePageResult last_request_expiration_status_; 81 BackgroundSavePageResult last_request_expiration_status_;
79 SavePageRequest last_expired_request_; 82 SavePageRequest last_expired_request_;
80 int32_t total_expired_requests_; 83 int32_t total_expired_requests_;
81 }; 84 };
82 85
83 class RequestPickerTest : public testing::Test { 86 class PickRequestTaskTest : public testing::Test {
84 public: 87 public:
85 RequestPickerTest(); 88 PickRequestTaskTest();
86 89
87 ~RequestPickerTest() override; 90 ~PickRequestTaskTest() override;
88 91
89 void SetUp() override; 92 void SetUp() override;
90 93
91 void PumpLoop(); 94 void PumpLoop();
92 95
93 void AddRequestDone(RequestQueue::AddRequestResult result, 96 void AddRequestDone(ItemActionStatus status);
94 const SavePageRequest& request);
95 97
96 void RequestPicked(const SavePageRequest& request); 98 void RequestPicked(const SavePageRequest& request);
97 99
98 void RequestNotPicked(const bool non_user_requested_tasks_remaining); 100 void RequestNotPicked(const bool non_user_requested_tasks_remaining);
99 101
100 void QueueRequestsAndChooseOne(const SavePageRequest& request1, 102 void QueueRequests(const SavePageRequest& request1,
101 const SavePageRequest& request2); 103 const SavePageRequest& request2);
104
105 // Reset the factory and the task using the current policy.
106 void MakeFactoryAndTask();
102 107
103 RequestNotifierStub* GetNotifier() { return notifier_.get(); } 108 RequestNotifierStub* GetNotifier() { return notifier_.get(); }
104 109
110 PickRequestTask* task() { return task_.get(); }
111
112 void TaskCompletionCallback(Task* completed_task);
113
105 protected: 114 protected:
106 // The request queue is simple enough we will use a real queue with a memory 115 std::unique_ptr<RequestQueueStore> store_;
107 // store instead of a stub.
108 std::unique_ptr<RequestQueue> queue_;
109 std::unique_ptr<RequestPicker> picker_;
110 std::unique_ptr<RequestNotifierStub> notifier_; 116 std::unique_ptr<RequestNotifierStub> notifier_;
111 std::unique_ptr<SavePageRequest> last_picked_; 117 std::unique_ptr<SavePageRequest> last_picked_;
112 std::unique_ptr<OfflinerPolicy> policy_; 118 std::unique_ptr<OfflinerPolicy> policy_;
113 RequestCoordinatorEventLogger event_logger_; 119 RequestCoordinatorEventLogger event_logger_;
120 std::set<int64_t> disabled_requests_;
121 std::unique_ptr<PickRequestTaskFactory> factory_;
122 std::unique_ptr<PickRequestTask> task_;
114 bool request_queue_not_picked_called_; 123 bool request_queue_not_picked_called_;
124 bool task_complete_called_;
115 125
116 private: 126 private:
117 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 127 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
118 base::ThreadTaskRunnerHandle task_runner_handle_; 128 base::ThreadTaskRunnerHandle task_runner_handle_;
119 }; 129 };
120 130
121 RequestPickerTest::RequestPickerTest() 131 PickRequestTaskTest::PickRequestTaskTest()
122 : task_runner_(new base::TestSimpleTaskRunner), 132 : task_runner_(new base::TestSimpleTaskRunner),
123 task_runner_handle_(task_runner_) {} 133 task_runner_handle_(task_runner_) {}
124 134
125 RequestPickerTest::~RequestPickerTest() {} 135 PickRequestTaskTest::~PickRequestTaskTest() {}
126 136
127 void RequestPickerTest::SetUp() { 137 void PickRequestTaskTest::SetUp() {
128 std::unique_ptr<RequestQueueInMemoryStore> store( 138 DeviceConditions conditions;
129 new RequestQueueInMemoryStore()); 139 store_.reset(new RequestQueueInMemoryStore());
130 queue_.reset(new RequestQueue(std::move(store)));
131 policy_.reset(new OfflinerPolicy()); 140 policy_.reset(new OfflinerPolicy());
132 notifier_.reset(new RequestNotifierStub()); 141 notifier_.reset(new RequestNotifierStub());
133 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 142 factory_.reset(new PickRequestTaskFactory(policy_.get(), notifier_.get(),
134 &event_logger_)); 143 &event_logger_));
144 task_ = factory_->CreatePickerTask(
145 store_.get(),
146 base::Bind(&PickRequestTaskTest::RequestPicked, base::Unretained(this)),
147 base::Bind(&PickRequestTaskTest::RequestNotPicked,
148 base::Unretained(this)),
149 conditions, disabled_requests_);
fgorski 2016/11/10 19:15:50 Set the callback for task completion right about h
Pete Williamson 2016/11/10 23:43:25 Done.
135 request_queue_not_picked_called_ = false; 150 request_queue_not_picked_called_ = false;
151 task_complete_called_ = false;
152 last_picked_.reset();
136 } 153 }
137 154
138 void RequestPickerTest::PumpLoop() { 155 void PickRequestTaskTest::PumpLoop() {
139 task_runner_->RunUntilIdle(); 156 task_runner_->RunUntilIdle();
140 } 157 }
141 158
142 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, 159 void PickRequestTaskTest::TaskCompletionCallback(Task* completed_task) {
143 const SavePageRequest& request) {} 160 task_complete_called_ = true;
161 }
144 162
145 void RequestPickerTest::RequestPicked(const SavePageRequest& request) { 163 void PickRequestTaskTest::AddRequestDone(ItemActionStatus status) {}
164
165 void PickRequestTaskTest::RequestPicked(const SavePageRequest& request) {
146 last_picked_.reset(new SavePageRequest(request)); 166 last_picked_.reset(new SavePageRequest(request));
147 } 167 }
148 168
149 void RequestPickerTest::RequestNotPicked( 169 void PickRequestTaskTest::RequestNotPicked(
150 const bool non_user_requested_tasks_remaining) { 170 const bool non_user_requested_tasks_remaining) {
151 request_queue_not_picked_called_ = true; 171 request_queue_not_picked_called_ = true;
152 } 172 }
153 173
154 // Test helper to queue the two given requests and then pick one of them per 174 // Test helper to queue the two given requests.
155 // configured policy. 175 void PickRequestTaskTest::QueueRequests(const SavePageRequest& request1,
156 void RequestPickerTest::QueueRequestsAndChooseOne( 176 const SavePageRequest& request2) {
157 const SavePageRequest& request1, const SavePageRequest& request2) {
158 DeviceConditions conditions; 177 DeviceConditions conditions;
159 std::set<int64_t> disabled_requests; 178 std::set<int64_t> disabled_requests;
160 // Add test requests on the Queue. 179 // Add test requests on the Queue.
161 queue_->AddRequest(request1, base::Bind(&RequestPickerTest::AddRequestDone, 180 store_->AddRequest(request1, base::Bind(&PickRequestTaskTest::AddRequestDone,
162 base::Unretained(this))); 181 base::Unretained(this)));
163 queue_->AddRequest(request2, base::Bind(&RequestPickerTest::AddRequestDone, 182 store_->AddRequest(request2, base::Bind(&PickRequestTaskTest::AddRequestDone,
164 base::Unretained(this))); 183 base::Unretained(this)));
165 184
166 // Pump the loop to give the async queue the opportunity to do the adds. 185 // Pump the loop to give the async queue the opportunity to do the adds.
167 PumpLoop(); 186 PumpLoop();
168
169 // Call the method under test.
170 picker_->ChooseNextRequest(
171 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)),
172 base::Bind(&RequestPickerTest::RequestNotPicked, base::Unretained(this)),
173 &conditions, disabled_requests);
174
175 // Pump the loop again to give the async queue the opportunity to return
176 // results from the Get operation, and for the picker to call the "picked"
177 // callback.
178 PumpLoop();
179 } 187 }
180 188
181 TEST_F(RequestPickerTest, PickFromEmptyQueue) { 189 void PickRequestTaskTest::MakeFactoryAndTask() {
190 factory_.reset(new PickRequestTaskFactory(policy_.get(), notifier_.get(),
191 &event_logger_));
182 DeviceConditions conditions; 192 DeviceConditions conditions;
183 std::set<int64_t> disabled_requests; 193 task_ = factory_->CreatePickerTask(
184 picker_->ChooseNextRequest( 194 store_.get(),
185 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)), 195 base::Bind(&PickRequestTaskTest::RequestPicked, base::Unretained(this)),
186 base::Bind(&RequestPickerTest::RequestNotPicked, base::Unretained(this)), 196 base::Bind(&PickRequestTaskTest::RequestNotPicked,
187 &conditions, disabled_requests); 197 base::Unretained(this)),
198 conditions, disabled_requests_);
199 }
200
201 TEST_F(PickRequestTaskTest, PickFromEmptyQueue) {
202 task()->Run();
203 PumpLoop();
188 204
189 // Pump the loop again to give the async queue the opportunity to return 205 // Pump the loop again to give the async queue the opportunity to return
190 // results from the Get operation, and for the picker to call the "QueueEmpty" 206 // results from the Get operation, and for the picker to call the "QueueEmpty"
191 // callback. 207 // callback.
192 PumpLoop(); 208 PumpLoop();
193 209
194 EXPECT_TRUE(request_queue_not_picked_called_); 210 EXPECT_TRUE(request_queue_not_picked_called_);
211 EXPECT_TRUE(task_complete_called_);
195 } 212 }
196 213
197 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { 214 TEST_F(PickRequestTaskTest, ChooseRequestWithHigherRetryCount) {
215 // Set up policy to prefer higher retry count.
198 policy_.reset(new OfflinerPolicy( 216 policy_.reset(new OfflinerPolicy(
199 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, 217 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries,
200 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 218 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
201 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 219 MakeFactoryAndTask();
202 &event_logger_));
203 220
204 base::Time creation_time = base::Time::Now(); 221 base::Time creation_time = base::Time::Now();
205 SavePageRequest request1( 222 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
206 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); 223 kUserRequested);
207 SavePageRequest request2( 224 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
208 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); 225 kUserRequested);
209 request2.set_completed_attempt_count(kAttemptCount); 226 request2.set_completed_attempt_count(kAttemptCount);
210 227
211 QueueRequestsAndChooseOne(request1, request2); 228 QueueRequests(request1, request2);
229
230 task()->Run();
231 PumpLoop();
212 232
213 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 233 EXPECT_EQ(kRequestId2, last_picked_->request_id());
214 EXPECT_FALSE(request_queue_not_picked_called_); 234 EXPECT_FALSE(request_queue_not_picked_called_);
235 EXPECT_TRUE(task_complete_called_);
215 } 236 }
216 237
217 TEST_F(RequestPickerTest, ChooseRequestWithSameRetryCountButEarlier) { 238 TEST_F(PickRequestTaskTest, ChooseRequestWithSameRetryCountButEarlier) {
218 base::Time creation_time1 = 239 base::Time creation_time1 =
219 base::Time::Now() - base::TimeDelta::FromSeconds(10); 240 base::Time::Now() - base::TimeDelta::FromSeconds(10);
220 base::Time creation_time2 = base::Time::Now(); 241 base::Time creation_time2 = base::Time::Now();
221 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 242 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
222 kUserRequested); 243 kUserRequested);
223 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 244 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
224 kUserRequested); 245 kUserRequested);
225 246
226 QueueRequestsAndChooseOne(request1, request2); 247 QueueRequests(request1, request2);
248
249 task()->Run();
250 PumpLoop();
227 251
228 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 252 EXPECT_EQ(kRequestId1, last_picked_->request_id());
229 EXPECT_FALSE(request_queue_not_picked_called_); 253 EXPECT_FALSE(request_queue_not_picked_called_);
254 EXPECT_TRUE(task_complete_called_);
230 } 255 }
231 256
232 TEST_F(RequestPickerTest, ChooseEarlierRequest) { 257 TEST_F(PickRequestTaskTest, ChooseEarlierRequest) {
233 // We need a custom policy object prefering recency to retry count. 258 // We need a custom policy object prefering recency to retry count.
234 policy_.reset(new OfflinerPolicy( 259 policy_.reset(new OfflinerPolicy(
235 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, 260 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries,
236 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds)); 261 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds));
237 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 262 MakeFactoryAndTask();
238 &event_logger_));
239 263
240 base::Time creation_time1 = 264 base::Time creation_time1 =
241 base::Time::Now() - base::TimeDelta::FromSeconds(10); 265 base::Time::Now() - base::TimeDelta::FromSeconds(10);
242 base::Time creation_time2 = base::Time::Now(); 266 base::Time creation_time2 = base::Time::Now();
243 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 267 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
244 kUserRequested); 268 kUserRequested);
245 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 269 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
246 kUserRequested); 270 kUserRequested);
247 request2.set_completed_attempt_count(kAttemptCount); 271 request2.set_completed_attempt_count(kAttemptCount);
248 272
249 QueueRequestsAndChooseOne(request1, request2); 273 QueueRequests(request1, request2);
274
275 task()->Run();
276 PumpLoop();
250 277
251 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 278 EXPECT_EQ(kRequestId1, last_picked_->request_id());
252 EXPECT_FALSE(request_queue_not_picked_called_); 279 EXPECT_FALSE(request_queue_not_picked_called_);
280 EXPECT_TRUE(task_complete_called_);
253 } 281 }
254 282
255 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { 283 TEST_F(PickRequestTaskTest, ChooseSameTimeRequestWithHigherRetryCount) {
256 // We need a custom policy object preferring recency to retry count. 284 // We need a custom policy object preferring recency to retry count.
257 policy_.reset(new OfflinerPolicy( 285 policy_.reset(new OfflinerPolicy(
258 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, 286 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries,
259 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 287 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
260 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 288 MakeFactoryAndTask();
261 &event_logger_));
262 289
263 base::Time creation_time = base::Time::Now(); 290 base::Time creation_time = base::Time::Now();
264 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 291 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
265 kUserRequested); 292 kUserRequested);
266 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 293 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
267 kUserRequested); 294 kUserRequested);
268 request2.set_completed_attempt_count(kAttemptCount); 295 request2.set_completed_attempt_count(kAttemptCount);
269 296
270 QueueRequestsAndChooseOne(request1, request2); 297 QueueRequests(request1, request2);
298
299 task()->Run();
300 PumpLoop();
271 301
272 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 302 EXPECT_EQ(kRequestId2, last_picked_->request_id());
273 EXPECT_FALSE(request_queue_not_picked_called_); 303 EXPECT_FALSE(request_queue_not_picked_called_);
304 EXPECT_TRUE(task_complete_called_);
274 } 305 }
275 306
276 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { 307 TEST_F(PickRequestTaskTest, ChooseRequestWithLowerRetryCount) {
277 // We need a custom policy object preferring lower retry count. 308 // We need a custom policy object preferring lower retry count.
278 policy_.reset(new OfflinerPolicy( 309 policy_.reset(new OfflinerPolicy(
279 !kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, 310 !kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries,
280 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 311 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
281 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 312 MakeFactoryAndTask();
282 &event_logger_));
283 313
284 base::Time creation_time = base::Time::Now(); 314 base::Time creation_time = base::Time::Now();
285 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 315 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
286 kUserRequested); 316 kUserRequested);
287 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 317 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
288 kUserRequested); 318 kUserRequested);
289 request2.set_completed_attempt_count(kAttemptCount); 319 request2.set_completed_attempt_count(kAttemptCount);
290 320
291 QueueRequestsAndChooseOne(request1, request2); 321 QueueRequests(request1, request2);
322
323 task()->Run();
324 PumpLoop();
292 325
293 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 326 EXPECT_EQ(kRequestId1, last_picked_->request_id());
294 EXPECT_FALSE(request_queue_not_picked_called_); 327 EXPECT_FALSE(request_queue_not_picked_called_);
328 EXPECT_TRUE(task_complete_called_);
295 } 329 }
296 330
297 TEST_F(RequestPickerTest, ChooseLaterRequest) { 331 TEST_F(PickRequestTaskTest, ChooseLaterRequest) {
298 // We need a custom policy preferring recency over retry, and later requests. 332 // We need a custom policy preferring recency over retry, and later requests.
299 policy_.reset(new OfflinerPolicy( 333 policy_.reset(new OfflinerPolicy(
300 kPreferUntried, !kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, 334 kPreferUntried, !kPreferEarlier, !kPreferRetryCount, kMaxStartedTries,
301 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds)); 335 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds));
302 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 336 MakeFactoryAndTask();
303 &event_logger_));
304 337
305 base::Time creation_time1 = 338 base::Time creation_time1 =
306 base::Time::Now() - base::TimeDelta::FromSeconds(10); 339 base::Time::Now() - base::TimeDelta::FromSeconds(10);
307 base::Time creation_time2 = base::Time::Now(); 340 base::Time creation_time2 = base::Time::Now();
308 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 341 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
309 kUserRequested); 342 kUserRequested);
310 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 343 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
311 kUserRequested); 344 kUserRequested);
312 345
313 QueueRequestsAndChooseOne(request1, request2); 346 QueueRequests(request1, request2);
347
348 task()->Run();
349 PumpLoop();
314 350
315 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 351 EXPECT_EQ(kRequestId2, last_picked_->request_id());
316 EXPECT_FALSE(request_queue_not_picked_called_); 352 EXPECT_FALSE(request_queue_not_picked_called_);
353 EXPECT_TRUE(task_complete_called_);
317 } 354 }
318 355
319 TEST_F(RequestPickerTest, ChooseNonExpiredRequest) { 356 TEST_F(PickRequestTaskTest, ChooseNonExpiredRequest) {
320 base::Time creation_time = base::Time::Now(); 357 base::Time creation_time = base::Time::Now();
321 base::Time expired_time = 358 base::Time expired_time =
322 creation_time - base::TimeDelta::FromSeconds( 359 creation_time - base::TimeDelta::FromSeconds(
323 policy_->GetRequestExpirationTimeInSeconds() + 60); 360 policy_->GetRequestExpirationTimeInSeconds() + 60);
324 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 361 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
325 kUserRequested); 362 kUserRequested);
326 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time, 363 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time,
327 kUserRequested); 364 kUserRequested);
328 365
329 QueueRequestsAndChooseOne(request1, request2); 366 QueueRequests(request1, request2);
330 367
368 task()->Run();
331 PumpLoop(); 369 PumpLoop();
332 370
333 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 371 EXPECT_EQ(kRequestId1, last_picked_->request_id());
334 EXPECT_FALSE(request_queue_not_picked_called_); 372 EXPECT_FALSE(request_queue_not_picked_called_);
335 EXPECT_EQ(kRequestId2, GetNotifier()->last_expired_request().request_id()); 373 EXPECT_EQ(kRequestId2, GetNotifier()->last_expired_request().request_id());
336 EXPECT_EQ(RequestNotifier::BackgroundSavePageResult::EXPIRED, 374 EXPECT_EQ(RequestNotifier::BackgroundSavePageResult::EXPIRED,
337 GetNotifier()->last_request_expiration_status()); 375 GetNotifier()->last_request_expiration_status());
338 EXPECT_EQ(1, GetNotifier()->total_expired_requests()); 376 EXPECT_EQ(1, GetNotifier()->total_expired_requests());
377 EXPECT_TRUE(task_complete_called_);
339 } 378 }
340 379
341 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { 380 TEST_F(PickRequestTaskTest, ChooseRequestThatHasNotExceededStartLimit) {
342 base::Time creation_time1 = 381 base::Time creation_time1 =
343 base::Time::Now() - base::TimeDelta::FromSeconds(1); 382 base::Time::Now() - base::TimeDelta::FromSeconds(1);
344 base::Time creation_time2 = base::Time::Now(); 383 base::Time creation_time2 = base::Time::Now();
345 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 384 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
346 kUserRequested); 385 kUserRequested);
347 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 386 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
348 kUserRequested); 387 kUserRequested);
349 388
350 // With default policy settings, we should choose the earlier request. 389 // With default policy settings, we should choose the earlier request.
351 // However, we will make the earlier reqeust exceed the limit. 390 // However, we will make the earlier reqeust exceed the limit.
352 request1.set_started_attempt_count(policy_->GetMaxStartedTries()); 391 request1.set_started_attempt_count(policy_->GetMaxStartedTries());
353 392
354 QueueRequestsAndChooseOne(request1, request2); 393 QueueRequests(request1, request2);
394
395 task()->Run();
396 PumpLoop();
355 397
356 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 398 EXPECT_EQ(kRequestId2, last_picked_->request_id());
357 EXPECT_FALSE(request_queue_not_picked_called_); 399 EXPECT_FALSE(request_queue_not_picked_called_);
400 EXPECT_TRUE(task_complete_called_);
358 } 401 }
359 402
360 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededCompletionLimit) { 403 TEST_F(PickRequestTaskTest, ChooseRequestThatHasNotExceededCompletionLimit) {
361 base::Time creation_time1 = 404 base::Time creation_time1 =
362 base::Time::Now() - base::TimeDelta::FromSeconds(1); 405 base::Time::Now() - base::TimeDelta::FromSeconds(1);
363 base::Time creation_time2 = base::Time::Now(); 406 base::Time creation_time2 = base::Time::Now();
364 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 407 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
365 kUserRequested); 408 kUserRequested);
366 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 409 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
367 kUserRequested); 410 kUserRequested);
368 411
369 // With default policy settings, we should choose the earlier request. 412 // With default policy settings, we should choose the earlier request.
370 // However, we will make the earlier reqeust exceed the limit. 413 // However, we will make the earlier reqeust exceed the limit.
371 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); 414 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries());
372 415
373 QueueRequestsAndChooseOne(request1, request2); 416 QueueRequests(request1, request2);
417
418 task()->Run();
419 PumpLoop();
374 420
375 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 421 EXPECT_EQ(kRequestId2, last_picked_->request_id());
376 EXPECT_FALSE(request_queue_not_picked_called_); 422 EXPECT_FALSE(request_queue_not_picked_called_);
423 EXPECT_TRUE(task_complete_called_);
377 } 424 }
378 425
379 426 TEST_F(PickRequestTaskTest, ChooseRequestThatIsNotDisabled) {
380 TEST_F(RequestPickerTest, ChooseRequestThatIsNotDisabled) {
381 policy_.reset(new OfflinerPolicy( 427 policy_.reset(new OfflinerPolicy(
382 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, 428 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries,
383 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 429 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
384 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(),
385 &event_logger_));
386
387 base::Time creation_time = base::Time::Now();
388 SavePageRequest request1(
389 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested);
390 SavePageRequest request2(
391 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested);
392 request2.set_completed_attempt_count(kAttemptCount);
393 430
394 // put request 2 on disabled list, ensure request1 picked instead, 431 // put request 2 on disabled list, ensure request1 picked instead,
395 // even though policy would prefer 2. 432 // even though policy would prefer 2.
396 std::set<int64_t> disabled_requests {kRequestId2}; 433 disabled_requests_.insert(kRequestId2);
397 DeviceConditions conditions; 434 MakeFactoryAndTask();
435
436 base::Time creation_time = base::Time::Now();
437 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
438 kUserRequested);
439 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
440 kUserRequested);
441 request2.set_completed_attempt_count(kAttemptCount);
398 442
399 // Add test requests on the Queue. 443 // Add test requests on the Queue.
400 queue_->AddRequest(request1, base::Bind(&RequestPickerTest::AddRequestDone, 444 QueueRequests(request1, request2);
401 base::Unretained(this)));
402 queue_->AddRequest(request2, base::Bind(&RequestPickerTest::AddRequestDone,
403 base::Unretained(this)));
404 445
405 // Pump the loop to give the async queue the opportunity to do the adds. 446 task()->Run();
406 PumpLoop(); 447 PumpLoop();
407 448
408 // Call the method under test.
409 picker_->ChooseNextRequest(
410 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)),
411 base::Bind(&RequestPickerTest::RequestNotPicked, base::Unretained(this)),
412 &conditions, disabled_requests);
413
414 // Pump the loop again to give the async queue the opportunity to return 449 // Pump the loop again to give the async queue the opportunity to return
415 // results from the Get operation, and for the picker to call the "picked" 450 // results from the Get operation, and for the picker to call the "picked"
416 // callback. 451 // callback.
417 PumpLoop(); 452 PumpLoop();
418 453
419 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 454 EXPECT_EQ(kRequestId1, last_picked_->request_id());
420 EXPECT_FALSE(request_queue_not_picked_called_); 455 EXPECT_FALSE(request_queue_not_picked_called_);
456 EXPECT_TRUE(task_complete_called_);
421 } 457 }
458
422 } // namespace offline_pages 459 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698