Chromium Code Reviews| 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 if (offliner_.get() == nullptr) { | 120 if (offliner_.get() == nullptr) { |
| 121 offliner_.reset(new OfflinerStub()); | 121 offliner_.reset(new OfflinerStub()); |
| 122 } | 122 } |
| 123 return offliner_.get(); | 123 return offliner_.get(); |
| 124 } | 124 } |
| 125 | 125 |
| 126 private: | 126 private: |
| 127 std::unique_ptr<OfflinerStub> offliner_; | 127 std::unique_ptr<OfflinerStub> offliner_; |
| 128 }; | 128 }; |
| 129 | 129 |
| 130 // TODO(dougarnett): Replace with real NQE instance when/if support interface. | |
|
RyanSturm
2016/09/19 17:15:40
For the purposes of this test, you'd probably be b
dougarnett
2016/09/19 19:34:32
Done.
| |
| 131 class NetworkQualityEstimatorStub | |
|
tbansal1
2016/09/16 22:05:56
nit: may be s/NetworkQualityEstimatorStub/TestNetw
dougarnett
2016/09/19 19:34:33
Acknowledged. I prefer that too but matching namin
| |
| 132 : public net::NetworkQualityEstimator::NetworkQualityProvider { | |
| 133 public: | |
| 134 NetworkQualityEstimatorStub() | |
| 135 : connection_type_( | |
| 136 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G) {} | |
| 137 | |
| 138 net::EffectiveConnectionType GetEffectiveConnectionType() override { | |
| 139 return connection_type_; | |
| 140 } | |
| 141 | |
| 142 void SetEffectiveConnectionTypeForTesting(net::EffectiveConnectionType type) { | |
| 143 connection_type_ = type; | |
| 144 } | |
| 145 | |
| 146 private: | |
| 147 net::EffectiveConnectionType connection_type_; | |
| 148 }; | |
| 149 | |
| 130 class ObserverStub : public RequestCoordinator::Observer { | 150 class ObserverStub : public RequestCoordinator::Observer { |
| 131 public: | 151 public: |
| 132 ObserverStub() | 152 ObserverStub() |
| 133 : added_called_(false), | 153 : added_called_(false), |
| 134 completed_called_(false), | 154 completed_called_(false), |
| 135 changed_called_(false), | 155 changed_called_(false), |
| 136 last_status_(RequestCoordinator::BackgroundSavePageResult::SUCCESS), | 156 last_status_(RequestCoordinator::BackgroundSavePageResult::SUCCESS), |
| 137 state_(SavePageRequest::RequestState::PRERENDERING) {} | 157 state_(SavePageRequest::RequestState::PRERENDERING) {} |
| 138 | 158 |
| 139 void Clear() { | 159 void Clear() { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 | 259 |
| 240 void EnableOfflinerCallback(bool enable) { | 260 void EnableOfflinerCallback(bool enable) { |
| 241 offliner_->enable_callback(enable); | 261 offliner_->enable_callback(enable); |
| 242 } | 262 } |
| 243 | 263 |
| 244 void SetNetworkConditionsForTest( | 264 void SetNetworkConditionsForTest( |
| 245 net::NetworkChangeNotifier::ConnectionType connection) { | 265 net::NetworkChangeNotifier::ConnectionType connection) { |
| 246 coordinator()->SetNetworkConditionsForTest(connection); | 266 coordinator()->SetNetworkConditionsForTest(connection); |
| 247 } | 267 } |
| 248 | 268 |
| 269 void SetEffectiveConnectionTypeForTesting(net::EffectiveConnectionType type) { | |
| 270 nqe_->SetEffectiveConnectionTypeForTesting(type); | |
| 271 } | |
| 272 | |
| 249 void ScheduleForTest() { coordinator_->ScheduleAsNeeded(); } | 273 void ScheduleForTest() { coordinator_->ScheduleAsNeeded(); } |
| 250 | 274 |
| 251 void CallRequestNotPicked(bool non_user_requested_tasks_remaining) { | 275 void CallRequestNotPicked(bool non_user_requested_tasks_remaining) { |
| 252 coordinator_->RequestNotPicked(non_user_requested_tasks_remaining); | 276 coordinator_->RequestNotPicked(non_user_requested_tasks_remaining); |
| 253 } | 277 } |
| 254 | 278 |
| 255 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { | 279 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { |
| 256 coordinator_->SetOfflinerTimeoutForTest(timeout); | 280 coordinator_->SetOfflinerTimeoutForTest(timeout); |
| 257 } | 281 } |
| 258 | 282 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 275 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } | 299 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } |
| 276 | 300 |
| 277 ObserverStub observer() { return observer_; } | 301 ObserverStub observer() { return observer_; } |
| 278 | 302 |
| 279 private: | 303 private: |
| 280 RequestQueue::GetRequestsResult last_get_requests_result_; | 304 RequestQueue::GetRequestsResult last_get_requests_result_; |
| 281 RequestQueue::UpdateMultipleRequestResults last_remove_results_; | 305 RequestQueue::UpdateMultipleRequestResults last_remove_results_; |
| 282 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; | 306 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; |
| 283 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; | 307 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
| 284 base::ThreadTaskRunnerHandle task_runner_handle_; | 308 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 309 NetworkQualityEstimatorStub* nqe_; | |
| 285 std::unique_ptr<RequestCoordinator> coordinator_; | 310 std::unique_ptr<RequestCoordinator> coordinator_; |
| 286 OfflinerStub* offliner_; | 311 OfflinerStub* offliner_; |
| 287 base::WaitableEvent waiter_; | 312 base::WaitableEvent waiter_; |
| 288 ObserverStub observer_; | 313 ObserverStub observer_; |
| 289 }; | 314 }; |
| 290 | 315 |
| 291 RequestCoordinatorTest::RequestCoordinatorTest() | 316 RequestCoordinatorTest::RequestCoordinatorTest() |
| 292 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), | 317 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), |
| 293 task_runner_(new base::TestMockTimeTaskRunner), | 318 task_runner_(new base::TestMockTimeTaskRunner), |
| 294 task_runner_handle_(task_runner_), | 319 task_runner_handle_(task_runner_), |
| 320 nqe_(new NetworkQualityEstimatorStub()), | |
|
tbansal1
2016/09/16 22:05:56
Is this not leaking memory? May be you can store i
dougarnett
2016/09/19 19:34:32
Done.
| |
| 295 offliner_(nullptr), | 321 offliner_(nullptr), |
| 296 waiter_(base::WaitableEvent::ResetPolicy::MANUAL, | 322 waiter_(base::WaitableEvent::ResetPolicy::MANUAL, |
| 297 base::WaitableEvent::InitialState::NOT_SIGNALED) {} | 323 base::WaitableEvent::InitialState::NOT_SIGNALED) {} |
| 298 | 324 |
| 299 RequestCoordinatorTest::~RequestCoordinatorTest() {} | 325 RequestCoordinatorTest::~RequestCoordinatorTest() {} |
| 300 | 326 |
| 301 void RequestCoordinatorTest::SetUp() { | 327 void RequestCoordinatorTest::SetUp() { |
| 302 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy()); | 328 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy()); |
| 303 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub()); | 329 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub()); |
| 304 // Save the offliner for use by the tests. | 330 // Save the offliner for use by the tests. |
| 305 offliner_ = | 331 offliner_ = |
| 306 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get())); | 332 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get())); |
| 307 std::unique_ptr<RequestQueueInMemoryStore> | 333 std::unique_ptr<RequestQueueInMemoryStore> |
| 308 store(new RequestQueueInMemoryStore()); | 334 store(new RequestQueueInMemoryStore()); |
| 309 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store))); | 335 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store))); |
| 310 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub()); | 336 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub()); |
| 311 coordinator_.reset(new RequestCoordinator( | 337 coordinator_.reset(new RequestCoordinator( |
| 312 std::move(policy), std::move(factory), std::move(queue), | 338 std::move(policy), std::move(factory), std::move(queue), |
| 313 std::move(scheduler_stub))); | 339 std::move(scheduler_stub), nqe_)); |
| 314 coordinator_->AddObserver(&observer_); | 340 coordinator_->AddObserver(&observer_); |
| 315 } | 341 } |
| 316 | 342 |
| 317 void RequestCoordinatorTest::PumpLoop() { | 343 void RequestCoordinatorTest::PumpLoop() { |
| 318 task_runner_->RunUntilIdle(); | 344 task_runner_->RunUntilIdle(); |
| 319 } | 345 } |
| 320 | 346 |
| 321 void RequestCoordinatorTest::GetRequestsDone( | 347 void RequestCoordinatorTest::GetRequestsDone( |
| 322 RequestQueue::GetRequestsResult result, | 348 RequestQueue::GetRequestsResult result, |
| 323 std::vector<std::unique_ptr<SavePageRequest>> requests) { | 349 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 351 DeviceConditions device_conditions(false, 75, | 377 DeviceConditions device_conditions(false, 75, |
| 352 net::NetworkChangeNotifier::CONNECTION_3G); | 378 net::NetworkChangeNotifier::CONNECTION_3G); |
| 353 base::Callback<void(bool)> callback = | 379 base::Callback<void(bool)> callback = |
| 354 base::Bind( | 380 base::Bind( |
| 355 &RequestCoordinatorTest::EmptyCallbackFunction, | 381 &RequestCoordinatorTest::EmptyCallbackFunction, |
| 356 base::Unretained(this)); | 382 base::Unretained(this)); |
| 357 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); | 383 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); |
| 358 } | 384 } |
| 359 | 385 |
| 360 TEST_F(RequestCoordinatorTest, StartProcessingWithRequestInProgress) { | 386 TEST_F(RequestCoordinatorTest, StartProcessingWithRequestInProgress) { |
| 387 SetEffectiveConnectionTypeForTesting( | |
|
Pete Williamson
2016/09/16 22:26:01
Maybe set up a default type in the ::SetUp functio
dougarnett
2016/09/19 19:34:33
Done.
| |
| 388 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE); | |
| 361 SetNetworkConditionsForTest( | 389 SetNetworkConditionsForTest( |
| 362 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE); | 390 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE); |
| 363 // Put the request on the queue. | 391 // Put the request on the queue. |
| 364 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); | 392 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); |
| 365 | 393 |
| 366 // Set up for the call to StartProcessing by building arguments. | 394 // Set up for the call to StartProcessing by building arguments. |
| 367 DeviceConditions device_conditions( | 395 DeviceConditions device_conditions( |
| 368 false, 75, net::NetworkChangeNotifier::CONNECTION_3G); | 396 false, 75, net::NetworkChangeNotifier::CONNECTION_3G); |
| 369 base::Callback<void(bool)> callback = | 397 base::Callback<void(bool)> callback = |
| 370 base::Bind(&RequestCoordinatorTest::EmptyCallbackFunction, | 398 base::Bind(&RequestCoordinatorTest::EmptyCallbackFunction, |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 955 | 983 |
| 956 EXPECT_TRUE(observer().completed_called()); | 984 EXPECT_TRUE(observer().completed_called()); |
| 957 EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::REMOVED, | 985 EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::REMOVED, |
| 958 observer().last_status()); | 986 observer().last_status()); |
| 959 EXPECT_EQ(1UL, last_remove_results().size()); | 987 EXPECT_EQ(1UL, last_remove_results().size()); |
| 960 EXPECT_EQ(kRequestId1, std::get<0>(last_remove_results().at(0))); | 988 EXPECT_EQ(kRequestId1, std::get<0>(last_remove_results().at(0))); |
| 961 } | 989 } |
| 962 | 990 |
| 963 TEST_F(RequestCoordinatorTest, | 991 TEST_F(RequestCoordinatorTest, |
| 964 SavePageStartsProcessingWhenConnectedAndNotLowEndDevice) { | 992 SavePageStartsProcessingWhenConnectedAndNotLowEndDevice) { |
| 993 SetEffectiveConnectionTypeForTesting( | |
| 994 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G); | |
| 965 SetNetworkConditionsForTest( | 995 SetNetworkConditionsForTest( |
| 966 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); | 996 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); |
| 967 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); | 997 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); |
| 968 PumpLoop(); | 998 PumpLoop(); |
| 969 | 999 |
| 970 // Now whether processing triggered immediately depends on whether test | 1000 // Now whether processing triggered immediately depends on whether test |
| 971 // is run on svelte device or not. | 1001 // is run on svelte device or not. |
| 972 if (base::SysInfo::IsLowEndDevice()) { | 1002 if (base::SysInfo::IsLowEndDevice()) { |
| 973 EXPECT_FALSE(is_busy()); | 1003 EXPECT_FALSE(is_busy()); |
| 974 } else { | 1004 } else { |
| 975 EXPECT_TRUE(is_busy()); | 1005 EXPECT_TRUE(is_busy()); |
| 976 } | 1006 } |
| 977 } | 1007 } |
| 978 | 1008 |
| 979 TEST_F(RequestCoordinatorTest, SavePageDoesntStartProcessingWhenDisconnected) { | 1009 TEST_F(RequestCoordinatorTest, SavePageDoesntStartProcessingWhenDisconnected) { |
| 1010 SetEffectiveConnectionTypeForTesting( | |
| 1011 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE); | |
|
Pete Williamson
2016/09/16 22:26:01
Maybe EFFECTIVE_CONNECTION_TYPE_SLOW_2G (unless we
dougarnett
2016/09/19 19:34:33
Added ...WhenPoorlyConnected test variant.
| |
| 980 SetNetworkConditionsForTest( | 1012 SetNetworkConditionsForTest( |
| 981 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE); | 1013 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE); |
| 982 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); | 1014 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); |
| 983 PumpLoop(); | 1015 PumpLoop(); |
| 984 EXPECT_FALSE(is_busy()); | 1016 EXPECT_FALSE(is_busy()); |
| 985 } | 1017 } |
| 986 | 1018 |
| 987 TEST_F(RequestCoordinatorTest, | 1019 TEST_F(RequestCoordinatorTest, |
| 988 ResumeStartsProcessingWhenConnectedAndNotLowEndDevice) { | 1020 ResumeStartsProcessingWhenConnectedAndNotLowEndDevice) { |
| 1021 SetEffectiveConnectionTypeForTesting( | |
| 1022 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE); | |
| 989 SetNetworkConditionsForTest( | 1023 SetNetworkConditionsForTest( |
| 990 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE); | 1024 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE); |
| 991 | 1025 |
| 992 // Add a request to the queue. | 1026 // Add a request to the queue. |
| 993 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1, | 1027 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1, |
| 994 base::Time::Now(), kUserRequested); | 1028 base::Time::Now(), kUserRequested); |
| 995 coordinator()->queue()->AddRequest( | 1029 coordinator()->queue()->AddRequest( |
| 996 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone, | 1030 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone, |
| 997 base::Unretained(this))); | 1031 base::Unretained(this))); |
| 998 PumpLoop(); | 1032 PumpLoop(); |
| 999 EXPECT_FALSE(is_busy()); | 1033 EXPECT_FALSE(is_busy()); |
| 1000 | 1034 |
| 1001 // Pause the request. | 1035 // Pause the request. |
| 1002 std::vector<int64_t> request_ids; | 1036 std::vector<int64_t> request_ids; |
| 1003 request_ids.push_back(kRequestId1); | 1037 request_ids.push_back(kRequestId1); |
| 1004 coordinator()->PauseRequests(request_ids); | 1038 coordinator()->PauseRequests(request_ids); |
| 1005 PumpLoop(); | 1039 PumpLoop(); |
| 1006 | 1040 |
| 1007 // Resume the request while disconnected. | 1041 // Resume the request while disconnected. |
| 1008 coordinator()->ResumeRequests(request_ids); | 1042 coordinator()->ResumeRequests(request_ids); |
| 1009 PumpLoop(); | 1043 PumpLoop(); |
| 1010 EXPECT_FALSE(is_busy()); | 1044 EXPECT_FALSE(is_busy()); |
| 1011 | 1045 |
| 1012 // Pause the request again. | 1046 // Pause the request again. |
| 1013 coordinator()->PauseRequests(request_ids); | 1047 coordinator()->PauseRequests(request_ids); |
| 1014 PumpLoop(); | 1048 PumpLoop(); |
| 1015 | 1049 |
| 1016 // Now simulate being connected. | 1050 // Now simulate being connected. |
| 1051 SetEffectiveConnectionTypeForTesting( | |
| 1052 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G); | |
| 1017 SetNetworkConditionsForTest( | 1053 SetNetworkConditionsForTest( |
| 1018 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); | 1054 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); |
| 1019 | 1055 |
| 1020 // Resume the request while connected. | 1056 // Resume the request while connected. |
| 1021 coordinator()->ResumeRequests(request_ids); | 1057 coordinator()->ResumeRequests(request_ids); |
| 1022 EXPECT_FALSE(is_busy()); | 1058 EXPECT_FALSE(is_busy()); |
| 1023 PumpLoop(); | 1059 PumpLoop(); |
| 1024 | 1060 |
| 1025 // Now whether processing triggered immediately depends on whether test | 1061 // Now whether processing triggered immediately depends on whether test |
| 1026 // is run on svelte device or not. | 1062 // is run on svelte device or not. |
| 1027 if (base::SysInfo::IsLowEndDevice()) { | 1063 if (base::SysInfo::IsLowEndDevice()) { |
| 1028 EXPECT_FALSE(is_busy()); | 1064 EXPECT_FALSE(is_busy()); |
| 1029 } else { | 1065 } else { |
| 1030 EXPECT_TRUE(is_busy()); | 1066 EXPECT_TRUE(is_busy()); |
| 1031 } | 1067 } |
| 1032 } | 1068 } |
| 1033 | 1069 |
| 1034 } // namespace offline_pages | 1070 } // namespace offline_pages |
| OLD | NEW |