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