Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: components/offline_pages/background/request_coordinator_unittest.cc

Issue 2347783003: [OfflinePages, NetworkQualityEstimator] Use NetworkQualityEstimator to decide on triggering Backgro… (Closed)
Patch Set: Addressed feedback Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 class NetworkQualityEstimatorStub
131 : public net::NetworkQualityEstimator::NetworkQualityProvider {
132 public:
133 NetworkQualityEstimatorStub()
134 : connection_type_(
135 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G) {}
136
137 net::EffectiveConnectionType GetEffectiveConnectionType() const override {
138 return connection_type_;
139 }
140
141 void SetEffectiveConnectionTypeForTest(net::EffectiveConnectionType type) {
142 connection_type_ = type;
143 }
144
145 private:
146 net::EffectiveConnectionType connection_type_;
147 };
148
130 class ObserverStub : public RequestCoordinator::Observer { 149 class ObserverStub : public RequestCoordinator::Observer {
131 public: 150 public:
132 ObserverStub() 151 ObserverStub()
133 : added_called_(false), 152 : added_called_(false),
134 completed_called_(false), 153 completed_called_(false),
135 changed_called_(false), 154 changed_called_(false),
136 last_status_(RequestCoordinator::BackgroundSavePageResult::SUCCESS), 155 last_status_(RequestCoordinator::BackgroundSavePageResult::SUCCESS),
137 state_(SavePageRequest::RequestState::PRERENDERING) {} 156 state_(SavePageRequest::RequestState::PRERENDERING) {}
138 157
139 void Clear() { 158 void Clear() {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 258
240 void EnableOfflinerCallback(bool enable) { 259 void EnableOfflinerCallback(bool enable) {
241 offliner_->enable_callback(enable); 260 offliner_->enable_callback(enable);
242 } 261 }
243 262
244 void SetNetworkConditionsForTest( 263 void SetNetworkConditionsForTest(
245 net::NetworkChangeNotifier::ConnectionType connection) { 264 net::NetworkChangeNotifier::ConnectionType connection) {
246 coordinator()->SetNetworkConditionsForTest(connection); 265 coordinator()->SetNetworkConditionsForTest(connection);
247 } 266 }
248 267
268 void SetEffectiveConnectionTypeForTest(net::EffectiveConnectionType type) {
269 network_quality_estimator_->SetEffectiveConnectionTypeForTest(type);
270 }
271
249 void ScheduleForTest() { coordinator_->ScheduleAsNeeded(); } 272 void ScheduleForTest() { coordinator_->ScheduleAsNeeded(); }
250 273
251 void CallRequestNotPicked(bool non_user_requested_tasks_remaining) { 274 void CallRequestNotPicked(bool non_user_requested_tasks_remaining) {
252 coordinator_->RequestNotPicked(non_user_requested_tasks_remaining); 275 coordinator_->RequestNotPicked(non_user_requested_tasks_remaining);
253 } 276 }
254 277
255 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) { 278 void SetOfflinerTimeoutForTest(const base::TimeDelta& timeout) {
256 coordinator_->SetOfflinerTimeoutForTest(timeout); 279 coordinator_->SetOfflinerTimeoutForTest(timeout);
257 } 280 }
258 281
(...skipping 16 matching lines...) Expand all
275 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); } 298 bool OfflinerWasCanceled() const { return offliner_->cancel_called(); }
276 299
277 ObserverStub observer() { return observer_; } 300 ObserverStub observer() { return observer_; }
278 301
279 private: 302 private:
280 RequestQueue::GetRequestsResult last_get_requests_result_; 303 RequestQueue::GetRequestsResult last_get_requests_result_;
281 RequestQueue::UpdateMultipleRequestResults last_remove_results_; 304 RequestQueue::UpdateMultipleRequestResults last_remove_results_;
282 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; 305 std::vector<std::unique_ptr<SavePageRequest>> last_requests_;
283 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; 306 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
284 base::ThreadTaskRunnerHandle task_runner_handle_; 307 base::ThreadTaskRunnerHandle task_runner_handle_;
308 std::unique_ptr<NetworkQualityEstimatorStub> network_quality_estimator_;
285 std::unique_ptr<RequestCoordinator> coordinator_; 309 std::unique_ptr<RequestCoordinator> coordinator_;
286 OfflinerStub* offliner_; 310 OfflinerStub* offliner_;
287 base::WaitableEvent waiter_; 311 base::WaitableEvent waiter_;
288 ObserverStub observer_; 312 ObserverStub observer_;
289 }; 313 };
290 314
291 RequestCoordinatorTest::RequestCoordinatorTest() 315 RequestCoordinatorTest::RequestCoordinatorTest()
292 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE), 316 : last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE),
293 task_runner_(new base::TestMockTimeTaskRunner), 317 task_runner_(new base::TestMockTimeTaskRunner),
294 task_runner_handle_(task_runner_), 318 task_runner_handle_(task_runner_),
295 offliner_(nullptr), 319 offliner_(nullptr),
296 waiter_(base::WaitableEvent::ResetPolicy::MANUAL, 320 waiter_(base::WaitableEvent::ResetPolicy::MANUAL,
297 base::WaitableEvent::InitialState::NOT_SIGNALED) {} 321 base::WaitableEvent::InitialState::NOT_SIGNALED) {}
298 322
299 RequestCoordinatorTest::~RequestCoordinatorTest() {} 323 RequestCoordinatorTest::~RequestCoordinatorTest() {}
300 324
301 void RequestCoordinatorTest::SetUp() { 325 void RequestCoordinatorTest::SetUp() {
302 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy()); 326 std::unique_ptr<OfflinerPolicy> policy(new OfflinerPolicy());
303 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub()); 327 std::unique_ptr<OfflinerFactory> factory(new OfflinerFactoryStub());
304 // Save the offliner for use by the tests. 328 // Save the offliner for use by the tests.
305 offliner_ = 329 offliner_ =
306 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get())); 330 reinterpret_cast<OfflinerStub*>(factory->GetOffliner(policy.get()));
307 std::unique_ptr<RequestQueueInMemoryStore> 331 std::unique_ptr<RequestQueueInMemoryStore>
308 store(new RequestQueueInMemoryStore()); 332 store(new RequestQueueInMemoryStore());
309 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store))); 333 std::unique_ptr<RequestQueue> queue(new RequestQueue(std::move(store)));
310 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub()); 334 std::unique_ptr<Scheduler> scheduler_stub(new SchedulerStub());
335 network_quality_estimator_.reset(new NetworkQualityEstimatorStub());
311 coordinator_.reset(new RequestCoordinator( 336 coordinator_.reset(new RequestCoordinator(
312 std::move(policy), std::move(factory), std::move(queue), 337 std::move(policy), std::move(factory), std::move(queue),
313 std::move(scheduler_stub))); 338 std::move(scheduler_stub), network_quality_estimator_.get()));
314 coordinator_->AddObserver(&observer_); 339 coordinator_->AddObserver(&observer_);
340 SetEffectiveConnectionTypeForTest(
341 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE);
342 SetNetworkConditionsForTest(
343 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE);
315 } 344 }
316 345
317 void RequestCoordinatorTest::PumpLoop() { 346 void RequestCoordinatorTest::PumpLoop() {
318 task_runner_->RunUntilIdle(); 347 task_runner_->RunUntilIdle();
319 } 348 }
320 349
321 void RequestCoordinatorTest::GetRequestsDone( 350 void RequestCoordinatorTest::GetRequestsDone(
322 RequestQueue::GetRequestsResult result, 351 RequestQueue::GetRequestsResult result,
323 std::vector<std::unique_ptr<SavePageRequest>> requests) { 352 std::vector<std::unique_ptr<SavePageRequest>> requests) {
324 last_get_requests_result_ = result; 353 last_get_requests_result_ = result;
(...skipping 26 matching lines...) Expand all
351 DeviceConditions device_conditions(false, 75, 380 DeviceConditions device_conditions(false, 75,
352 net::NetworkChangeNotifier::CONNECTION_3G); 381 net::NetworkChangeNotifier::CONNECTION_3G);
353 base::Callback<void(bool)> callback = 382 base::Callback<void(bool)> callback =
354 base::Bind( 383 base::Bind(
355 &RequestCoordinatorTest::EmptyCallbackFunction, 384 &RequestCoordinatorTest::EmptyCallbackFunction,
356 base::Unretained(this)); 385 base::Unretained(this));
357 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback)); 386 EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback));
358 } 387 }
359 388
360 TEST_F(RequestCoordinatorTest, StartProcessingWithRequestInProgress) { 389 TEST_F(RequestCoordinatorTest, StartProcessingWithRequestInProgress) {
361 SetNetworkConditionsForTest(
362 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE);
363 // Put the request on the queue. 390 // Put the request on the queue.
364 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); 391 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested));
365 392
366 // Set up for the call to StartProcessing by building arguments. 393 // Set up for the call to StartProcessing by building arguments.
367 DeviceConditions device_conditions( 394 DeviceConditions device_conditions(
368 false, 75, net::NetworkChangeNotifier::CONNECTION_3G); 395 false, 75, net::NetworkChangeNotifier::CONNECTION_3G);
369 base::Callback<void(bool)> callback = 396 base::Callback<void(bool)> callback =
370 base::Bind(&RequestCoordinatorTest::EmptyCallbackFunction, 397 base::Bind(&RequestCoordinatorTest::EmptyCallbackFunction,
371 base::Unretained(this)); 398 base::Unretained(this));
372 399
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 982
956 EXPECT_TRUE(observer().completed_called()); 983 EXPECT_TRUE(observer().completed_called());
957 EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::REMOVED, 984 EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::REMOVED,
958 observer().last_status()); 985 observer().last_status());
959 EXPECT_EQ(1UL, last_remove_results().size()); 986 EXPECT_EQ(1UL, last_remove_results().size());
960 EXPECT_EQ(kRequestId1, std::get<0>(last_remove_results().at(0))); 987 EXPECT_EQ(kRequestId1, std::get<0>(last_remove_results().at(0)));
961 } 988 }
962 989
963 TEST_F(RequestCoordinatorTest, 990 TEST_F(RequestCoordinatorTest,
964 SavePageStartsProcessingWhenConnectedAndNotLowEndDevice) { 991 SavePageStartsProcessingWhenConnectedAndNotLowEndDevice) {
965 SetNetworkConditionsForTest( 992 SetEffectiveConnectionTypeForTest(
966 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); 993 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G);
967 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); 994 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested));
968 PumpLoop(); 995 PumpLoop();
969 996
970 // Now whether processing triggered immediately depends on whether test 997 // Now whether processing triggered immediately depends on whether test
971 // is run on svelte device or not. 998 // is run on svelte device or not.
972 if (base::SysInfo::IsLowEndDevice()) { 999 if (base::SysInfo::IsLowEndDevice()) {
973 EXPECT_FALSE(is_busy()); 1000 EXPECT_FALSE(is_busy());
974 } else { 1001 } else {
975 EXPECT_TRUE(is_busy()); 1002 EXPECT_TRUE(is_busy());
976 } 1003 }
977 } 1004 }
978 1005
979 TEST_F(RequestCoordinatorTest, SavePageDoesntStartProcessingWhenDisconnected) { 1006 TEST_F(RequestCoordinatorTest, SavePageDoesntStartProcessingWhenDisconnected) {
980 SetNetworkConditionsForTest(
981 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE);
982 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested)); 1007 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested));
983 PumpLoop(); 1008 PumpLoop();
984 EXPECT_FALSE(is_busy()); 1009 EXPECT_FALSE(is_busy());
1010 }
1011
1012 TEST_F(RequestCoordinatorTest,
1013 SavePageDoesntStartProcessingWhenPoorlyConnected) {
1014 SetEffectiveConnectionTypeForTest(
1015 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
1016 EXPECT_TRUE(coordinator()->SavePageLater(kUrl1, kClientId1, kUserRequested));
1017 PumpLoop();
1018 EXPECT_FALSE(is_busy());
985 } 1019 }
986 1020
987 TEST_F(RequestCoordinatorTest, 1021 TEST_F(RequestCoordinatorTest,
988 ResumeStartsProcessingWhenConnectedAndNotLowEndDevice) { 1022 ResumeStartsProcessingWhenConnectedAndNotLowEndDevice) {
989 SetNetworkConditionsForTest(
990 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE);
991 1023
992 // Add a request to the queue. 1024 // Add a request to the queue.
993 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1, 1025 offline_pages::SavePageRequest request1(kRequestId1, kUrl1, kClientId1,
994 base::Time::Now(), kUserRequested); 1026 base::Time::Now(), kUserRequested);
995 coordinator()->queue()->AddRequest( 1027 coordinator()->queue()->AddRequest(
996 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone, 1028 request1, base::Bind(&RequestCoordinatorTest::AddRequestDone,
997 base::Unretained(this))); 1029 base::Unretained(this)));
998 PumpLoop(); 1030 PumpLoop();
999 EXPECT_FALSE(is_busy()); 1031 EXPECT_FALSE(is_busy());
1000 1032
1001 // Pause the request. 1033 // Pause the request.
1002 std::vector<int64_t> request_ids; 1034 std::vector<int64_t> request_ids;
1003 request_ids.push_back(kRequestId1); 1035 request_ids.push_back(kRequestId1);
1004 coordinator()->PauseRequests(request_ids); 1036 coordinator()->PauseRequests(request_ids);
1005 PumpLoop(); 1037 PumpLoop();
1006 1038
1007 // Resume the request while disconnected. 1039 // Resume the request while disconnected.
1008 coordinator()->ResumeRequests(request_ids); 1040 coordinator()->ResumeRequests(request_ids);
1009 PumpLoop(); 1041 PumpLoop();
1010 EXPECT_FALSE(is_busy()); 1042 EXPECT_FALSE(is_busy());
1011 1043
1012 // Pause the request again. 1044 // Pause the request again.
1013 coordinator()->PauseRequests(request_ids); 1045 coordinator()->PauseRequests(request_ids);
1014 PumpLoop(); 1046 PumpLoop();
1015 1047
1016 // Now simulate being connected. 1048 // Now simulate reasonable connection.
1017 SetNetworkConditionsForTest( 1049 SetEffectiveConnectionTypeForTest(
1018 net::NetworkChangeNotifier::ConnectionType::CONNECTION_3G); 1050 net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G);
1019 1051
1020 // Resume the request while connected. 1052 // Resume the request while connected.
1021 coordinator()->ResumeRequests(request_ids); 1053 coordinator()->ResumeRequests(request_ids);
1022 EXPECT_FALSE(is_busy()); 1054 EXPECT_FALSE(is_busy());
1023 PumpLoop(); 1055 PumpLoop();
1024 1056
1025 // Now whether processing triggered immediately depends on whether test 1057 // Now whether processing triggered immediately depends on whether test
1026 // is run on svelte device or not. 1058 // is run on svelte device or not.
1027 if (base::SysInfo::IsLowEndDevice()) { 1059 if (base::SysInfo::IsLowEndDevice()) {
1028 EXPECT_FALSE(is_busy()); 1060 EXPECT_FALSE(is_busy());
1029 } else { 1061 } else {
1030 EXPECT_TRUE(is_busy()); 1062 EXPECT_TRUE(is_busy());
1031 } 1063 }
1032 } 1064 }
1033 1065
1034 } // namespace offline_pages 1066 } // namespace offline_pages
OLDNEW
« no previous file with comments | « components/offline_pages/background/request_coordinator.cc ('k') | net/nqe/network_quality_estimator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698