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

Side by Side Diff: chromeos/components/tether/host_scan_scheduler_unittest.cc

Issue 2870393003: Tether: only scan when asked to by NetworkStateHandler. (Closed)
Patch Set: Remove PowerManagerClient callbacks and implement all NetworkStateHandler callbacks. Created 3 years, 7 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 "chromeos/components/tether/host_scan_scheduler.h" 5 #include "chromeos/components/tether/host_scan_scheduler.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/run_loop.h"
9 #include "base/test/scoped_task_environment.h"
8 #include "chromeos/components/tether/host_scanner.h" 10 #include "chromeos/components/tether/host_scanner.h"
11 #include "chromeos/dbus/dbus_thread_manager.h"
9 #include "chromeos/dbus/power_manager_client.h" 12 #include "chromeos/dbus/power_manager_client.h"
10 #include "chromeos/login/login_state.h" 13 #include "chromeos/login/login_state.h"
11 #include "chromeos/network/network_handler.h" 14 #include "chromeos/network/network_handler.h"
12 #include "chromeos/network/network_state.h" 15 #include "chromeos/network/network_state.h"
13 #include "chromeos/network/network_state_handler.h" 16 #include "chromeos/network/network_state_handler.h"
17 #include "chromeos/network/network_state_test.h"
18 #include "chromeos/network/network_type_pattern.h"
14 #include "components/cryptauth/cryptauth_device_manager.h" 19 #include "components/cryptauth/cryptauth_device_manager.h"
15 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
17 22
18 namespace chromeos { 23 namespace chromeos {
19 24
20 namespace tether { 25 namespace tether {
21 26
22 class HostScanSchedulerTest : public testing::Test { 27 namespace {
28
29 class FakeHostScanner : public HostScanner {
30 public:
31 FakeHostScanner()
32 : HostScanner(nullptr,
33 nullptr,
34 nullptr,
35 nullptr,
36 nullptr,
37 nullptr,
38 nullptr,
39 nullptr),
40 num_scans_started_(0) {}
41 ~FakeHostScanner() override {}
42
43 void StartScan() override {
44 is_scan_active_ = true;
45 has_recently_scanned_ = true;
46 num_scans_started_++;
47 }
48
49 void StopScan() { is_scan_active_ = false; }
50
51 bool IsScanActive() override { return is_scan_active_; }
52
53 bool HasRecentlyScanned() override { return has_recently_scanned_; }
54
55 void set_has_recently_scanned(bool has_recently_scanned) {
56 has_recently_scanned_ = has_recently_scanned;
57 }
58
59 int num_scans_started() { return num_scans_started_; }
60
61 private:
62 bool is_scan_active_ = false;
63 bool has_recently_scanned_ = false;
64 int num_scans_started_ = 0;
65 };
66
67 const char kWifiServiceGuid[] = "wifiServiceGuid";
68
69 std::string CreateConfigurationJsonString() {
70 std::stringstream ss;
71 ss << "{"
72 << " \"GUID\": \"" << kWifiServiceGuid << "\","
73 << " \"Type\": \"" << shill::kTypeWifi << "\","
74 << " \"State\": \"" << shill::kStateReady << "\""
75 << "}";
76 return ss.str();
77 }
78
79 } // namespace
80
81 class HostScanSchedulerTest : public NetworkStateTest {
23 protected: 82 protected:
24 class TestDelegate : public HostScanScheduler::Delegate { 83 void SetUp() override {
25 public: 84 DBusThreadManager::Initialize();
26 explicit TestDelegate(HostScanSchedulerTest* test) 85 NetworkStateTest::SetUp();
27 : test_(test),
28 observer_(nullptr),
29 is_authenticated_user_logged_in(true),
30 is_network_connected_or_connecting(false),
31 are_tether_hosts_synced(true) {}
32 86
33 void AddObserver(HostScanScheduler* host_scan_scheduler) override { 87 wifi_service_path_ = ConfigureService(CreateConfigurationJsonString());
34 observer_ = host_scan_scheduler; 88 test_manager_client()->SetManagerProperty(shill::kDefaultServiceProperty,
35 } 89 base::Value(wifi_service_path_));
36 90
37 void RemoveObserver(HostScanScheduler* host_scan_scheduler) override { 91 network_state_handler()->SetTetherTechnologyState(
38 if (observer_ == host_scan_scheduler) { 92 NetworkStateHandler::TECHNOLOGY_ENABLED);
39 observer_ = nullptr;
40 }
41 EXPECT_FALSE(IsObserverSet());
42 }
43 93
44 bool IsAuthenticatedUserLoggedIn() const override { 94 fake_host_scanner_ = base::MakeUnique<FakeHostScanner>();
45 return is_authenticated_user_logged_in;
46 }
47 95
48 bool IsNetworkConnectedOrConnecting() const override { 96 host_scan_scheduler_ = base::WrapUnique(new HostScanScheduler(
49 return is_network_connected_or_connecting; 97 network_state_handler(), fake_host_scanner_.get()));
50 }
51
52 bool AreTetherHostsSynced() const override {
53 return are_tether_hosts_synced;
54 }
55
56 bool IsObserverSet() const {
57 return observer_ != nullptr &&
58 observer_ == test_->host_scan_scheduler_.get();
59 }
60
61 void set_is_authenticated_user_logged_in(bool value) {
62 is_authenticated_user_logged_in = value;
63 }
64
65 void set_is_network_connected_or_connecting(bool value) {
66 is_network_connected_or_connecting = value;
67 }
68
69 void set_are_tether_hosts_synced(bool value) {
70 are_tether_hosts_synced = value;
71 }
72
73 private:
74 const HostScanSchedulerTest* test_;
75
76 HostScanScheduler* observer_;
77 bool is_authenticated_user_logged_in;
78 bool is_network_connected_or_connecting;
79 bool are_tether_hosts_synced;
80 };
81
82 class FakeHostScanner : public HostScanner {
83 public:
84 FakeHostScanner()
85 : HostScanner(nullptr,
86 nullptr,
87 nullptr,
88 nullptr,
89 nullptr,
90 nullptr,
91 nullptr),
92 num_scans_started_(0) {}
93 ~FakeHostScanner() override {}
94
95 void StartScan() override { num_scans_started_++; }
96
97 int num_scans_started() { return num_scans_started_; }
98
99 private:
100 int num_scans_started_;
101 };
102
103 HostScanSchedulerTest() {}
104
105 void SetUp() override {
106 test_delegate_ = new TestDelegate(this);
107 fake_host_scanner_ = new FakeHostScanner();
108
109 host_scan_scheduler_.reset(
110 new HostScanScheduler(base::WrapUnique(test_delegate_),
111 base::WrapUnique(fake_host_scanner_)));
112
113 EXPECT_FALSE(test_delegate_->IsObserverSet());
114 host_scan_scheduler_->InitializeAutomaticScans();
115 EXPECT_TRUE(test_delegate_->IsObserverSet());
116 } 98 }
117 99
118 void TearDown() override { 100 void TearDown() override {
119 EXPECT_TRUE(test_delegate_->IsObserverSet());
120 host_scan_scheduler_.reset(); 101 host_scan_scheduler_.reset();
102
103 ShutdownNetworkState();
104 NetworkStateTest::TearDown();
105 DBusThreadManager::Shutdown();
121 } 106 }
122 107
123 void TestScheduleScanNowIfPossible(bool is_authenticated_user_logged_in, 108 void SetDefaultNetworkDisconnected() {
124 bool is_network_connected_or_connecting, 109 SetServiceProperty(wifi_service_path_, std::string(shill::kStateProperty),
125 bool are_tether_hosts_synced, 110 base::Value(shill::kStateIdle));
126 int num_expected_scans) {
127 test_delegate_->set_is_authenticated_user_logged_in(
128 is_authenticated_user_logged_in);
129 test_delegate_->set_is_network_connected_or_connecting(
130 is_network_connected_or_connecting);
131 test_delegate_->set_are_tether_hosts_synced(are_tether_hosts_synced);
132 host_scan_scheduler_->ScheduleScanNowIfPossible();
133 EXPECT_EQ(num_expected_scans, fake_host_scanner_->num_scans_started());
134 } 111 }
135 112
113 void SetDefaultNetworkConnecting() {
114 SetServiceProperty(wifi_service_path_, std::string(shill::kStateProperty),
115 base::Value(shill::kStateAssociation));
116 }
117
118 void SetDefaultNetworkConnected() {
119 SetServiceProperty(wifi_service_path_, std::string(shill::kStateProperty),
120 base::Value(shill::kStateReady));
121 }
122
123 base::test::ScopedTaskEnvironment scoped_task_environment_;
124 std::string wifi_service_path_;
125
126 std::unique_ptr<FakeHostScanner> fake_host_scanner_;
127
136 std::unique_ptr<HostScanScheduler> host_scan_scheduler_; 128 std::unique_ptr<HostScanScheduler> host_scan_scheduler_;
137
138 TestDelegate* test_delegate_;
139 FakeHostScanner* fake_host_scanner_;
140 }; 129 };
141 130
142 TEST_F(HostScanSchedulerTest, TestObserverAddedAndRemoved) { 131 TEST_F(HostScanSchedulerTest, UserLoggedIn) {
143 // Intentionally empty. This test just ensures that adding/removing observers 132 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
144 // (in setUp() and tearDown()) works. 133 EXPECT_FALSE(
134 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
135
136 host_scan_scheduler_->UserLoggedIn();
137
138 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
139 EXPECT_FALSE(
140 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
141
142 SetDefaultNetworkDisconnected();
143 host_scan_scheduler_->UserLoggedIn();
144
145 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
146 EXPECT_TRUE(
147 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
145 } 148 }
146 149
147 TEST_F(HostScanSchedulerTest, TestScheduleScanNowIfPossible) { 150 TEST_F(HostScanSchedulerTest, ScanRequested) {
148 EXPECT_EQ(0, fake_host_scanner_->num_scans_started()); 151 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
152 EXPECT_FALSE(
153 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
149 154
150 // A scan should only be started when an authenticated user is logged in, 155 // Begin scanning.
151 // the network is not connected/connecting, and tether hosts are synced. 156 host_scan_scheduler_->ScanRequested();
152 TestScheduleScanNowIfPossible(false, false, false, 0); 157 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
153 TestScheduleScanNowIfPossible(true, false, false, 0); 158 EXPECT_TRUE(
154 TestScheduleScanNowIfPossible(false, true, false, 0); 159 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
155 TestScheduleScanNowIfPossible(false, false, true, 0); 160
156 TestScheduleScanNowIfPossible(true, true, false, 0); 161 // Should not begin a new scan while a scan is active.
157 TestScheduleScanNowIfPossible(true, false, true, 1); 162 host_scan_scheduler_->ScanRequested();
158 TestScheduleScanNowIfPossible(false, true, true, 1); 163 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
159 TestScheduleScanNowIfPossible(true, true, true, 1); 164 EXPECT_TRUE(
165 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
166
167 fake_host_scanner_->StopScan();
168 host_scan_scheduler_->ScanFinished();
169 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
170 EXPECT_FALSE(
171 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
172
173 // Should not begin a new scan when a scan has finished recently.
174 host_scan_scheduler_->ScanRequested();
175 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
176 EXPECT_FALSE(
177 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
178
179 // A new scan should be allowed once a scan is not active and has not finished
180 // recently.
181 fake_host_scanner_->set_has_recently_scanned(false);
182 host_scan_scheduler_->ScanRequested();
183 EXPECT_EQ(2, fake_host_scanner_->num_scans_started());
184 EXPECT_TRUE(
185 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
160 } 186 }
161 187
162 TEST_F(HostScanSchedulerTest, TestLoggedInStateChange) { 188 TEST_F(HostScanSchedulerTest, DefaultNetworkChanged) {
163 EXPECT_EQ(0, fake_host_scanner_->num_scans_started()); 189 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
190 EXPECT_FALSE(
191 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
164 192
165 test_delegate_->set_is_authenticated_user_logged_in(true); 193 SetDefaultNetworkConnecting();
166 test_delegate_->set_is_network_connected_or_connecting(false);
167 test_delegate_->set_are_tether_hosts_synced(true);
168 194
169 host_scan_scheduler_->LoggedInStateChanged(); 195 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
196 EXPECT_FALSE(
197 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
198
199 SetDefaultNetworkDisconnected();
200
170 EXPECT_EQ(1, fake_host_scanner_->num_scans_started()); 201 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
202 EXPECT_TRUE(
203 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
171 204
172 // Change a condition so that it should not scan, and re-trigger; there should 205 SetDefaultNetworkConnecting();
173 // still be only 1 started scan. 206
174 test_delegate_->set_is_authenticated_user_logged_in(false);
175 host_scan_scheduler_->LoggedInStateChanged();
176 EXPECT_EQ(1, fake_host_scanner_->num_scans_started()); 207 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
177 } 208 EXPECT_TRUE(
209 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
178 210
179 TEST_F(HostScanSchedulerTest, TestSuspendDone) { 211 SetDefaultNetworkDisconnected();
180 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
181 212
182 test_delegate_->set_is_authenticated_user_logged_in(true);
183 test_delegate_->set_is_network_connected_or_connecting(false);
184 test_delegate_->set_are_tether_hosts_synced(true);
185
186 host_scan_scheduler_->SuspendDone(base::TimeDelta::FromSeconds(1));
187 EXPECT_EQ(1, fake_host_scanner_->num_scans_started()); 213 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
188 214 EXPECT_TRUE(
189 // Change a condition so that it should not scan, and re-trigger; there should 215 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
190 // still be only 1 started scan.
191 test_delegate_->set_is_authenticated_user_logged_in(false);
192 host_scan_scheduler_->SuspendDone(base::TimeDelta::FromSeconds(1));
193 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
194 }
195
196 TEST_F(HostScanSchedulerTest, TestNetworkConnectionStateChanged) {
197 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
198
199 test_delegate_->set_is_authenticated_user_logged_in(true);
200 test_delegate_->set_is_network_connected_or_connecting(false);
201 test_delegate_->set_are_tether_hosts_synced(true);
202
203 host_scan_scheduler_->NetworkConnectionStateChanged(nullptr);
204 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
205
206 // Change a condition so that it should not scan, and re-trigger; there should
207 // still be only 1 started scan.
208 test_delegate_->set_is_network_connected_or_connecting(true);
209 host_scan_scheduler_->NetworkConnectionStateChanged(nullptr);
210 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
211 }
212
213 TEST_F(HostScanSchedulerTest, TestOnSyncFinished) {
214 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
215
216 test_delegate_->set_is_authenticated_user_logged_in(true);
217 test_delegate_->set_is_network_connected_or_connecting(false);
218 test_delegate_->set_are_tether_hosts_synced(true);
219
220 host_scan_scheduler_->OnSyncFinished(
221 cryptauth::CryptAuthDeviceManager::SyncResult::SUCCESS,
222 cryptauth::CryptAuthDeviceManager::DeviceChangeResult::CHANGED);
223 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
224
225 // Change a condition so that it should not scan, and re-trigger; there should
226 // still be only 1 started scan.
227 test_delegate_->set_are_tether_hosts_synced(false);
228 host_scan_scheduler_->OnSyncFinished(
229 cryptauth::CryptAuthDeviceManager::SyncResult::SUCCESS,
230 cryptauth::CryptAuthDeviceManager::DeviceChangeResult::UNCHANGED);
231 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
232 } 216 }
233 217
234 } // namespace tether 218 } // namespace tether
235 219
236 } // namespace chromeos 220 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698