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

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

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

Powered by Google App Engine
This is Rietveld 408576698