| 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 <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/synchronization/waitable_event.h" | 15 #include "base/synchronization/waitable_event.h" |
| 16 #include "base/sys_info.h" | 16 #include "base/sys_info.h" |
| 17 #include "base/test/scoped_feature_list.h" | 17 #include "base/test/scoped_feature_list.h" |
| 18 #include "base/test/test_mock_time_task_runner.h" | 18 #include "base/test/test_mock_time_task_runner.h" |
| 19 #include "base/threading/thread_task_runner_handle.h" | 19 #include "base/threading/thread_task_runner_handle.h" |
| 20 #include "base/time/time.h" | 20 #include "base/time/time.h" |
| 21 #include "components/offline_pages/background/device_conditions.h" | 21 #include "components/offline_pages/background/device_conditions.h" |
| 22 #include "components/offline_pages/background/offliner.h" | 22 #include "components/offline_pages/background/offliner.h" |
| 23 #include "components/offline_pages/background/offliner_factory.h" | 23 #include "components/offline_pages/background/offliner_factory.h" |
| 24 #include "components/offline_pages/background/offliner_policy.h" | 24 #include "components/offline_pages/background/offliner_policy.h" |
| 25 #include "components/offline_pages/background/pick_request_task_factory.h" |
| 25 #include "components/offline_pages/background/request_queue.h" | 26 #include "components/offline_pages/background/request_queue.h" |
| 26 #include "components/offline_pages/background/request_queue_in_memory_store.h" | 27 #include "components/offline_pages/background/request_queue_in_memory_store.h" |
| 27 #include "components/offline_pages/background/save_page_request.h" | 28 #include "components/offline_pages/background/save_page_request.h" |
| 28 #include "components/offline_pages/background/scheduler.h" | 29 #include "components/offline_pages/background/scheduler.h" |
| 29 #include "components/offline_pages/offline_page_feature.h" | 30 #include "components/offline_pages/offline_page_feature.h" |
| 30 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 31 | 32 |
| 32 namespace offline_pages { | 33 namespace offline_pages { |
| 33 | 34 |
| 34 namespace { | 35 namespace { |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 // Callback function which releases a wait for it. | 257 // Callback function which releases a wait for it. |
| 257 void WaitingCallbackFunction(bool result) { | 258 void WaitingCallbackFunction(bool result) { |
| 258 waiter_.Signal(); | 259 waiter_.Signal(); |
| 259 } | 260 } |
| 260 | 261 |
| 261 net::NetworkChangeNotifier::ConnectionType GetConnectionType() { | 262 net::NetworkChangeNotifier::ConnectionType GetConnectionType() { |
| 262 return coordinator()->GetConnectionType(); | 263 return coordinator()->GetConnectionType(); |
| 263 } | 264 } |
| 264 | 265 |
| 265 // Callback for Add requests. | 266 // Callback for Add requests. |
| 266 void AddRequestDone(RequestQueue::AddRequestResult result, | 267 void AddRequestDone(AddRequestResult result, const SavePageRequest& request); |
| 267 const SavePageRequest& request); | |
| 268 | 268 |
| 269 // Callback for getting requests. | 269 // Callback for getting requests. |
| 270 void GetRequestsDone(RequestQueue::GetRequestsResult result, | 270 void GetRequestsDone(GetRequestsResult result, |
| 271 std::vector<std::unique_ptr<SavePageRequest>> requests); | 271 std::vector<std::unique_ptr<SavePageRequest>> requests); |
| 272 | 272 |
| 273 // Callback for removing requests. | 273 // Callback for removing requests. |
| 274 void RemoveRequestsDone(const MultipleItemStatuses& results); | 274 void RemoveRequestsDone(const MultipleItemStatuses& results); |
| 275 | 275 |
| 276 // Callback for getting request statuses. | 276 // Callback for getting request statuses. |
| 277 void GetQueuedRequestsDone( | 277 void GetQueuedRequestsDone( |
| 278 std::vector<std::unique_ptr<SavePageRequest>> requests); | 278 std::vector<std::unique_ptr<SavePageRequest>> requests); |
| 279 | 279 |
| 280 void SetupForOfflinerDoneCallbackTest( | 280 void SetupForOfflinerDoneCallbackTest( |
| 281 offline_pages::SavePageRequest* request); | 281 offline_pages::SavePageRequest* request); |
| 282 | 282 |
| 283 void SendOfflinerDoneCallback(const SavePageRequest& request, | 283 void SendOfflinerDoneCallback(const SavePageRequest& request, |
| 284 Offliner::RequestStatus status); | 284 Offliner::RequestStatus status); |
| 285 | 285 |
| 286 RequestQueue::GetRequestsResult last_get_requests_result() const { | 286 GetRequestsResult last_get_requests_result() const { |
| 287 return last_get_requests_result_; | 287 return last_get_requests_result_; |
| 288 } | 288 } |
| 289 | 289 |
| 290 const std::vector<std::unique_ptr<SavePageRequest>>& last_requests() const { | 290 const std::vector<std::unique_ptr<SavePageRequest>>& last_requests() const { |
| 291 return last_requests_; | 291 return last_requests_; |
| 292 } | 292 } |
| 293 | 293 |
| 294 const MultipleItemStatuses& last_remove_results() const { | 294 const MultipleItemStatuses& last_remove_results() const { |
| 295 return last_remove_results_; | 295 return last_remove_results_; |
| 296 } | 296 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 | 369 |
| 370 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } | 370 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } |
| 371 | 371 |
| 372 ObserverStub observer() { return observer_; } | 372 ObserverStub observer() { return observer_; } |
| 373 | 373 |
| 374 bool immediate_schedule_callback_called() const { | 374 bool immediate_schedule_callback_called() const { |
| 375 return immediate_schedule_callback_called_; | 375 return immediate_schedule_callback_called_; |
| 376 } | 376 } |
| 377 | 377 |
| 378 private: | 378 private: |
| 379 RequestQueue::GetRequestsResult last_get_requests_result_; | 379 GetRequestsResult last_get_requests_result_; |
| 380 MultipleItemStatuses last_remove_results_; | 380 MultipleItemStatuses last_remove_results_; |
| 381 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; | 381 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; |
| 382 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; | 382 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
| 383 base::ThreadTaskRunnerHandle task_runner_handle_; | 383 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 384 std::unique_ptr<NetworkQualityEstimatorStub> network_quality_estimator_; | 384 std::unique_ptr<NetworkQualityEstimatorStub> network_quality_estimator_; |
| 385 std::unique_ptr<RequestCoordinator> coordinator_; | 385 std::unique_ptr<RequestCoordinator> coordinator_; |
| 386 OfflinerStub* offliner_; | 386 OfflinerStub* offliner_; |
| 387 base::WaitableEvent waiter_; | 387 base::WaitableEvent waiter_; |
| 388 ObserverStub observer_; | 388 ObserverStub observer_; |
| 389 bool immediate_schedule_callback_called_; | 389 bool immediate_schedule_callback_called_; |
| 390 }; | 390 }; |
| 391 | 391 |
| 392 RequestCoordinatorTest::RequestCoordinatorTest() | 392 RequestCoordinatorTest::RequestCoordinatorTest() |
| 393 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), | 393 : last_get_requests_result_(GetRequestsResult::STORE_FAILURE), |
| 394 task_runner_(new base::TestMockTimeTaskRunner), | 394 task_runner_(new base::TestMockTimeTaskRunner), |
| 395 task_runner_handle_(task_runner_), | 395 task_runner_handle_(task_runner_), |
| 396 offliner_(nullptr), | 396 offliner_(nullptr), |
| 397 waiter_(base::WaitableEvent::ResetPolicy::MANUAL, | 397 waiter_(base::WaitableEvent::ResetPolicy::MANUAL, |
| 398 base::WaitableEvent::InitialState::NOT_SIGNALED), | 398 base::WaitableEvent::InitialState::NOT_SIGNALED), |
| 399 immediate_schedule_callback_called_(false) {} | 399 immediate_schedule_callback_called_(false) {} |
| 400 | 400 |
| 401 RequestCoordinatorTest::~RequestCoordinatorTest() {} | 401 RequestCoordinatorTest::~RequestCoordinatorTest() {} |
| 402 | 402 |
| 403 void RequestCoordinatorTest::SetUp() { | 403 void RequestCoordinatorTest::SetUp() { |
| 404 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy()); | 404 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy()); |
| 405 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub()); | 405 std::unique_ptr<OfflinerFactory> offliner_factory(new OfflinerFactoryStub()); |
| 406 // Save the offliner for use by the tests. | 406 // Save the offliner for use by the tests. |
| 407 offliner_ = | 407 offliner_ = reinterpret_cast<OfflinerStub*>( |
| 408 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get())); | 408 offliner_factory->GetOffliner(policy.get())); |
| 409 std::unique_ptr<RequestQueueInMemoryStore> | 409 std::unique_ptr<RequestQueueInMemoryStore> |
| 410 store(new RequestQueueInMemoryStore()); | 410 store(new RequestQueueInMemoryStore()); |
| 411 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store))); | 411 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store))); |
| 412 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub()); | 412 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub()); |
| 413 network_quality_estimator_.reset(new NetworkQualityEstimatorStub()); | 413 network_quality_estimator_.reset(new NetworkQualityEstimatorStub()); |
| 414 coordinator_.reset(new RequestCoordinator( | 414 coordinator_.reset(new RequestCoordinator( |
| 415 std::move(policy), std::move(factory), std::move(queue), | 415 std::move(policy), std::move(offliner_factory), std::move(queue), |
| 416 std::move(scheduler_stub), network_quality_estimator_.get())); | 416 std::move(scheduler_stub), network_quality_estimator_.get())); |
| 417 coordinator_->AddObserver(&observer_); | 417 coordinator_->AddObserver(&observer_); |
| 418 SetNetworkConnected(true); | 418 SetNetworkConnected(true); |
| 419 std::unique_ptr<PickRequestTaskFactory> picker_factory( |
| 420 new PickRequestTaskFactory( |
| 421 coordinator_->policy(), |
| 422 static_cast<RequestNotifier*>(coordinator_.get()), |
| 423 coordinator_->GetLogger())); |
| 424 coordinator_->queue()->SetPickerFactory(std::move(picker_factory)); |
| 419 } | 425 } |
| 420 | 426 |
| 421 void RequestCoordinatorTest::PumpLoop() { | 427 void RequestCoordinatorTest::PumpLoop() { |
| 422 task_runner_->RunUntilIdle(); | 428 task_runner_->RunUntilIdle(); |
| 423 } | 429 } |
| 424 | 430 |
| 425 void RequestCoordinatorTest::GetRequestsDone( | 431 void RequestCoordinatorTest::GetRequestsDone( |
| 426 RequestQueue::GetRequestsResult result, | 432 GetRequestsResult result, |
| 427 std::vector<std::unique_ptr<SavePageRequest>> requests) { | 433 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 428 last_get_requests_result_ = result; | 434 last_get_requests_result_ = result; |
| 429 last_requests_ = std::move(requests); | 435 last_requests_ = std::move(requests); |
| 430 } | 436 } |
| 431 | 437 |
| 432 void RequestCoordinatorTest::RemoveRequestsDone( | 438 void RequestCoordinatorTest::RemoveRequestsDone( |
| 433 const MultipleItemStatuses& results) { | 439 const MultipleItemStatuses& results) { |
| 434 last_remove_results_ = results; | 440 last_remove_results_ = results; |
| 435 waiter_.Signal(); | 441 waiter_.Signal(); |
| 436 } | 442 } |
| 437 | 443 |
| 438 void RequestCoordinatorTest::GetQueuedRequestsDone( | 444 void RequestCoordinatorTest::GetQueuedRequestsDone( |
| 439 std::vector<std::unique_ptr<SavePageRequest>> requests) { | 445 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 440 last_requests_ = std::move(requests); | 446 last_requests_ = std::move(requests); |
| 441 waiter_.Signal(); | 447 waiter_.Signal(); |
| 442 } | 448 } |
| 443 | 449 |
| 444 void RequestCoordinatorTest::AddRequestDone( | 450 void RequestCoordinatorTest::AddRequestDone(AddRequestResult result, |
| 445 RequestQueue::AddRequestResult result, | 451 const SavePageRequest& request) {} |
| 446 const SavePageRequest& request) {} | |
| 447 | 452 |
| 448 void RequestCoordinatorTest::SetupForOfflinerDoneCallbackTest( | 453 void RequestCoordinatorTest::SetupForOfflinerDoneCallbackTest( |
| 449 offline_pages::SavePageRequest* request) { | 454 offline_pages::SavePageRequest* request) { |
| 450 // Mark request as started and add it to the queue, | 455 // Mark request as started and add it to the queue, |
| 451 // then wait for callback to finish. | 456 // then wait for callback to finish. |
| 452 request->MarkAttemptStarted(base::Time::Now()); | 457 request->MarkAttemptStarted(base::Time::Now()); |
| 453 coordinator()->queue()->AddRequest( | 458 coordinator()->queue()->AddRequest( |
| 454 *request, base::Bind(&RequestCoordinatorTest::AddRequestDone, | 459 *request, base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 455 base::Unretained(this))); | 460 base::Unretained(this))); |
| 456 PumpLoop(); | 461 PumpLoop(); |
| (...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 // Now whether processing triggered immediately depends on whether test | 1458 // Now whether processing triggered immediately depends on whether test |
| 1454 // is run on svelte device or not. | 1459 // is run on svelte device or not. |
| 1455 if (base::SysInfo::IsLowEndDevice()) { | 1460 if (base::SysInfo::IsLowEndDevice()) { |
| 1456 EXPECT_FALSE(is_busy()); | 1461 EXPECT_FALSE(is_busy()); |
| 1457 } else { | 1462 } else { |
| 1458 EXPECT_TRUE(is_busy()); | 1463 EXPECT_TRUE(is_busy()); |
| 1459 } | 1464 } |
| 1460 } | 1465 } |
| 1461 | 1466 |
| 1462 } // namespace offline_pages | 1467 } // namespace offline_pages |
| OLD | NEW |