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

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

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

Powered by Google App Engine
This is Rietveld 408576698