| 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 11 matching lines...) Expand all Loading... |
| 22 const int64_t kRequestId1 = 17; | 22 const int64_t kRequestId1 = 17; |
| 23 const GURL kUrl1("https://google.com"); | 23 const GURL kUrl1("https://google.com"); |
| 24 const ClientId kClientId1("bookmark", "1234"); | 24 const ClientId kClientId1("bookmark", "1234"); |
| 25 // Data for request 2. | 25 // Data for request 2. |
| 26 const int64_t kRequestId2 = 42; | 26 const int64_t kRequestId2 = 42; |
| 27 const GURL kUrl2("http://nytimes.com"); | 27 const GURL kUrl2("http://nytimes.com"); |
| 28 const ClientId kClientId2("bookmark", "5678"); | 28 const ClientId kClientId2("bookmark", "5678"); |
| 29 const bool kUserRequested = true; | 29 const bool kUserRequested = true; |
| 30 const int kAttemptCount = 1; | 30 const int kAttemptCount = 1; |
| 31 const int kTwoWeeksInSeconds = 60 * 60 * 24 * 7 * 2; | 31 const int kTwoWeeksInSeconds = 60 * 60 * 24 * 7 * 2; |
| 32 const int kMaxStartedTries = 5; |
| 33 const int kMaxCompletedTries = 1; |
| 32 | 34 |
| 33 // Constants for policy values - These settings represent the default values. | 35 // Constants for policy values - These settings represent the default values. |
| 34 const bool kPreferUntried = false; | 36 const bool kPreferUntried = false; |
| 35 const bool kPreferEarlier = true; | 37 const bool kPreferEarlier = true; |
| 36 const bool kPreferRetryCount = true; | 38 const bool kPreferRetryCount = true; |
| 37 } // namespace | 39 } // namespace |
| 38 | 40 |
| 39 class RequestPickerTest : public testing::Test { | 41 class RequestPickerTest : public testing::Test { |
| 40 public: | 42 public: |
| 41 RequestPickerTest(); | 43 RequestPickerTest(); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 | 137 |
| 136 // Pump the loop again to give the async queue the opportunity to return | 138 // Pump the loop again to give the async queue the opportunity to return |
| 137 // results from the Get operation, and for the picker to call the "QueueEmpty" | 139 // results from the Get operation, and for the picker to call the "QueueEmpty" |
| 138 // callback. | 140 // callback. |
| 139 PumpLoop(); | 141 PumpLoop(); |
| 140 | 142 |
| 141 EXPECT_TRUE(request_queue_empty_called_); | 143 EXPECT_TRUE(request_queue_empty_called_); |
| 142 } | 144 } |
| 143 | 145 |
| 144 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { | 146 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) { |
| 147 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 148 kPreferRetryCount, kMaxStartedTries, |
| 149 kMaxCompletedTries + 1)); |
| 150 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); |
| 151 |
| 145 base::Time creation_time = base::Time::Now(); | 152 base::Time creation_time = base::Time::Now(); |
| 146 SavePageRequest request1( | 153 SavePageRequest request1( |
| 147 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); | 154 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested); |
| 148 SavePageRequest request2( | 155 SavePageRequest request2( |
| 149 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); | 156 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); |
| 150 request2.set_attempt_count(kAttemptCount); | 157 request2.set_completed_attempt_count(kAttemptCount); |
| 151 | 158 |
| 152 QueueRequestsAndChooseOne(request1, request2); | 159 QueueRequestsAndChooseOne(request1, request2); |
| 153 | 160 |
| 154 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 161 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 155 EXPECT_FALSE(request_queue_empty_called_); | 162 EXPECT_FALSE(request_queue_empty_called_); |
| 156 } | 163 } |
| 157 | 164 |
| 158 TEST_F(RequestPickerTest, ChooseRequestWithSameRetryCountButEarlier) { | 165 TEST_F(RequestPickerTest, ChooseRequestWithSameRetryCountButEarlier) { |
| 159 base::Time creation_time1 = | 166 base::Time creation_time1 = |
| 160 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 167 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 161 base::Time creation_time2 = base::Time::Now(); | 168 base::Time creation_time2 = base::Time::Now(); |
| 162 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 169 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 163 kUserRequested); | 170 kUserRequested); |
| 164 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 171 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 165 kUserRequested); | 172 kUserRequested); |
| 166 | 173 |
| 167 QueueRequestsAndChooseOne(request1, request2); | 174 QueueRequestsAndChooseOne(request1, request2); |
| 168 | 175 |
| 169 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 176 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 170 EXPECT_FALSE(request_queue_empty_called_); | 177 EXPECT_FALSE(request_queue_empty_called_); |
| 171 } | 178 } |
| 172 | 179 |
| 173 TEST_F(RequestPickerTest, ChooseEarlierRequest) { | 180 TEST_F(RequestPickerTest, ChooseEarlierRequest) { |
| 174 // We need a custom policy object prefering recency to retry count. | 181 // We need a custom policy object prefering recency to retry count. |
| 175 policy_.reset( | 182 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 176 new OfflinerPolicy(kPreferUntried, kPreferEarlier, !kPreferRetryCount)); | 183 !kPreferRetryCount, kMaxStartedTries, |
| 184 kMaxCompletedTries)); |
| 177 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 185 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); |
| 178 | 186 |
| 179 base::Time creation_time1 = | 187 base::Time creation_time1 = |
| 180 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 188 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 181 base::Time creation_time2 = base::Time::Now(); | 189 base::Time creation_time2 = base::Time::Now(); |
| 182 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 190 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 183 kUserRequested); | 191 kUserRequested); |
| 184 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 192 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 185 kUserRequested); | 193 kUserRequested); |
| 186 request2.set_attempt_count(kAttemptCount); | 194 request2.set_completed_attempt_count(kAttemptCount); |
| 187 | 195 |
| 188 QueueRequestsAndChooseOne(request1, request2); | 196 QueueRequestsAndChooseOne(request1, request2); |
| 189 | 197 |
| 190 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 198 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 191 EXPECT_FALSE(request_queue_empty_called_); | 199 EXPECT_FALSE(request_queue_empty_called_); |
| 192 } | 200 } |
| 193 | 201 |
| 194 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { | 202 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) { |
| 195 // We need a custom policy object preferring recency to retry count. | 203 // We need a custom policy object preferring recency to retry count. |
| 196 policy_.reset( | 204 policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, |
| 197 new OfflinerPolicy(kPreferUntried, kPreferEarlier, !kPreferRetryCount)); | 205 !kPreferRetryCount, kMaxStartedTries, |
| 206 kMaxCompletedTries + 1)); |
| 198 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 207 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); |
| 199 | 208 |
| 200 base::Time creation_time = base::Time::Now(); | 209 base::Time creation_time = base::Time::Now(); |
| 201 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, | 210 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 202 kUserRequested); | 211 kUserRequested); |
| 203 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 212 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 204 kUserRequested); | 213 kUserRequested); |
| 205 request2.set_attempt_count(kAttemptCount); | 214 request2.set_completed_attempt_count(kAttemptCount); |
| 206 | 215 |
| 207 QueueRequestsAndChooseOne(request1, request2); | 216 QueueRequestsAndChooseOne(request1, request2); |
| 208 | 217 |
| 209 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 218 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 210 EXPECT_FALSE(request_queue_empty_called_); | 219 EXPECT_FALSE(request_queue_empty_called_); |
| 211 } | 220 } |
| 212 | 221 |
| 213 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { | 222 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) { |
| 214 // We need a custom policy object preferring lower retry count. | 223 // We need a custom policy object preferring lower retry count. |
| 215 policy_.reset( | 224 policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, |
| 216 new OfflinerPolicy(!kPreferUntried, kPreferEarlier, kPreferRetryCount)); | 225 kPreferRetryCount, kMaxStartedTries, |
| 226 kMaxCompletedTries + 1)); |
| 217 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 227 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); |
| 218 | 228 |
| 219 base::Time creation_time = base::Time::Now(); | 229 base::Time creation_time = base::Time::Now(); |
| 220 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, | 230 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time, |
| 221 kUserRequested); | 231 kUserRequested); |
| 222 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 232 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 223 kUserRequested); | 233 kUserRequested); |
| 224 request2.set_attempt_count(kAttemptCount); | 234 request2.set_completed_attempt_count(kAttemptCount); |
| 225 | 235 |
| 226 QueueRequestsAndChooseOne(request1, request2); | 236 QueueRequestsAndChooseOne(request1, request2); |
| 227 | 237 |
| 228 EXPECT_EQ(kRequestId1, last_picked_->request_id()); | 238 EXPECT_EQ(kRequestId1, last_picked_->request_id()); |
| 229 EXPECT_FALSE(request_queue_empty_called_); | 239 EXPECT_FALSE(request_queue_empty_called_); |
| 230 } | 240 } |
| 231 | 241 |
| 232 TEST_F(RequestPickerTest, ChooseLaterRequest) { | 242 TEST_F(RequestPickerTest, ChooseLaterRequest) { |
| 233 // We need a custom policy preferring recency over retry, and later requests. | 243 // We need a custom policy preferring recency over retry, and later requests. |
| 234 policy_.reset( | 244 policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, |
| 235 new OfflinerPolicy(kPreferUntried, !kPreferEarlier, !kPreferRetryCount)); | 245 !kPreferRetryCount, kMaxStartedTries, |
| 246 kMaxCompletedTries)); |
| 236 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); | 247 picker_.reset(new RequestPicker(queue_.get(), policy_.get())); |
| 237 | 248 |
| 238 base::Time creation_time1 = | 249 base::Time creation_time1 = |
| 239 base::Time::Now() - base::TimeDelta::FromSeconds(10); | 250 base::Time::Now() - base::TimeDelta::FromSeconds(10); |
| 240 base::Time creation_time2 = base::Time::Now(); | 251 base::Time creation_time2 = base::Time::Now(); |
| 241 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, | 252 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 242 kUserRequested); | 253 kUserRequested); |
| 243 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 254 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 244 kUserRequested); | 255 kUserRequested); |
| 245 | 256 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 257 kUserRequested); | 268 kUserRequested); |
| 258 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, | 269 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 259 kUserRequested); | 270 kUserRequested); |
| 260 | 271 |
| 261 QueueRequestsAndChooseOne(request1, request2); | 272 QueueRequestsAndChooseOne(request1, request2); |
| 262 | 273 |
| 263 EXPECT_EQ(kRequestId2, last_picked_->request_id()); | 274 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 264 EXPECT_FALSE(request_queue_empty_called_); | 275 EXPECT_FALSE(request_queue_empty_called_); |
| 265 } | 276 } |
| 266 | 277 |
| 278 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededStartLimit) { |
| 279 base::Time creation_time1 = |
| 280 base::Time::Now() - base::TimeDelta::FromSeconds(1); |
| 281 base::Time creation_time2 = base::Time::Now(); |
| 282 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 283 kUserRequested); |
| 284 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 285 kUserRequested); |
| 286 |
| 287 // With default policy settings, we should choose the earlier request. |
| 288 // However, we will make the earlier reqeust exceed the limit. |
| 289 request1.set_started_attempt_count(policy_->GetMaxStartedTries()); |
| 290 |
| 291 QueueRequestsAndChooseOne(request1, request2); |
| 292 |
| 293 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 294 EXPECT_FALSE(request_queue_empty_called_); |
| 295 } |
| 296 |
| 297 TEST_F(RequestPickerTest, ChooseRequestThatHasNotExceededCompletionLimit) { |
| 298 base::Time creation_time1 = |
| 299 base::Time::Now() - base::TimeDelta::FromSeconds(1); |
| 300 base::Time creation_time2 = base::Time::Now(); |
| 301 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1, |
| 302 kUserRequested); |
| 303 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2, |
| 304 kUserRequested); |
| 305 |
| 306 // With default policy settings, we should choose the earlier request. |
| 307 // However, we will make the earlier reqeust exceed the limit. |
| 308 request1.set_completed_attempt_count(policy_->GetMaxCompletedTries()); |
| 309 |
| 310 QueueRequestsAndChooseOne(request1, request2); |
| 311 |
| 312 EXPECT_EQ(kRequestId2, last_picked_->request_id()); |
| 313 EXPECT_FALSE(request_queue_empty_called_); |
| 314 } |
| 267 } // namespace offline_pages | 315 } // namespace offline_pages |
| OLD | NEW |