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

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

Issue 2473553004: Request Picker task (Closed)
Patch Set: merge with latest 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 MakeFactoryAndTask();
134 &event_logger_));
135 request_queue_not_picked_called_ = false; 143 request_queue_not_picked_called_ = false;
144 task_complete_called_ = false;
145 last_picked_.reset();
136 } 146 }
137 147
138 void RequestPickerTest::PumpLoop() { 148 void PickRequestTaskTest::PumpLoop() {
139 task_runner_->RunUntilIdle(); 149 task_runner_->RunUntilIdle();
140 } 150 }
141 151
142 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, 152 void PickRequestTaskTest::TaskCompletionCallback(Task* completed_task) {
143 const SavePageRequest& request) {} 153 task_complete_called_ = true;
154 }
144 155
145 void RequestPickerTest::RequestPicked(const SavePageRequest& request) { 156 void PickRequestTaskTest::AddRequestDone(ItemActionStatus status) {}
157
158 void PickRequestTaskTest::RequestPicked(const SavePageRequest& request) {
146 last_picked_.reset(new SavePageRequest(request)); 159 last_picked_.reset(new SavePageRequest(request));
147 } 160 }
148 161
149 void RequestPickerTest::RequestNotPicked( 162 void PickRequestTaskTest::RequestNotPicked(
150 const bool non_user_requested_tasks_remaining) { 163 const bool non_user_requested_tasks_remaining) {
151 request_queue_not_picked_called_ = true; 164 request_queue_not_picked_called_ = true;
152 } 165 }
153 166
154 // Test helper to queue the two given requests and then pick one of them per 167 // Test helper to queue the two given requests.
155 // configured policy. 168 void PickRequestTaskTest::QueueRequests(const SavePageRequest& request1,
156 void RequestPickerTest::QueueRequestsAndChooseOne( 169 const SavePageRequest& request2) {
157 const SavePageRequest& request1, const SavePageRequest& request2) {
158 DeviceConditions conditions; 170 DeviceConditions conditions;
159 std::set<int64_t> disabled_requests; 171 std::set<int64_t> disabled_requests;
160 // Add test requests on the Queue. 172 // Add test requests on the Queue.
161 queue_->AddRequest(request1, base::Bind(&RequestPickerTest::AddRequestDone, 173 store_->AddRequest(request1, base::Bind(&PickRequestTaskTest::AddRequestDone,
162 base::Unretained(this))); 174 base::Unretained(this)));
163 queue_->AddRequest(request2, base::Bind(&RequestPickerTest::AddRequestDone, 175 store_->AddRequest(request2, base::Bind(&PickRequestTaskTest::AddRequestDone,
164 base::Unretained(this))); 176 base::Unretained(this)));
165 177
166 // Pump the loop to give the async queue the opportunity to do the adds. 178 // Pump the loop to give the async queue the opportunity to do the adds.
167 PumpLoop(); 179 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 } 180 }
180 181
181 TEST_F(RequestPickerTest, PickFromEmptyQueue) { 182 void PickRequestTaskTest::MakeFactoryAndTask() {
183 factory_.reset(new PickRequestTaskFactory(policy_.get(), notifier_.get(),
184 &event_logger_));
182 DeviceConditions conditions; 185 DeviceConditions conditions;
183 std::set<int64_t> disabled_requests; 186 task_ = factory_->CreatePickerTask(
184 picker_->ChooseNextRequest( 187 store_.get(),
185 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)), 188 base::Bind(&PickRequestTaskTest::RequestPicked, base::Unretained(this)),
186 base::Bind(&RequestPickerTest::RequestNotPicked, base::Unretained(this)), 189 base::Bind(&PickRequestTaskTest::RequestNotPicked,
187 &conditions, disabled_requests); 190 base::Unretained(this)),
191 conditions, disabled_requests_);
192 task_->SetTaskCompletionCallbackForTesting(
193 task_runner_.get(),
194 base::Bind(&PickRequestTaskTest::TaskCompletionCallback,
195 base::Unretained(this)));
196 }
197
198 TEST_F(PickRequestTaskTest, PickFromEmptyQueue) {
199 task()->Run();
200 PumpLoop();
188 201
189 // Pump the loop again to give the async queue the opportunity to return 202 // 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" 203 // results from the Get operation, and for the picker to call the "QueueEmpty"
191 // callback. 204 // callback.
192 PumpLoop(); 205 PumpLoop();
193 206
194 EXPECT_TRUE(request_queue_not_picked_called_); 207 EXPECT_TRUE(request_queue_not_picked_called_);
208 EXPECT_TRUE(task_complete_called_);
195 } 209 }
196 210
197 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { 211 TEST_F(PickRequestTaskTest, ChooseRequestWithHigherRetryCount) {
212 // Set up policy to prefer higher retry count.
198 policy_.reset(new OfflinerPolicy( 213 policy_.reset(new OfflinerPolicy(
199 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, 214 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries,
200 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 215 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
201 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 216 MakeFactoryAndTask();
202 &event_logger_));
203 217
204 base::Time creation_time = base::Time::Now(); 218 base::Time creation_time = base::Time::Now();
205 SavePageRequest request1( 219 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
206 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); 220 kUserRequested);
207 SavePageRequest request2( 221 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
208 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); 222 kUserRequested);
209 request2.set_completed_attempt_count(kAttemptCount); 223 request2.set_completed_attempt_count(kAttemptCount);
210 224
211 QueueRequestsAndChooseOne(request1, request2); 225 QueueRequests(request1, request2);
226
227 task()->Run();
228 PumpLoop();
212 229
213 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 230 EXPECT_EQ(kRequestId2, last_picked_->request_id());
214 EXPECT_FALSE(request_queue_not_picked_called_); 231 EXPECT_FALSE(request_queue_not_picked_called_);
232 EXPECT_TRUE(task_complete_called_);
215 } 233 }
216 234
217 TEST_F(RequestPickerTest, ChooseRequestWithSameRetryCountButEarlier) { 235 TEST_F(PickRequestTaskTest, ChooseRequestWithSameRetryCountButEarlier) {
218 base::Time creation_time1 = 236 base::Time creation_time1 =
219 base::Time::Now() - base::TimeDelta::FromSeconds(10); 237 base::Time::Now() - base::TimeDelta::FromSeconds(10);
220 base::Time creation_time2 = base::Time::Now(); 238 base::Time creation_time2 = base::Time::Now();
221 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 239 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
222 kUserRequested); 240 kUserRequested);
223 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 241 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
224 kUserRequested); 242 kUserRequested);
225 243
226 QueueRequestsAndChooseOne(request1, request2); 244 QueueRequests(request1, request2);
245
246 task()->Run();
247 PumpLoop();
227 248
228 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 249 EXPECT_EQ(kRequestId1, last_picked_->request_id());
229 EXPECT_FALSE(request_queue_not_picked_called_); 250 EXPECT_FALSE(request_queue_not_picked_called_);
251 EXPECT_TRUE(task_complete_called_);
230 } 252 }
231 253
232 TEST_F(RequestPickerTest, ChooseEarlierRequest) { 254 TEST_F(PickRequestTaskTest, ChooseEarlierRequest) {
233 // We need a custom policy object prefering recency to retry count. 255 // We need a custom policy object prefering recency to retry count.
234 policy_.reset(new OfflinerPolicy( 256 policy_.reset(new OfflinerPolicy(
235 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, 257 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries,
236 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds)); 258 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds));
237 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 259 MakeFactoryAndTask();
238 &event_logger_));
239 260
240 base::Time creation_time1 = 261 base::Time creation_time1 =
241 base::Time::Now() - base::TimeDelta::FromSeconds(10); 262 base::Time::Now() - base::TimeDelta::FromSeconds(10);
242 base::Time creation_time2 = base::Time::Now(); 263 base::Time creation_time2 = base::Time::Now();
243 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 264 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
244 kUserRequested); 265 kUserRequested);
245 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 266 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
246 kUserRequested); 267 kUserRequested);
247 request2.set_completed_attempt_count(kAttemptCount); 268 request2.set_completed_attempt_count(kAttemptCount);
248 269
249 QueueRequestsAndChooseOne(request1, request2); 270 QueueRequests(request1, request2);
271
272 task()->Run();
273 PumpLoop();
250 274
251 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 275 EXPECT_EQ(kRequestId1, last_picked_->request_id());
252 EXPECT_FALSE(request_queue_not_picked_called_); 276 EXPECT_FALSE(request_queue_not_picked_called_);
277 EXPECT_TRUE(task_complete_called_);
253 } 278 }
254 279
255 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { 280 TEST_F(PickRequestTaskTest, ChooseSameTimeRequestWithHigherRetryCount) {
256 // We need a custom policy object preferring recency to retry count. 281 // We need a custom policy object preferring recency to retry count.
257 policy_.reset(new OfflinerPolicy( 282 policy_.reset(new OfflinerPolicy(
258 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, 283 kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries,
259 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 284 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
260 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 285 MakeFactoryAndTask();
261 &event_logger_));
262 286
263 base::Time creation_time = base::Time::Now(); 287 base::Time creation_time = base::Time::Now();
264 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 288 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
265 kUserRequested); 289 kUserRequested);
266 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 290 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
267 kUserRequested); 291 kUserRequested);
268 request2.set_completed_attempt_count(kAttemptCount); 292 request2.set_completed_attempt_count(kAttemptCount);
269 293
270 QueueRequestsAndChooseOne(request1, request2); 294 QueueRequests(request1, request2);
295
296 task()->Run();
297 PumpLoop();
271 298
272 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 299 EXPECT_EQ(kRequestId2, last_picked_->request_id());
273 EXPECT_FALSE(request_queue_not_picked_called_); 300 EXPECT_FALSE(request_queue_not_picked_called_);
301 EXPECT_TRUE(task_complete_called_);
274 } 302 }
275 303
276 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { 304 TEST_F(PickRequestTaskTest, ChooseRequestWithLowerRetryCount) {
277 // We need a custom policy object preferring lower retry count. 305 // We need a custom policy object preferring lower retry count.
278 policy_.reset(new OfflinerPolicy( 306 policy_.reset(new OfflinerPolicy(
279 !kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, 307 !kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries,
280 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 308 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds));
281 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 309 MakeFactoryAndTask();
282 &event_logger_));
283 310
284 base::Time creation_time = base::Time::Now(); 311 base::Time creation_time = base::Time::Now();
285 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 312 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
286 kUserRequested); 313 kUserRequested);
287 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, 314 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
288 kUserRequested); 315 kUserRequested);
289 request2.set_completed_attempt_count(kAttemptCount); 316 request2.set_completed_attempt_count(kAttemptCount);
290 317
291 QueueRequestsAndChooseOne(request1, request2); 318 QueueRequests(request1, request2);
319
320 task()->Run();
321 PumpLoop();
292 322
293 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 323 EXPECT_EQ(kRequestId1, last_picked_->request_id());
294 EXPECT_FALSE(request_queue_not_picked_called_); 324 EXPECT_FALSE(request_queue_not_picked_called_);
325 EXPECT_TRUE(task_complete_called_);
295 } 326 }
296 327
297 TEST_F(RequestPickerTest, ChooseLaterRequest) { 328 TEST_F(PickRequestTaskTest, ChooseLaterRequest) {
298 // We need a custom policy preferring recency over retry, and later requests. 329 // We need a custom policy preferring recency over retry, and later requests.
299 policy_.reset(new OfflinerPolicy( 330 policy_.reset(new OfflinerPolicy(
300 kPreferUntried, !kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, 331 kPreferUntried, !kPreferEarlier, !kPreferRetryCount, kMaxStartedTries,
301 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds)); 332 kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds));
302 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), 333 MakeFactoryAndTask();
303 &event_logger_));
304 334
305 base::Time creation_time1 = 335 base::Time creation_time1 =
306 base::Time::Now() - base::TimeDelta::FromSeconds(10); 336 base::Time::Now() - base::TimeDelta::FromSeconds(10);
307 base::Time creation_time2 = base::Time::Now(); 337 base::Time creation_time2 = base::Time::Now();
308 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 338 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
309 kUserRequested); 339 kUserRequested);
310 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 340 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
311 kUserRequested); 341 kUserRequested);
312 342
313 QueueRequestsAndChooseOne(request1, request2); 343 QueueRequests(request1, request2);
344
345 task()->Run();
346 PumpLoop();
314 347
315 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 348 EXPECT_EQ(kRequestId2, last_picked_->request_id());
316 EXPECT_FALSE(request_queue_not_picked_called_); 349 EXPECT_FALSE(request_queue_not_picked_called_);
350 EXPECT_TRUE(task_complete_called_);
317 } 351 }
318 352
319 TEST_F(RequestPickerTest, ChooseNonExpiredRequest) { 353 TEST_F(PickRequestTaskTest, ChooseNonExpiredRequest) {
320 base::Time creation_time = base::Time::Now(); 354 base::Time creation_time = base::Time::Now();
321 base::Time expired_time = 355 base::Time expired_time =
322 creation_time - base::TimeDelta::FromSeconds( 356 creation_time - base::TimeDelta::FromSeconds(
323 policy_->GetRequestExpirationTimeInSeconds() + 60); 357 policy_->GetRequestExpirationTimeInSeconds() + 60);
324 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, 358 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
325 kUserRequested); 359 kUserRequested);
326 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time, 360 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time,
327 kUserRequested); 361 kUserRequested);
328 362
329 QueueRequestsAndChooseOne(request1, request2); 363 QueueRequests(request1, request2);
330 364
365 task()->Run();
331 PumpLoop(); 366 PumpLoop();
332 367
333 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 368 EXPECT_EQ(kRequestId1, last_picked_->request_id());
334 EXPECT_FALSE(request_queue_not_picked_called_); 369 EXPECT_FALSE(request_queue_not_picked_called_);
335 EXPECT_EQ(kRequestId2, GetNotifier()->last_expired_request().request_id()); 370 EXPECT_EQ(kRequestId2, GetNotifier()->last_expired_request().request_id());
336 EXPECT_EQ(RequestNotifier::BackgroundSavePageResult::EXPIRED, 371 EXPECT_EQ(RequestNotifier::BackgroundSavePageResult::EXPIRED,
337 GetNotifier()->last_request_expiration_status()); 372 GetNotifier()->last_request_expiration_status());
338 EXPECT_EQ(1, GetNotifier()->total_expired_requests()); 373 EXPECT_EQ(1, GetNotifier()->total_expired_requests());
374 EXPECT_TRUE(task_complete_called_);
339 } 375 }
340 376
341 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { 377 TEST_F(PickRequestTaskTest, ChooseRequestThatHasNotExceededStartLimit) {
342 base::Time creation_time1 = 378 base::Time creation_time1 =
343 base::Time::Now() - base::TimeDelta::FromSeconds(1); 379 base::Time::Now() - base::TimeDelta::FromSeconds(1);
344 base::Time creation_time2 = base::Time::Now(); 380 base::Time creation_time2 = base::Time::Now();
345 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 381 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
346 kUserRequested); 382 kUserRequested);
347 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 383 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
348 kUserRequested); 384 kUserRequested);
349 385
350 // With default policy settings, we should choose the earlier request. 386 // With default policy settings, we should choose the earlier request.
351 // However, we will make the earlier reqeust exceed the limit. 387 // However, we will make the earlier reqeust exceed the limit.
352 request1.set_started_attempt_count(policy_->GetMaxStartedTries()); 388 request1.set_started_attempt_count(policy_->GetMaxStartedTries());
353 389
354 QueueRequestsAndChooseOne(request1, request2); 390 QueueRequests(request1, request2);
391
392 task()->Run();
393 PumpLoop();
355 394
356 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 395 EXPECT_EQ(kRequestId2, last_picked_->request_id());
357 EXPECT_FALSE(request_queue_not_picked_called_); 396 EXPECT_FALSE(request_queue_not_picked_called_);
397 EXPECT_TRUE(task_complete_called_);
358 } 398 }
359 399
360 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededCompletionLimit) { 400 TEST_F(PickRequestTaskTest, ChooseRequestThatHasNotExceededCompletionLimit) {
361 base::Time creation_time1 = 401 base::Time creation_time1 =
362 base::Time::Now() - base::TimeDelta::FromSeconds(1); 402 base::Time::Now() - base::TimeDelta::FromSeconds(1);
363 base::Time creation_time2 = base::Time::Now(); 403 base::Time creation_time2 = base::Time::Now();
364 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, 404 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
365 kUserRequested); 405 kUserRequested);
366 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, 406 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
367 kUserRequested); 407 kUserRequested);
368 408
369 // With default policy settings, we should choose the earlier request. 409 // With default policy settings, we should choose the earlier request.
370 // However, we will make the earlier reqeust exceed the limit. 410 // However, we will make the earlier reqeust exceed the limit.
371 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); 411 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries());
372 412
373 QueueRequestsAndChooseOne(request1, request2); 413 QueueRequests(request1, request2);
414
415 task()->Run();
416 PumpLoop();
374 417
375 EXPECT_EQ(kRequestId2, last_picked_->request_id()); 418 EXPECT_EQ(kRequestId2, last_picked_->request_id());
376 EXPECT_FALSE(request_queue_not_picked_called_); 419 EXPECT_FALSE(request_queue_not_picked_called_);
420 EXPECT_TRUE(task_complete_called_);
377 } 421 }
378 422
379 423 TEST_F(PickRequestTaskTest, ChooseRequestThatIsNotDisabled) {
380 TEST_F(RequestPickerTest, ChooseRequestThatIsNotDisabled) {
381 policy_.reset(new OfflinerPolicy( 424 policy_.reset(new OfflinerPolicy(
382 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, 425 kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries,
383 kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); 426 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 427
394 // put request 2 on disabled list, ensure request1 picked instead, 428 // put request 2 on disabled list, ensure request1 picked instead,
395 // even though policy would prefer 2. 429 // even though policy would prefer 2.
396 std::set<int64_t> disabled_requests {kRequestId2}; 430 disabled_requests_.insert(kRequestId2);
397 DeviceConditions conditions; 431 MakeFactoryAndTask();
432
433 base::Time creation_time = base::Time::Now();
434 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
435 kUserRequested);
436 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
437 kUserRequested);
438 request2.set_completed_attempt_count(kAttemptCount);
398 439
399 // Add test requests on the Queue. 440 // Add test requests on the Queue.
400 queue_->AddRequest(request1, base::Bind(&RequestPickerTest::AddRequestDone, 441 QueueRequests(request1, request2);
401 base::Unretained(this)));
402 queue_->AddRequest(request2, base::Bind(&RequestPickerTest::AddRequestDone,
403 base::Unretained(this)));
404 442
405 // Pump the loop to give the async queue the opportunity to do the adds. 443 task()->Run();
406 PumpLoop(); 444 PumpLoop();
407 445
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 446 // 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" 447 // results from the Get operation, and for the picker to call the "picked"
416 // callback. 448 // callback.
417 PumpLoop(); 449 PumpLoop();
418 450
419 EXPECT_EQ(kRequestId1, last_picked_->request_id()); 451 EXPECT_EQ(kRequestId1, last_picked_->request_id());
420 EXPECT_FALSE(request_queue_not_picked_called_); 452 EXPECT_FALSE(request_queue_not_picked_called_);
453 EXPECT_TRUE(task_complete_called_);
421 } 454 }
455
422 } // namespace offline_pages 456 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698