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

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 incorrect call in ~HostScanScheduler() 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 class FakeHostScanner : public HostScanner {
29 public:
30 FakeHostScanner()
31 : HostScanner(nullptr,
32 nullptr,
33 nullptr,
34 nullptr,
35 nullptr,
36 nullptr,
37 nullptr,
38 nullptr),
39 num_scans_started_(0) {}
40 ~FakeHostScanner() override {}
41
42 void StartScan() override {
43 is_scan_active_ = true;
44 has_recently_scanned_ = true;
45 num_scans_started_++;
46 }
47
48 void StopScan() { is_scan_active_ = false; }
49
50 bool IsScanActive() override { return is_scan_active_; }
51
52 bool HasRecentlyScanned() override { return has_recently_scanned_; }
53
54 void set_has_recently_scanned(bool has_recently_scanned) {
55 has_recently_scanned_ = has_recently_scanned;
56 }
57
58 int num_scans_started() { return num_scans_started_; }
59
60 private:
61 bool is_scan_active_ = false;
62 bool has_recently_scanned_ = false;
63 int num_scans_started_ = 0;
64 };
65 } // namespace
66
67 class HostScanSchedulerTest : public NetworkStateTest {
23 protected: 68 protected:
24 class TestDelegate : public HostScanScheduler::Delegate { 69 void SetUp() override {
25 public: 70 DBusThreadManager::Initialize();
26 explicit TestDelegate(HostScanSchedulerTest* test) 71 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 72
33 void AddObserver(HostScanScheduler* host_scan_scheduler) override { 73 network_state_handler()->SetTetherTechnologyState(
34 observer_ = host_scan_scheduler; 74 NetworkStateHandler::TECHNOLOGY_ENABLED);
35 }
36 75
37 void RemoveObserver(HostScanScheduler* host_scan_scheduler) override { 76 fake_host_scanner_ = base::MakeUnique<FakeHostScanner>();
38 if (observer_ == host_scan_scheduler) {
39 observer_ = nullptr;
40 }
41 EXPECT_FALSE(IsObserverSet());
42 }
43 77
44 bool IsAuthenticatedUserLoggedIn() const override { 78 host_scan_scheduler_ = base::WrapUnique(new HostScanScheduler(
45 return is_authenticated_user_logged_in; 79 network_state_handler(), fake_host_scanner_.get()));
46 }
47
48 bool IsNetworkConnectedOrConnecting() const override {
49 return is_network_connected_or_connecting;
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 } 80 }
117 81
118 void TearDown() override { 82 void TearDown() override {
119 EXPECT_TRUE(test_delegate_->IsObserverSet());
120 host_scan_scheduler_.reset(); 83 host_scan_scheduler_.reset();
84
85 ShutdownNetworkState();
86 NetworkStateTest::TearDown();
87 DBusThreadManager::Shutdown();
121 } 88 }
122 89
123 void TestScheduleScanNowIfPossible(bool is_authenticated_user_logged_in, 90 base::test::ScopedTaskEnvironment scoped_task_environment_;
124 bool is_network_connected_or_connecting, 91
125 bool are_tether_hosts_synced, 92 std::unique_ptr<FakeHostScanner> fake_host_scanner_;
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 }
135 93
136 std::unique_ptr<HostScanScheduler> host_scan_scheduler_; 94 std::unique_ptr<HostScanScheduler> host_scan_scheduler_;
137
138 TestDelegate* test_delegate_;
139 FakeHostScanner* fake_host_scanner_;
140 }; 95 };
141 96
142 TEST_F(HostScanSchedulerTest, TestObserverAddedAndRemoved) { 97 TEST_F(HostScanSchedulerTest, TestScanRequested) {
143 // Intentionally empty. This test just ensures that adding/removing observers 98 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
144 // (in setUp() and tearDown()) works. 99 EXPECT_FALSE(
145 } 100 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
146 101
147 TEST_F(HostScanSchedulerTest, TestScheduleScanNowIfPossible) { 102 // Begin scanning.
148 EXPECT_EQ(0, fake_host_scanner_->num_scans_started()); 103 host_scan_scheduler_->ScanRequested();
104 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
105 EXPECT_TRUE(
106 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
149 107
150 // A scan should only be started when an authenticated user is logged in, 108 // Should not begin a new scan while a scan is active.
151 // the network is not connected/connecting, and tether hosts are synced. 109 host_scan_scheduler_->ScanRequested();
152 TestScheduleScanNowIfPossible(false, false, false, 0); 110 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
153 TestScheduleScanNowIfPossible(true, false, false, 0); 111 EXPECT_TRUE(
154 TestScheduleScanNowIfPossible(false, true, false, 0); 112 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
155 TestScheduleScanNowIfPossible(false, false, true, 0);
156 TestScheduleScanNowIfPossible(true, true, false, 0);
157 TestScheduleScanNowIfPossible(true, false, true, 1);
158 TestScheduleScanNowIfPossible(false, true, true, 1);
159 TestScheduleScanNowIfPossible(true, true, true, 1);
160 }
161 113
162 TEST_F(HostScanSchedulerTest, TestLoggedInStateChange) { 114 fake_host_scanner_->StopScan();
163 EXPECT_EQ(0, fake_host_scanner_->num_scans_started()); 115 host_scan_scheduler_->ScanFinished();
116 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
117 EXPECT_FALSE(
118 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
164 119
165 test_delegate_->set_is_authenticated_user_logged_in(true); 120 // Should not begin a new scan when a scan has finished recently.
166 test_delegate_->set_is_network_connected_or_connecting(false); 121 host_scan_scheduler_->ScanRequested();
167 test_delegate_->set_are_tether_hosts_synced(true); 122 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
123 EXPECT_FALSE(
124 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
168 125
169 host_scan_scheduler_->LoggedInStateChanged(); 126 // A new scan should be allowed once a scan is not active and has not finished
170 EXPECT_EQ(1, fake_host_scanner_->num_scans_started()); 127 // recently.
171 128 fake_host_scanner_->set_has_recently_scanned(false);
172 // Change a condition so that it should not scan, and re-trigger; there should 129 host_scan_scheduler_->ScanRequested();
173 // still be only 1 started scan. 130 EXPECT_EQ(2, fake_host_scanner_->num_scans_started());
174 test_delegate_->set_is_authenticated_user_logged_in(false); 131 EXPECT_TRUE(
175 host_scan_scheduler_->LoggedInStateChanged(); 132 network_state_handler()->GetScanningByType(NetworkTypePattern::Tether()));
176 EXPECT_EQ(1, fake_host_scanner_->num_scans_started());
177 }
178
179 TEST_F(HostScanSchedulerTest, TestSuspendDone) {
180 EXPECT_EQ(0, fake_host_scanner_->num_scans_started());
181
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());
188
189 // Change a condition so that it should not scan, and re-trigger; there should
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 } 133 }
233 134
234 } // namespace tether 135 } // namespace tether
235 136
236 } // namespace chromeos 137 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698