| 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_coordinator.h" | 5 #include "components/offline_pages/background/request_coordinator.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 namespace offline_pages { | 28 namespace offline_pages { |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 // put test constants here | 31 // put test constants here |
| 32 const GURL kUrl("http://universe.com/everything"); | 32 const GURL kUrl("http://universe.com/everything"); |
| 33 const ClientId kClientId("bookmark", "42"); | 33 const ClientId kClientId("bookmark", "42"); |
| 34 const int kRequestId(1); | 34 const int kRequestId(1); |
| 35 const long kTestTimeoutSeconds = 1; | 35 const long kTestTimeoutSeconds = 1; |
| 36 const int kBatteryPercentageHigh = 75; | 36 const int kBatteryPercentageHigh = 75; |
| 37 const bool kPowerRequired = true; | 37 const bool kPowerRequired = true; |
| 38 const bool kUserRequested = true; |
| 38 } // namespace | 39 } // namespace |
| 39 | 40 |
| 40 class SchedulerStub : public Scheduler { | 41 class SchedulerStub : public Scheduler { |
| 41 public: | 42 public: |
| 42 SchedulerStub() | 43 SchedulerStub() |
| 43 : schedule_called_(false), | 44 : schedule_called_(false), |
| 44 unschedule_called_(false), | 45 unschedule_called_(false), |
| 45 conditions_(false, 0, false) {} | 46 conditions_(false, 0, false) {} |
| 46 | 47 |
| 47 void Schedule(const TriggerConditions& trigger_conditions) override { | 48 void Schedule(const TriggerConditions& trigger_conditions) override { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 62 | 63 |
| 63 private: | 64 private: |
| 64 bool schedule_called_; | 65 bool schedule_called_; |
| 65 bool unschedule_called_; | 66 bool unschedule_called_; |
| 66 TriggerConditions conditions_; | 67 TriggerConditions conditions_; |
| 67 }; | 68 }; |
| 68 | 69 |
| 69 class OfflinerStub : public Offliner { | 70 class OfflinerStub : public Offliner { |
| 70 public: | 71 public: |
| 71 OfflinerStub() | 72 OfflinerStub() |
| 72 : request_(kRequestId, kUrl, kClientId, base::Time::Now()), | 73 : request_(kRequestId, kUrl, kClientId, base::Time::Now(), |
| 74 kUserRequested), |
| 73 enable_callback_(false), | 75 enable_callback_(false), |
| 74 cancel_called_(false) {} | 76 cancel_called_(false) {} |
| 75 | 77 |
| 76 bool LoadAndSave(const SavePageRequest& request, | 78 bool LoadAndSave(const SavePageRequest& request, |
| 77 const CompletionCallback& callback) override { | 79 const CompletionCallback& callback) override { |
| 78 callback_ = callback; | 80 callback_ = callback; |
| 79 request_ = request; | 81 request_ = request; |
| 80 // Post the callback on the run loop. | 82 // Post the callback on the run loop. |
| 81 if (enable_callback_) { | 83 if (enable_callback_) { |
| 82 base::ThreadTaskRunnerHandle::Get()->PostTask( | 84 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 } | 165 } |
| 164 | 166 |
| 165 void EnableOfflinerCallback(bool enable) { | 167 void EnableOfflinerCallback(bool enable) { |
| 166 offliner_->enable_callback(enable); | 168 offliner_->enable_callback(enable); |
| 167 } | 169 } |
| 168 | 170 |
| 169 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { | 171 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { |
| 170 coordinator_->SetOfflinerTimeoutForTest(timeout); | 172 coordinator_->SetOfflinerTimeoutForTest(timeout); |
| 171 } | 173 } |
| 172 | 174 |
| 175 void SetDeviceConditionsForTest(DeviceConditions device_conditions) { |
| 176 coordinator_->SetDeviceConditionsForTest(device_conditions); |
| 177 } |
| 178 |
| 173 void WaitForCallback() { | 179 void WaitForCallback() { |
| 174 waiter_.Wait(); | 180 waiter_.Wait(); |
| 175 } | 181 } |
| 176 | 182 |
| 177 void AdvanceClockBy(base::TimeDelta delta) { | 183 void AdvanceClockBy(base::TimeDelta delta) { |
| 178 task_runner_->FastForwardBy(delta); | 184 task_runner_->FastForwardBy(delta); |
| 179 } | 185 } |
| 180 | 186 |
| 181 Offliner::RequestStatus last_offlining_status() const { | 187 Offliner::RequestStatus last_offlining_status() const { |
| 182 return coordinator_->last_offlining_status_; | 188 return coordinator_->last_offlining_status_; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 net::NetworkChangeNotifier::CONNECTION_3G); | 251 net::NetworkChangeNotifier::CONNECTION_3G); |
| 246 base::Callback<void(bool)> callback = | 252 base::Callback<void(bool)> callback = |
| 247 base::Bind( | 253 base::Bind( |
| 248 &RequestCoordinatorTest::EmptyCallbackFunction, | 254 &RequestCoordinatorTest::EmptyCallbackFunction, |
| 249 base::Unretained(this)); | 255 base::Unretained(this)); |
| 250 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); | 256 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); |
| 251 } | 257 } |
| 252 | 258 |
| 253 TEST_F(RequestCoordinatorTest, StartProcessingWithRequestInProgress) { | 259 TEST_F(RequestCoordinatorTest, StartProcessingWithRequestInProgress) { |
| 254 // Put the request on the queue. | 260 // Put the request on the queue. |
| 255 EXPECT_TRUE(coordinator()->SavePageLater(kUrl, kClientId)); | 261 EXPECT_TRUE(coordinator()->SavePageLater(kUrl, kClientId, kUserRequested)); |
| 256 | 262 |
| 257 // Set up for the call to StartProcessing by building arguments. | 263 // Set up for the call to StartProcessing by building arguments. |
| 258 DeviceConditions device_conditions(false, 75, | 264 DeviceConditions device_conditions(false, 75, |
| 259 net::NetworkChangeNotifier::CONNECTION_3G); | 265 net::NetworkChangeNotifier::CONNECTION_3G); |
| 260 base::Callback<void(bool)> callback = | 266 base::Callback<void(bool)> callback = |
| 261 base::Bind(&RequestCoordinatorTest::EmptyCallbackFunction, | 267 base::Bind(&RequestCoordinatorTest::EmptyCallbackFunction, |
| 262 base::Unretained(this)); | 268 base::Unretained(this)); |
| 263 | 269 |
| 264 // Ensure that the forthcoming request does not finish - we simulate it being | 270 // Ensure that the forthcoming request does not finish - we simulate it being |
| 265 // in progress by asking it to skip making the completion callback. | 271 // in progress by asking it to skip making the completion callback. |
| 266 EnableOfflinerCallback(false); | 272 EnableOfflinerCallback(false); |
| 267 | 273 |
| 268 // Sending the request to the offliner should make it busy. | 274 // Sending the request to the offliner should make it busy. |
| 269 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); | 275 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); |
| 270 PumpLoop(); | 276 PumpLoop(); |
| 271 EXPECT_TRUE(is_busy()); | 277 EXPECT_TRUE(is_busy()); |
| 272 | 278 |
| 273 // Now trying to start processing on another request should return false. | 279 // Now trying to start processing on another request should return false. |
| 274 EXPECT_FALSE(coordinator()->StartProcessing(device_conditions, callback)); | 280 EXPECT_FALSE(coordinator()->StartProcessing(device_conditions, callback)); |
| 275 } | 281 } |
| 276 | 282 |
| 277 TEST_F(RequestCoordinatorTest, SavePageLater) { | 283 TEST_F(RequestCoordinatorTest, SavePageLater) { |
| 278 EXPECT_TRUE(coordinator()->SavePageLater(kUrl, kClientId)); | 284 EXPECT_TRUE(coordinator()->SavePageLater(kUrl, kClientId, kUserRequested)); |
| 279 | 285 |
| 280 // Expect that a request got placed on the queue. | 286 // Expect that a request got placed on the queue. |
| 281 coordinator()->queue()->GetRequests( | 287 coordinator()->queue()->GetRequests( |
| 282 base::Bind(&RequestCoordinatorTest::GetRequestsDone, | 288 base::Bind(&RequestCoordinatorTest::GetRequestsDone, |
| 283 base::Unretained(this))); | 289 base::Unretained(this))); |
| 284 | 290 |
| 285 // Wait for callbacks to finish, both request queue and offliner. | 291 // Wait for callbacks to finish, both request queue and offliner. |
| 286 PumpLoop(); | 292 PumpLoop(); |
| 287 | 293 |
| 288 // Check the request queue is as expected. | 294 // Check the request queue is as expected. |
| 289 EXPECT_EQ(1UL, last_requests().size()); | 295 EXPECT_EQ(1UL, last_requests().size()); |
| 290 EXPECT_EQ(kUrl, last_requests()[0].url()); | 296 EXPECT_EQ(kUrl, last_requests()[0].url()); |
| 291 EXPECT_EQ(kClientId, last_requests()[0].client_id()); | 297 EXPECT_EQ(kClientId, last_requests()[0].client_id()); |
| 292 | 298 |
| 293 // Expect that the scheduler got notified. | 299 // Expect that the scheduler got notified. |
| 294 SchedulerStub* scheduler_stub = reinterpret_cast<SchedulerStub*>( | 300 SchedulerStub* scheduler_stub = reinterpret_cast<SchedulerStub*>( |
| 295 coordinator()->scheduler()); | 301 coordinator()->scheduler()); |
| 296 EXPECT_TRUE(scheduler_stub->schedule_called()); | 302 EXPECT_TRUE(scheduler_stub->schedule_called()); |
| 297 EXPECT_EQ(coordinator() | 303 EXPECT_EQ(coordinator() |
| 298 ->GetTriggerConditionsForUserRequest() | 304 ->GetTriggerConditionsForUserRequest() |
| 299 .minimum_battery_percentage, | 305 .minimum_battery_percentage, |
| 300 scheduler_stub->conditions()->minimum_battery_percentage); | 306 scheduler_stub->conditions()->minimum_battery_percentage); |
| 301 } | 307 } |
| 302 | 308 |
| 303 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestSucceeded) { | 309 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestSucceeded) { |
| 304 // Add a request to the queue, wait for callbacks to finish. | 310 // Add a request to the queue, wait for callbacks to finish. |
| 305 offline_pages::SavePageRequest request( | 311 offline_pages::SavePageRequest request( |
| 306 kRequestId, kUrl, kClientId, base::Time::Now()); | 312 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 307 coordinator()->queue()->AddRequest( | 313 coordinator()->queue()->AddRequest( |
| 308 request, | 314 request, |
| 309 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 315 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 310 base::Unretained(this))); | 316 base::Unretained(this))); |
| 311 PumpLoop(); | 317 PumpLoop(); |
| 312 | 318 |
| 313 // We need to give a callback to the request. | 319 // We need to give a callback to the request. |
| 314 base::Callback<void(bool)> callback = | 320 base::Callback<void(bool)> callback = |
| 315 base::Bind( | 321 base::Bind( |
| 316 &RequestCoordinatorTest::EmptyCallbackFunction, | 322 &RequestCoordinatorTest::EmptyCallbackFunction, |
| 317 base::Unretained(this)); | 323 base::Unretained(this)); |
| 318 coordinator()->SetProcessingCallbackForTest(callback); | 324 coordinator()->SetProcessingCallbackForTest(callback); |
| 319 | 325 |
| 326 // Set up device conditions for the test. |
| 327 DeviceConditions device_conditions( |
| 328 false, 75, net::NetworkChangeNotifier::CONNECTION_3G); |
| 329 SetDeviceConditionsForTest(device_conditions); |
| 330 |
| 320 // Call the OfflinerDoneCallback to simulate the page being completed, wait | 331 // Call the OfflinerDoneCallback to simulate the page being completed, wait |
| 321 // for callbacks. | 332 // for callbacks. |
| 322 EnableOfflinerCallback(true); | 333 EnableOfflinerCallback(true); |
| 323 SendOfflinerDoneCallback(request, Offliner::RequestStatus::SAVED); | 334 SendOfflinerDoneCallback(request, Offliner::RequestStatus::SAVED); |
| 324 PumpLoop(); | 335 PumpLoop(); |
| 325 | 336 |
| 326 // Verify the request gets removed from the queue, and wait for callbacks. | 337 // Verify the request gets removed from the queue, and wait for callbacks. |
| 327 coordinator()->queue()->GetRequests( | 338 coordinator()->queue()->GetRequests( |
| 328 base::Bind(&RequestCoordinatorTest::GetRequestsDone, | 339 base::Bind(&RequestCoordinatorTest::GetRequestsDone, |
| 329 base::Unretained(this))); | 340 base::Unretained(this))); |
| 330 PumpLoop(); | 341 PumpLoop(); |
| 331 | 342 |
| 332 // We should not find any requests in the queue anymore. | 343 // We should not find any requests in the queue anymore. |
| 333 // RequestPicker should *not* have tried to start an additional job, | 344 // RequestPicker should *not* have tried to start an additional job, |
| 334 // because the request queue is empty now. | 345 // because the request queue is empty now. |
| 335 EXPECT_EQ(0UL, last_requests().size()); | 346 EXPECT_EQ(0UL, last_requests().size()); |
| 336 } | 347 } |
| 337 | 348 |
| 338 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestFailed) { | 349 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestFailed) { |
| 339 // Add a request to the queue, wait for callbacks to finish. | 350 // Add a request to the queue, wait for callbacks to finish. |
| 340 offline_pages::SavePageRequest request( | 351 offline_pages::SavePageRequest request( |
| 341 kRequestId, kUrl, kClientId, base::Time::Now()); | 352 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 342 coordinator()->queue()->AddRequest( | 353 coordinator()->queue()->AddRequest( |
| 343 request, | 354 request, |
| 344 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 355 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 345 base::Unretained(this))); | 356 base::Unretained(this))); |
| 346 PumpLoop(); | 357 PumpLoop(); |
| 347 | 358 |
| 348 // We need to give a callback to the request. | 359 // We need to give a callback to the request. |
| 349 base::Callback<void(bool)> callback = | 360 base::Callback<void(bool)> callback = |
| 350 base::Bind( | 361 base::Bind( |
| 351 &RequestCoordinatorTest::EmptyCallbackFunction, | 362 &RequestCoordinatorTest::EmptyCallbackFunction, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 368 // Still one request in the queue. | 379 // Still one request in the queue. |
| 369 EXPECT_EQ(1UL, last_requests().size()); | 380 EXPECT_EQ(1UL, last_requests().size()); |
| 370 // TODO(dougarnett): Verify retry count gets incremented. | 381 // TODO(dougarnett): Verify retry count gets incremented. |
| 371 } | 382 } |
| 372 | 383 |
| 373 // This tests a StopProcessing call before we have actually started the | 384 // This tests a StopProcessing call before we have actually started the |
| 374 // prerenderer. | 385 // prerenderer. |
| 375 TEST_F(RequestCoordinatorTest, StartProcessingThenStopProcessingImmediately) { | 386 TEST_F(RequestCoordinatorTest, StartProcessingThenStopProcessingImmediately) { |
| 376 // Add a request to the queue, wait for callbacks to finish. | 387 // Add a request to the queue, wait for callbacks to finish. |
| 377 offline_pages::SavePageRequest request( | 388 offline_pages::SavePageRequest request( |
| 378 kRequestId, kUrl, kClientId, base::Time::Now()); | 389 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 379 coordinator()->queue()->AddRequest( | 390 coordinator()->queue()->AddRequest( |
| 380 request, | 391 request, |
| 381 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 392 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 382 base::Unretained(this))); | 393 base::Unretained(this))); |
| 383 PumpLoop(); | 394 PumpLoop(); |
| 384 | 395 |
| 385 DeviceConditions device_conditions(false, 75, | 396 DeviceConditions device_conditions(false, 75, |
| 386 net::NetworkChangeNotifier::CONNECTION_3G); | 397 net::NetworkChangeNotifier::CONNECTION_3G); |
| 387 base::Callback<void(bool)> callback = | 398 base::Callback<void(bool)> callback = |
| 388 base::Bind( | 399 base::Bind( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 402 last_offlining_status()); | 413 last_offlining_status()); |
| 403 | 414 |
| 404 // Since offliner was not started, it will not have seen cancel call. | 415 // Since offliner was not started, it will not have seen cancel call. |
| 405 EXPECT_FALSE(OfflinerWasCanceled()); | 416 EXPECT_FALSE(OfflinerWasCanceled()); |
| 406 } | 417 } |
| 407 | 418 |
| 408 // This tests a StopProcessing call after the prerenderer has been started. | 419 // This tests a StopProcessing call after the prerenderer has been started. |
| 409 TEST_F(RequestCoordinatorTest, StartProcessingThenStopProcessingLater) { | 420 TEST_F(RequestCoordinatorTest, StartProcessingThenStopProcessingLater) { |
| 410 // Add a request to the queue, wait for callbacks to finish. | 421 // Add a request to the queue, wait for callbacks to finish. |
| 411 offline_pages::SavePageRequest request( | 422 offline_pages::SavePageRequest request( |
| 412 kRequestId, kUrl, kClientId, base::Time::Now()); | 423 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 413 coordinator()->queue()->AddRequest( | 424 coordinator()->queue()->AddRequest( |
| 414 request, | 425 request, |
| 415 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 426 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 416 base::Unretained(this))); | 427 base::Unretained(this))); |
| 417 PumpLoop(); | 428 PumpLoop(); |
| 418 | 429 |
| 419 // Ensure the start processing request stops before the completion callback. | 430 // Ensure the start processing request stops before the completion callback. |
| 420 EnableOfflinerCallback(false); | 431 EnableOfflinerCallback(false); |
| 421 | 432 |
| 422 DeviceConditions device_conditions(false, 75, | 433 DeviceConditions device_conditions(false, 75, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 441 EXPECT_EQ(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED, | 452 EXPECT_EQ(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED, |
| 442 last_offlining_status()); | 453 last_offlining_status()); |
| 443 | 454 |
| 444 // Since offliner was started, it will have seen cancel call. | 455 // Since offliner was started, it will have seen cancel call. |
| 445 EXPECT_TRUE(OfflinerWasCanceled()); | 456 EXPECT_TRUE(OfflinerWasCanceled()); |
| 446 } | 457 } |
| 447 | 458 |
| 448 TEST_F(RequestCoordinatorTest, PrerendererTimeout) { | 459 TEST_F(RequestCoordinatorTest, PrerendererTimeout) { |
| 449 // Build a request to use with the pre-renderer, and put it on the queue. | 460 // Build a request to use with the pre-renderer, and put it on the queue. |
| 450 offline_pages::SavePageRequest request( | 461 offline_pages::SavePageRequest request( |
| 451 kRequestId, kUrl, kClientId, base::Time::Now()); | 462 kRequestId, kUrl, kClientId, base::Time::Now(), kUserRequested); |
| 452 coordinator()->queue()->AddRequest( | 463 coordinator()->queue()->AddRequest( |
| 453 request, | 464 request, |
| 454 base::Bind(&RequestCoordinatorTest::AddRequestDone, | 465 base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 455 base::Unretained(this))); | 466 base::Unretained(this))); |
| 456 PumpLoop(); | 467 PumpLoop(); |
| 457 | 468 |
| 458 // Set up for the call to StartProcessing. | 469 // Set up for the call to StartProcessing. |
| 459 DeviceConditions device_conditions( | 470 DeviceConditions device_conditions( |
| 460 !kPowerRequired, kBatteryPercentageHigh, | 471 !kPowerRequired, kBatteryPercentageHigh, |
| 461 net::NetworkChangeNotifier::CONNECTION_3G); | 472 net::NetworkChangeNotifier::CONNECTION_3G); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 484 // tasks too soon. | 495 // tasks too soon. |
| 485 WaitForCallback(); | 496 WaitForCallback(); |
| 486 PumpLoop(); | 497 PumpLoop(); |
| 487 | 498 |
| 488 EXPECT_TRUE(OfflinerWasCanceled()); | 499 EXPECT_TRUE(OfflinerWasCanceled()); |
| 489 EXPECT_EQ(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED, | 500 EXPECT_EQ(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED, |
| 490 last_offlining_status()); | 501 last_offlining_status()); |
| 491 } | 502 } |
| 492 | 503 |
| 493 } // namespace offline_pages | 504 } // namespace offline_pages |
| OLD | NEW |