| 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" |
| 11 #include "components/offline_pages/background/device_conditions.h" | 11 #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" |
| 12 #include "components/offline_pages/background/request_queue.h" | 14 #include "components/offline_pages/background/request_queue.h" |
| 13 #include "components/offline_pages/background/request_queue_in_memory_store.h" | 15 #include "components/offline_pages/background/request_queue_in_memory_store.h" |
| 14 #include "components/offline_pages/background/save_page_request.h" | 16 #include "components/offline_pages/background/save_page_request.h" |
| 15 #include "components/offline_pages/offline_page_item.h" | 17 #include "components/offline_pages/offline_page_item.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 19 |
| 18 namespace offline_pages { | 20 namespace offline_pages { |
| 19 | 21 |
| 20 namespace { | 22 namespace { |
| 21 // Data for request 1. | 23 // Data for request 1. |
| 22 const int64_t kRequestId1 = 17; | 24 const int64_t kRequestId1 = 17; |
| 23 const GURL kUrl1("https://google.com"); | 25 const GURL kUrl1("https://google.com"); |
| 24 const ClientId kClientId1("bookmark", "1234"); | 26 const ClientId kClientId1("bookmark", "1234"); |
| 25 // Data for request 2. | 27 // Data for request 2. |
| 26 const int64_t kRequestId2 = 42; | 28 const int64_t kRequestId2 = 42; |
| 27 const GURL kUrl2("http://nytimes.com"); | 29 const GURL kUrl2("http://nytimes.com"); |
| 28 const ClientId kClientId2("bookmark", "5678"); | 30 const ClientId kClientId2("bookmark", "5678"); |
| 29 const bool kUserRequested = true; | 31 const bool kUserRequested = true; |
| 30 const int kAttemptCount = 1; | 32 const int kAttemptCount = 1; |
| 31 const int kTwoWeeksInSeconds = 60 * 60 * 24 * 7 * 2; | |
| 32 const int kMaxStartedTries = 5; | 33 const int kMaxStartedTries = 5; |
| 33 const int kMaxCompletedTries = 1; | 34 const int kMaxCompletedTries = 1; |
| 34 | 35 |
| 35 // Constants for policy values - These settings represent the default values. | 36 // Constants for policy values - These settings represent the default values. |
| 36 const bool kPreferUntried = false; | 37 const bool kPreferUntried = false; |
| 37 const bool kPreferEarlier = true; | 38 const bool kPreferEarlier = true; |
| 38 const bool kPreferRetryCount = true; | 39 const bool kPreferRetryCount = true; |
| 40 |
| 41 // Default request |
| 42 const SavePageRequest kDefaultRequest(0UL, |
| 43 GURL(""), |
| 44 ClientId("", ""), |
| 45 base::Time(), |
| 46 true); |
| 39 } // namespace | 47 } // namespace |
| 40 | 48 |
| 49 class SchedulerStub : public Scheduler { |
| 50 public: |
| 51 SchedulerStub() |
| 52 : schedule_called_(false), |
| 53 unschedule_called_(false), |
| 54 conditions_(false, 0, false) {} |
| 55 |
| 56 void Schedule(const TriggerConditions& trigger_conditions) override { |
| 57 schedule_called_ = true; |
| 58 conditions_ = trigger_conditions; |
| 59 } |
| 60 |
| 61 // Unschedules the currently scheduled task, if any. |
| 62 void Unschedule() override { unschedule_called_ = true; } |
| 63 |
| 64 bool schedule_called() const { return schedule_called_; } |
| 65 |
| 66 bool unschedule_called() const { return unschedule_called_; } |
| 67 |
| 68 TriggerConditions const* conditions() const { return &conditions_; } |
| 69 |
| 70 private: |
| 71 bool schedule_called_; |
| 72 bool unschedule_called_; |
| 73 TriggerConditions conditions_; |
| 74 }; |
| 75 |
| 76 class OfflinerStub : public Offliner { |
| 77 public: |
| 78 OfflinerStub() |
| 79 : request_(kRequestId1, |
| 80 kUrl1, |
| 81 kClientId1, |
| 82 base::Time::Now(), |
| 83 kUserRequested), |
| 84 enable_callback_(false), |
| 85 cancel_called_(false) {} |
| 86 |
| 87 bool LoadAndSave(const SavePageRequest& request, |
| 88 const CompletionCallback& callback) override { |
| 89 callback_ = callback; |
| 90 request_ = request; |
| 91 // Post the callback on the run loop. |
| 92 if (enable_callback_) { |
| 93 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 94 FROM_HERE, |
| 95 base::Bind(callback, request, Offliner::RequestStatus::SAVED)); |
| 96 } |
| 97 return true; |
| 98 } |
| 99 |
| 100 void Cancel() override { cancel_called_ = true; } |
| 101 |
| 102 void enable_callback(bool enable) { enable_callback_ = enable; } |
| 103 |
| 104 bool cancel_called() { return cancel_called_; } |
| 105 |
| 106 private: |
| 107 CompletionCallback callback_; |
| 108 SavePageRequest request_; |
| 109 bool enable_callback_; |
| 110 bool cancel_called_; |
| 111 }; |
| 112 |
| 113 class OfflinerFactoryStub : public OfflinerFactory { |
| 114 public: |
| 115 OfflinerFactoryStub() : offliner_(nullptr) {} |
| 116 |
| 117 Offliner* GetOffliner(const OfflinerPolicy* policy) override { |
| 118 if (offliner_.get() == nullptr) { |
| 119 offliner_.reset(new OfflinerStub()); |
| 120 } |
| 121 return offliner_.get(); |
| 122 } |
| 123 |
| 124 private: |
| 125 std::unique_ptr<OfflinerStub> offliner_; |
| 126 }; |
| 127 |
| 128 class RequestCoordinatorStub : public RequestCoordinator { |
| 129 public: |
| 130 RequestCoordinatorStub() |
| 131 : RequestCoordinator( |
| 132 std::unique_ptr<OfflinerPolicy>(new OfflinerPolicy()), |
| 133 std::unique_ptr<OfflinerFactory>(new OfflinerFactoryStub()), |
| 134 std::unique_ptr<RequestQueue>( |
| 135 new RequestQueue(std::unique_ptr<RequestQueueInMemoryStore>( |
| 136 new RequestQueueInMemoryStore()))), |
| 137 std::unique_ptr<Scheduler>(new SchedulerStub())), |
| 138 last_expired_request_(kDefaultRequest), |
| 139 total_expired_requests_(0) {} |
| 140 |
| 141 void NotifyFailed(const SavePageRequest& request, |
| 142 SavePageStatus status) override { |
| 143 last_expired_request_ = request; |
| 144 last_request_expiration_status_ = status; |
| 145 total_expired_requests_++; |
| 146 } |
| 147 |
| 148 const SavePageRequest& last_expired_request() { |
| 149 return last_expired_request_; |
| 150 } |
| 151 |
| 152 RequestCoordinator::SavePageStatus last_request_expiration_status() { |
| 153 return last_request_expiration_status_; |
| 154 } |
| 155 |
| 156 private: |
| 157 SavePageStatus last_request_expiration_status_; |
| 158 SavePageRequest last_expired_request_; |
| 159 int32_t total_expired_requests_; |
| 160 }; |
| 161 |
| 41 class RequestPickerTest : public testing::Test { | 162 class RequestPickerTest : public testing::Test { |
| 42 public: | 163 public: |
| 43 RequestPickerTest(); | 164 RequestPickerTest(); |
| 44 | 165 |
| 45 ~RequestPickerTest() override; | 166 ~RequestPickerTest() override; |
| 46 | 167 |
| 47 void SetUp() override; | 168 void SetUp() override; |
| 48 | 169 |
| 49 void PumpLoop(); | 170 void PumpLoop(); |
| 50 | 171 |
| 51 void AddRequestDone(RequestQueue::AddRequestResult result, | 172 void AddRequestDone(RequestQueue::AddRequestResult result, |
| 52 const SavePageRequest& request); | 173 const SavePageRequest& request); |
| 53 | 174 |
| 54 void RequestPicked(const SavePageRequest& request); | 175 void RequestPicked(const SavePageRequest& request); |
| 55 | 176 |
| 56 void RequestQueueEmpty(); | 177 void RequestQueueEmpty(); |
| 57 | 178 |
| 58 void QueueRequestsAndChooseOne(const SavePageRequest& request1, | 179 void QueueRequestsAndChooseOne(const SavePageRequest& request1, |
| 59 const SavePageRequest& request2); | 180 const SavePageRequest& request2); |
| 60 | 181 |
| 182 RequestCoordinatorStub* GetCoordinator() { return coordinator_.get(); } |
| 183 |
| 61 protected: | 184 protected: |
| 62 // The request queue is simple enough we will use a real queue with a memory | 185 // The request queue is simple enough we will use a real queue with a memory |
| 63 // store instead of a stub. | 186 // store instead of a stub. |
| 64 std::unique_ptr<RequestQueue> queue_; | 187 std::unique_ptr<RequestQueue> queue_; |
| 65 std::unique_ptr<RequestPicker> picker_; | 188 std::unique_ptr<RequestPicker> picker_; |
| 189 std::unique_ptr<RequestCoordinatorStub> coordinator_; |
| 66 std::unique_ptr<SavePageRequest> last_picked_; | 190 std::unique_ptr<SavePageRequest> last_picked_; |
| 67 std::unique_ptr<OfflinerPolicy> policy_; | 191 std::unique_ptr<OfflinerPolicy> policy_; |
| 68 bool request_queue_empty_called_; | 192 bool request_queue_empty_called_; |
| 69 | 193 |
| 70 private: | 194 private: |
| 71 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 195 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 72 base::ThreadTaskRunnerHandle task_runner_handle_; | 196 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 73 }; | 197 }; |
| 74 | 198 |
| 75 RequestPickerTest::RequestPickerTest() | 199 RequestPickerTest::RequestPickerTest() |
| 76 : task_runner_(new base::TestSimpleTaskRunner), | 200 : task_runner_(new base::TestSimpleTaskRunner), |
| 77 task_runner_handle_(task_runner_) {} | 201 task_runner_handle_(task_runner_) {} |
| 78 | 202 |
| 79 RequestPickerTest::~RequestPickerTest() {} | 203 RequestPickerTest::~RequestPickerTest() {} |
| 80 | 204 |
| 81 void RequestPickerTest::SetUp() { | 205 void RequestPickerTest::SetUp() { |
| 82 std::unique_ptr<RequestQueueInMemoryStore> store( | 206 std::unique_ptr<RequestQueueInMemoryStore> store( |
| 83 new RequestQueueInMemoryStore()); | 207 new RequestQueueInMemoryStore()); |
| 84 queue_.reset(new RequestQueue(std::move(store))); | 208 queue_.reset(new RequestQueue(std::move(store))); |
| 85 policy_.reset(new OfflinerPolicy()); | 209 policy_.reset(new OfflinerPolicy()); |
| 86 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 210 coordinator_.reset(new RequestCoordinatorStub()); |
| 211 picker_.reset( |
| 212 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get())); |
| 87 request_queue_empty_called_ = false; | 213 request_queue_empty_called_ = false; |
| 88 } | 214 } |
| 89 | 215 |
| 90 void RequestPickerTest::PumpLoop() { | 216 void RequestPickerTest::PumpLoop() { |
| 91 task_runner_->RunUntilIdle(); | 217 task_runner_->RunUntilIdle(); |
| 92 } | 218 } |
| 93 | 219 |
| 94 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, | 220 void RequestPickerTest::AddRequestDone(RequestQueue::AddRequestResult result, |
| 95 const SavePageRequest& request) {} | 221 const SavePageRequest& request) {} |
| 96 | 222 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 // callback. | 266 // callback. |
| 141 PumpLoop(); | 267 PumpLoop(); |
| 142 | 268 |
| 143 EXPECT_TRUE(request_queue_empty_called_); | 269 EXPECT_TRUE(request_queue_empty_called_); |
| 144 } | 270 } |
| 145 | 271 |
| 146 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { | 272 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { |
| 147 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, | 273 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 148 kPreferRetryCount, kMaxStartedTries, | 274 kPreferRetryCount, kMaxStartedTries, |
| 149 kMaxCompletedTries + 1)); | 275 kMaxCompletedTries + 1)); |
| 150 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 276 picker_.reset( |
| 277 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get())); |
| 151 | 278 |
| 152 base::Time creation_time = base::Time::Now(); | 279 base::Time creation_time = base::Time::Now(); |
| 153 SavePageRequest request1( | 280 SavePageRequest request1( |
| 154 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); | 281 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); |
| 155 SavePageRequest request2( | 282 SavePageRequest request2( |
| 156 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); | 283 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); |
| 157 request2.set_completed_attempt_count(kAttemptCount); | 284 request2.set_completed_attempt_count(kAttemptCount); |
| 158 | 285 |
| 159 QueueRequestsAndChooseOne(request1, request2); | 286 QueueRequestsAndChooseOne(request1, request2); |
| 160 | 287 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 175 | 302 |
| 176 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 303 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 177 EXPECT_FALSE(request_queue_empty_called_); | 304 EXPECT_FALSE(request_queue_empty_called_); |
| 178 } | 305 } |
| 179 | 306 |
| 180 TEST_F(RequestPickerTest, ChooseEarlierRequest) { | 307 TEST_F(RequestPickerTest, ChooseEarlierRequest) { |
| 181 // We need a custom policy object prefering recency to retry count. | 308 // We need a custom policy object prefering recency to retry count. |
| 182 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, | 309 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 183 !kPreferRetryCount, kMaxStartedTries, | 310 !kPreferRetryCount, kMaxStartedTries, |
| 184 kMaxCompletedTries)); | 311 kMaxCompletedTries)); |
| 185 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 312 picker_.reset( |
| 313 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get())); |
| 186 | 314 |
| 187 base::Time creation_time1 = | 315 base::Time creation_time1 = |
| 188 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 316 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 189 base::Time creation_time2 = base::Time::Now(); | 317 base::Time creation_time2 = base::Time::Now(); |
| 190 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 318 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 191 kUserRequested); | 319 kUserRequested); |
| 192 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 320 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 193 kUserRequested); | 321 kUserRequested); |
| 194 request2.set_completed_attempt_count(kAttemptCount); | 322 request2.set_completed_attempt_count(kAttemptCount); |
| 195 | 323 |
| 196 QueueRequestsAndChooseOne(request1, request2); | 324 QueueRequestsAndChooseOne(request1, request2); |
| 197 | 325 |
| 198 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 326 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 199 EXPECT_FALSE(request_queue_empty_called_); | 327 EXPECT_FALSE(request_queue_empty_called_); |
| 200 } | 328 } |
| 201 | 329 |
| 202 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { | 330 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { |
| 203 // We need a custom policy object preferring recency to retry count. | 331 // We need a custom policy object preferring recency to retry count. |
| 204 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, | 332 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 205 !kPreferRetryCount, kMaxStartedTries, | 333 !kPreferRetryCount, kMaxStartedTries, |
| 206 kMaxCompletedTries + 1)); | 334 kMaxCompletedTries + 1)); |
| 207 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 335 picker_.reset( |
| 336 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get())); |
| 208 | 337 |
| 209 base::Time creation_time = base::Time::Now(); | 338 base::Time creation_time = base::Time::Now(); |
| 210 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, | 339 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 211 kUserRequested); | 340 kUserRequested); |
| 212 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 341 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 213 kUserRequested); | 342 kUserRequested); |
| 214 request2.set_completed_attempt_count(kAttemptCount); | 343 request2.set_completed_attempt_count(kAttemptCount); |
| 215 | 344 |
| 216 QueueRequestsAndChooseOne(request1, request2); | 345 QueueRequestsAndChooseOne(request1, request2); |
| 217 | 346 |
| 218 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 347 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 219 EXPECT_FALSE(request_queue_empty_called_); | 348 EXPECT_FALSE(request_queue_empty_called_); |
| 220 } | 349 } |
| 221 | 350 |
| 222 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { | 351 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { |
| 223 // We need a custom policy object preferring lower retry count. | 352 // We need a custom policy object preferring lower retry count. |
| 224 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, | 353 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, |
| 225 kPreferRetryCount, kMaxStartedTries, | 354 kPreferRetryCount, kMaxStartedTries, |
| 226 kMaxCompletedTries + 1)); | 355 kMaxCompletedTries + 1)); |
| 227 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 356 picker_.reset( |
| 357 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get())); |
| 228 | 358 |
| 229 base::Time creation_time = base::Time::Now(); | 359 base::Time creation_time = base::Time::Now(); |
| 230 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, | 360 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 231 kUserRequested); | 361 kUserRequested); |
| 232 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 362 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 233 kUserRequested); | 363 kUserRequested); |
| 234 request2.set_completed_attempt_count(kAttemptCount); | 364 request2.set_completed_attempt_count(kAttemptCount); |
| 235 | 365 |
| 236 QueueRequestsAndChooseOne(request1, request2); | 366 QueueRequestsAndChooseOne(request1, request2); |
| 237 | 367 |
| 238 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 368 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 239 EXPECT_FALSE(request_queue_empty_called_); | 369 EXPECT_FALSE(request_queue_empty_called_); |
| 240 } | 370 } |
| 241 | 371 |
| 242 TEST_F(RequestPickerTest, ChooseLaterRequest) { | 372 TEST_F(RequestPickerTest, ChooseLaterRequest) { |
| 243 // We need a custom policy preferring recency over retry, and later requests. | 373 // We need a custom policy preferring recency over retry, and later requests. |
| 244 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, | 374 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, |
| 245 !kPreferRetryCount, kMaxStartedTries, | 375 !kPreferRetryCount, kMaxStartedTries, |
| 246 kMaxCompletedTries)); | 376 kMaxCompletedTries)); |
| 247 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 377 picker_.reset( |
| 378 new RequestPicker(queue_.get(), policy_.get(), coordinator_.get())); |
| 248 | 379 |
| 249 base::Time creation_time1 = | 380 base::Time creation_time1 = |
| 250 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 381 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 251 base::Time creation_time2 = base::Time::Now(); | 382 base::Time creation_time2 = base::Time::Now(); |
| 252 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 383 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 253 kUserRequested); | 384 kUserRequested); |
| 254 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 385 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 255 kUserRequested); | 386 kUserRequested); |
| 256 | 387 |
| 257 QueueRequestsAndChooseOne(request1, request2); | 388 QueueRequestsAndChooseOne(request1, request2); |
| 258 | 389 |
| 259 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 390 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 260 EXPECT_FALSE(request_queue_empty_called_); | 391 EXPECT_FALSE(request_queue_empty_called_); |
| 261 } | 392 } |
| 262 | 393 |
| 263 TEST_F(RequestPickerTest, ChooseUnexpiredRequest) { | 394 TEST_F(RequestPickerTest, ChooseNonExpiredRequest) { |
| 264 base::Time creation_time1 = | 395 base::Time creation_time = base::Time::Now(); |
| 265 base::Time::Now() - base::TimeDelta::FromSeconds(kTwoWeeksInSeconds); | 396 base::Time expired_time = |
| 266 base::Time creation_time2 = base::Time::Now(); | 397 creation_time - |
| 267 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 398 base::TimeDelta::FromSeconds(kRequestExpirationTimeInSeconds + 60); |
| 399 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 268 kUserRequested); | 400 kUserRequested); |
| 269 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 401 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time, |
| 270 kUserRequested); | 402 kUserRequested); |
| 271 | 403 |
| 272 QueueRequestsAndChooseOne(request1, request2); | 404 QueueRequestsAndChooseOne(request1, request2); |
| 273 | 405 |
| 274 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 406 PumpLoop(); |
| 407 |
| 408 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 275 EXPECT_FALSE(request_queue_empty_called_); | 409 EXPECT_FALSE(request_queue_empty_called_); |
| 410 EXPECT_EQ(kRequestId2, GetCoordinator()->last_expired_request().request_id()); |
| 411 EXPECT_EQ(RequestCoordinator::SavePageStatus::EXPIRED, |
| 412 GetCoordinator()->last_request_expiration_status()); |
| 276 } | 413 } |
| 277 | 414 |
| 278 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { | 415 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { |
| 279 base::Time creation_time1 = | 416 base::Time creation_time1 = |
| 280 base::Time::Now() - base::TimeDelta::FromSeconds(1); | 417 base::Time::Now() - base::TimeDelta::FromSeconds(1); |
| 281 base::Time creation_time2 = base::Time::Now(); | 418 base::Time creation_time2 = base::Time::Now(); |
| 282 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 419 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 283 kUserRequested); | 420 kUserRequested); |
| 284 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 421 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 285 kUserRequested); | 422 kUserRequested); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 306 // With default policy settings, we should choose the earlier request. | 443 // With default policy settings, we should choose the earlier request. |
| 307 // However, we will make the earlier reqeust exceed the limit. | 444 // However, we will make the earlier reqeust exceed the limit. |
| 308 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); | 445 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); |
| 309 | 446 |
| 310 QueueRequestsAndChooseOne(request1, request2); | 447 QueueRequestsAndChooseOne(request1, request2); |
| 311 | 448 |
| 312 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 449 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 313 EXPECT_FALSE(request_queue_empty_called_); | 450 EXPECT_FALSE(request_queue_empty_called_); |
| 314 } | 451 } |
| 315 } // namespace offline_pages | 452 } // namespace offline_pages |
| OLD | NEW |