| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/offline_pages/background/request_picker.h" | 5 #include "components/offline_pages/background/request_picker.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/test/test_simple_task_runner.h" | 8 #include "base/test/test_simple_task_runner.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 RequestNotifierStub* GetNotifier() { return notifier_.get(); } | 102 RequestNotifierStub* GetNotifier() { return notifier_.get(); } |
| 103 | 103 |
| 104 protected: | 104 protected: |
| 105 // The request queue is simple enough we will use a real queue with a memory | 105 // The request queue is simple enough we will use a real queue with a memory |
| 106 // store instead of a stub. | 106 // store instead of a stub. |
| 107 std::unique_ptr<RequestQueue> queue_; | 107 std::unique_ptr<RequestQueue> queue_; |
| 108 std::unique_ptr<RequestPicker> picker_; | 108 std::unique_ptr<RequestPicker> picker_; |
| 109 std::unique_ptr<RequestNotifierStub> notifier_; | 109 std::unique_ptr<RequestNotifierStub> notifier_; |
| 110 std::unique_ptr<SavePageRequest> last_picked_; | 110 std::unique_ptr<SavePageRequest> last_picked_; |
| 111 std::unique_ptr<OfflinerPolicy> policy_; | 111 std::unique_ptr<OfflinerPolicy> policy_; |
| 112 RequestCoordinatorEventLogger event_logger_; |
| 112 bool request_queue_not_picked_called_; | 113 bool request_queue_not_picked_called_; |
| 113 | 114 |
| 114 private: | 115 private: |
| 115 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 116 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 116 base::ThreadTaskRunnerHandle task_runner_handle_; | 117 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 117 }; | 118 }; |
| 118 | 119 |
| 119 RequestPickerTest::RequestPickerTest() | 120 RequestPickerTest::RequestPickerTest() |
| 120 : task_runner_(new base::TestSimpleTaskRunner), | 121 : task_runner_(new base::TestSimpleTaskRunner), |
| 121 task_runner_handle_(task_runner_) {} | 122 task_runner_handle_(task_runner_) {} |
| 122 | 123 |
| 123 RequestPickerTest::~RequestPickerTest() {} | 124 RequestPickerTest::~RequestPickerTest() {} |
| 124 | 125 |
| 125 void RequestPickerTest::SetUp() { | 126 void RequestPickerTest::SetUp() { |
| 126 std::unique_ptr<RequestQueueInMemoryStore> store( | 127 std::unique_ptr<RequestQueueInMemoryStore> store( |
| 127 new RequestQueueInMemoryStore()); | 128 new RequestQueueInMemoryStore()); |
| 128 queue_.reset(new RequestQueue(std::move(store))); | 129 queue_.reset(new RequestQueue(std::move(store))); |
| 129 policy_.reset(new OfflinerPolicy()); | 130 policy_.reset(new OfflinerPolicy()); |
| 130 notifier_.reset(new RequestNotifierStub()); | 131 notifier_.reset(new RequestNotifierStub()); |
| 131 picker_.reset( | 132 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), |
| 132 new RequestPicker(queue_.get(), policy_.get(), notifier_.get())); | 133 &event_logger_)); |
| 133 request_queue_not_picked_called_ = false; | 134 request_queue_not_picked_called_ = false; |
| 134 } | 135 } |
| 135 | 136 |
| 136 void RequestPickerTest::PumpLoop() { | 137 void RequestPickerTest::PumpLoop() { |
| 137 task_runner_->RunUntilIdle(); | 138 task_runner_->RunUntilIdle(); |
| 138 } | 139 } |
| 139 | 140 |
| 140 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, | 141 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, |
| 141 const SavePageRequest& request) {} | 142 const SavePageRequest& request) {} |
| 142 | 143 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 // callback. | 188 // callback. |
| 188 PumpLoop(); | 189 PumpLoop(); |
| 189 | 190 |
| 190 EXPECT_TRUE(request_queue_not_picked_called_); | 191 EXPECT_TRUE(request_queue_not_picked_called_); |
| 191 } | 192 } |
| 192 | 193 |
| 193 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { | 194 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { |
| 194 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, | 195 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 195 kPreferRetryCount, kMaxStartedTries, | 196 kPreferRetryCount, kMaxStartedTries, |
| 196 kMaxCompletedTries + 1)); | 197 kMaxCompletedTries + 1)); |
| 197 picker_.reset( | 198 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), |
| 198 new RequestPicker(queue_.get(), policy_.get(), notifier_.get())); | 199 &event_logger_)); |
| 199 | 200 |
| 200 base::Time creation_time = base::Time::Now(); | 201 base::Time creation_time = base::Time::Now(); |
| 201 SavePageRequest request1( | 202 SavePageRequest request1( |
| 202 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); | 203 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); |
| 203 SavePageRequest request2( | 204 SavePageRequest request2( |
| 204 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); | 205 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); |
| 205 request2.set_completed_attempt_count(kAttemptCount); | 206 request2.set_completed_attempt_count(kAttemptCount); |
| 206 | 207 |
| 207 QueueRequestsAndChooseOne(request1, request2); | 208 QueueRequestsAndChooseOne(request1, request2); |
| 208 | 209 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 223 | 224 |
| 224 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 225 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 225 EXPECT_FALSE(request_queue_not_picked_called_); | 226 EXPECT_FALSE(request_queue_not_picked_called_); |
| 226 } | 227 } |
| 227 | 228 |
| 228 TEST_F(RequestPickerTest, ChooseEarlierRequest) { | 229 TEST_F(RequestPickerTest, ChooseEarlierRequest) { |
| 229 // We need a custom policy object prefering recency to retry count. | 230 // We need a custom policy object prefering recency to retry count. |
| 230 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, | 231 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 231 !kPreferRetryCount, kMaxStartedTries, | 232 !kPreferRetryCount, kMaxStartedTries, |
| 232 kMaxCompletedTries)); | 233 kMaxCompletedTries)); |
| 233 picker_.reset( | 234 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), |
| 234 new RequestPicker(queue_.get(), policy_.get(), notifier_.get())); | 235 &event_logger_)); |
| 235 | 236 |
| 236 base::Time creation_time1 = | 237 base::Time creation_time1 = |
| 237 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 238 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 238 base::Time creation_time2 = base::Time::Now(); | 239 base::Time creation_time2 = base::Time::Now(); |
| 239 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 240 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 240 kUserRequested); | 241 kUserRequested); |
| 241 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 242 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 242 kUserRequested); | 243 kUserRequested); |
| 243 request2.set_completed_attempt_count(kAttemptCount); | 244 request2.set_completed_attempt_count(kAttemptCount); |
| 244 | 245 |
| 245 QueueRequestsAndChooseOne(request1, request2); | 246 QueueRequestsAndChooseOne(request1, request2); |
| 246 | 247 |
| 247 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 248 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 248 EXPECT_FALSE(request_queue_not_picked_called_); | 249 EXPECT_FALSE(request_queue_not_picked_called_); |
| 249 } | 250 } |
| 250 | 251 |
| 251 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { | 252 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { |
| 252 // We need a custom policy object preferring recency to retry count. | 253 // We need a custom policy object preferring recency to retry count. |
| 253 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, | 254 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 254 !kPreferRetryCount, kMaxStartedTries, | 255 !kPreferRetryCount, kMaxStartedTries, |
| 255 kMaxCompletedTries + 1)); | 256 kMaxCompletedTries + 1)); |
| 256 picker_.reset( | 257 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), |
| 257 new RequestPicker(queue_.get(), policy_.get(), notifier_.get())); | 258 &event_logger_)); |
| 258 | 259 |
| 259 base::Time creation_time = base::Time::Now(); | 260 base::Time creation_time = base::Time::Now(); |
| 260 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, | 261 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 261 kUserRequested); | 262 kUserRequested); |
| 262 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 263 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 263 kUserRequested); | 264 kUserRequested); |
| 264 request2.set_completed_attempt_count(kAttemptCount); | 265 request2.set_completed_attempt_count(kAttemptCount); |
| 265 | 266 |
| 266 QueueRequestsAndChooseOne(request1, request2); | 267 QueueRequestsAndChooseOne(request1, request2); |
| 267 | 268 |
| 268 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 269 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 269 EXPECT_FALSE(request_queue_not_picked_called_); | 270 EXPECT_FALSE(request_queue_not_picked_called_); |
| 270 } | 271 } |
| 271 | 272 |
| 272 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { | 273 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { |
| 273 // We need a custom policy object preferring lower retry count. | 274 // We need a custom policy object preferring lower retry count. |
| 274 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, | 275 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, |
| 275 kPreferRetryCount, kMaxStartedTries, | 276 kPreferRetryCount, kMaxStartedTries, |
| 276 kMaxCompletedTries + 1)); | 277 kMaxCompletedTries + 1)); |
| 277 picker_.reset( | 278 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), |
| 278 new RequestPicker(queue_.get(), policy_.get(), notifier_.get())); | 279 &event_logger_)); |
| 279 | 280 |
| 280 base::Time creation_time = base::Time::Now(); | 281 base::Time creation_time = base::Time::Now(); |
| 281 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, | 282 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 282 kUserRequested); | 283 kUserRequested); |
| 283 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 284 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 284 kUserRequested); | 285 kUserRequested); |
| 285 request2.set_completed_attempt_count(kAttemptCount); | 286 request2.set_completed_attempt_count(kAttemptCount); |
| 286 | 287 |
| 287 QueueRequestsAndChooseOne(request1, request2); | 288 QueueRequestsAndChooseOne(request1, request2); |
| 288 | 289 |
| 289 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 290 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 290 EXPECT_FALSE(request_queue_not_picked_called_); | 291 EXPECT_FALSE(request_queue_not_picked_called_); |
| 291 } | 292 } |
| 292 | 293 |
| 293 TEST_F(RequestPickerTest, ChooseLaterRequest) { | 294 TEST_F(RequestPickerTest, ChooseLaterRequest) { |
| 294 // We need a custom policy preferring recency over retry, and later requests. | 295 // We need a custom policy preferring recency over retry, and later requests. |
| 295 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, | 296 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, |
| 296 !kPreferRetryCount, kMaxStartedTries, | 297 !kPreferRetryCount, kMaxStartedTries, |
| 297 kMaxCompletedTries)); | 298 kMaxCompletedTries)); |
| 298 picker_.reset( | 299 picker_.reset(new RequestPicker(queue_.get(), policy_.get(), notifier_.get(), |
| 299 new RequestPicker(queue_.get(), policy_.get(), notifier_.get())); | 300 &event_logger_)); |
| 300 | 301 |
| 301 base::Time creation_time1 = | 302 base::Time creation_time1 = |
| 302 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 303 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 303 base::Time creation_time2 = base::Time::Now(); | 304 base::Time creation_time2 = base::Time::Now(); |
| 304 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 305 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 305 kUserRequested); | 306 kUserRequested); |
| 306 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 307 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 307 kUserRequested); | 308 kUserRequested); |
| 308 | 309 |
| 309 QueueRequestsAndChooseOne(request1, request2); | 310 QueueRequestsAndChooseOne(request1, request2); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 // With default policy settings, we should choose the earlier request. | 366 // With default policy settings, we should choose the earlier request. |
| 366 // However, we will make the earlier reqeust exceed the limit. | 367 // However, we will make the earlier reqeust exceed the limit. |
| 367 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); | 368 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); |
| 368 | 369 |
| 369 QueueRequestsAndChooseOne(request1, request2); | 370 QueueRequestsAndChooseOne(request1, request2); |
| 370 | 371 |
| 371 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 372 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 372 EXPECT_FALSE(request_queue_not_picked_called_); | 373 EXPECT_FALSE(request_queue_not_picked_called_); |
| 373 } | 374 } |
| 374 } // namespace offline_pages | 375 } // namespace offline_pages |
| OLD | NEW |