blob: d6365df9fde67c3ad470828c640d8dcee0a453a6 [file] [log] [blame]
hansberry67d781c2017-03-02 01:51:501// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chromeos/network/network_connect.h"
6
7#include <memory>
8
9#include "base/macros.h"
10#include "base/memory/ptr_util.h"
11#include "base/run_loop.h"
fdorayc85e9b82017-04-06 15:37:2212#include "base/test/scoped_task_environment.h"
Steven Bennettsb4bf6cd2019-04-05 17:02:5713#include "chromeos/dbus/shill/shill_clients.h"
Steven Bennettsd11e440f2019-04-04 01:09:0014#include "chromeos/dbus/shill/shill_device_client.h"
15#include "chromeos/dbus/shill/shill_service_client.h"
Steven Bennetts4bea3032019-01-03 19:33:1816#include "chromeos/login/login_state/login_state.h"
hansberry67d781c2017-03-02 01:51:5017#include "chromeos/network/network_connect.h"
18#include "chromeos/network/network_connection_handler.h"
19#include "chromeos/network/network_handler.h"
varkhac6eefbe2017-03-23 23:26:1020#include "chromeos/network/network_state.h"
hansberry67d781c2017-03-02 01:51:5021#include "chromeos/network/network_state_handler.h"
22#include "testing/gmock/include/gmock/gmock.h"
23#include "testing/gtest/include/gtest/gtest.h"
24#include "testing/platform_test.h"
25#include "third_party/cros_system_api/dbus/service_constants.h"
26
27using testing::_;
28using testing::AnyNumber;
29using testing::NiceMock;
30using testing::Return;
31
32namespace chromeos {
33
34namespace {
35
36const char kWiFi1ServicePath[] = "/service/wifi1";
37const char kWiFi1Guid[] = "wifi1_guid";
38
39const char kCellular1DevicePath[] = "/device/stub_cellular_device1";
40const char kCellular1ServicePath[] = "/service/cellular1";
41const char kCellular1Guid[] = "cellular1_guid";
42
khorimoto00bbba52017-05-03 00:18:4843const char kTetherGuid[] = "tether_guid";
44
hansberry67d781c2017-03-02 01:51:5045class MockDelegate : public NetworkConnect::Delegate {
46 public:
Chris Watkins2c529d62017-11-29 02:14:4147 MockDelegate() = default;
48 ~MockDelegate() override = default;
hansberry67d781c2017-03-02 01:51:5049
50 MOCK_METHOD1(ShowNetworkConfigure, void(const std::string& network_id));
51 MOCK_METHOD1(ShowNetworkSettings, void(const std::string& network_id));
52 MOCK_METHOD1(ShowEnrollNetwork, bool(const std::string& network_id));
hansberry67d781c2017-03-02 01:51:5053 MOCK_METHOD1(ShowMobileSetupDialog, void(const std::string& network_id));
54 MOCK_METHOD2(ShowNetworkConnectError,
55 void(const std::string& error_name,
56 const std::string& network_id));
57 MOCK_METHOD1(ShowMobileActivationError, void(const std::string& network_id));
58};
59
khorimoto00bbba52017-05-03 00:18:4860class FakeTetherDelegate : public NetworkConnectionHandler::TetherDelegate {
61 public:
Chris Watkins2c529d62017-11-29 02:14:4162 FakeTetherDelegate() = default;
63 ~FakeTetherDelegate() override = default;
khorimoto00bbba52017-05-03 00:18:4864
65 std::string last_connected_tether_network_guid() {
66 return last_connected_tether_network_guid_;
67 }
68
69 // NetworkConnectionHandler::TetherDelegate:
70 void ConnectToNetwork(
71 const std::string& tether_network_guid,
72 const base::Closure& success_callback,
73 const network_handler::StringResultCallback& error_callback) override {
74 last_connected_tether_network_guid_ = tether_network_guid;
75 success_callback.Run();
76 }
khorimotod46b48b2017-05-04 04:17:3677 void DisconnectFromNetwork(
78 const std::string& tether_network_guid,
79 const base::Closure& success_callback,
80 const network_handler::StringResultCallback& error_callback) override {}
khorimoto00bbba52017-05-03 00:18:4881
82 private:
83 std::string last_connected_tether_network_guid_;
84};
85
hansberry67d781c2017-03-02 01:51:5086} // namespace
87
88class NetworkConnectTest : public testing::Test {
89 public:
Chris Watkins2c529d62017-11-29 02:14:4190 NetworkConnectTest() = default;
91 ~NetworkConnectTest() override = default;
hansberry67d781c2017-03-02 01:51:5092
93 void SetUp() override {
94 testing::Test::SetUp();
Steven Bennettsb4bf6cd2019-04-05 17:02:5795 shill_clients::InitializeFakes();
hansberry67d781c2017-03-02 01:51:5096 LoginState::Initialize();
97 SetupDefaultShillState();
98 NetworkHandler::Initialize();
99 base::RunLoop().RunUntilIdle();
100
101 mock_delegate_.reset(new MockDelegate());
102 ON_CALL(*mock_delegate_, ShowEnrollNetwork(_)).WillByDefault(Return(true));
103
khorimoto00bbba52017-05-03 00:18:48104 fake_tether_delegate_.reset(new FakeTetherDelegate());
105 NetworkHandler::Get()->network_connection_handler()->SetTetherDelegate(
106 fake_tether_delegate_.get());
107
hansberry67d781c2017-03-02 01:51:50108 NetworkConnect::Initialize(mock_delegate_.get());
109 }
110
111 void TearDown() override {
112 NetworkConnect::Shutdown();
113 mock_delegate_.reset();
114 LoginState::Shutdown();
115 NetworkHandler::Shutdown();
Steven Bennettsb4bf6cd2019-04-05 17:02:57116 shill_clients::Shutdown();
hansberry67d781c2017-03-02 01:51:50117 testing::Test::TearDown();
118 }
119
120 protected:
121 void SetupDefaultShillState() {
122 base::RunLoop().RunUntilIdle();
Steven Bennettsb4bf6cd2019-04-05 17:02:57123 device_test_ = ShillDeviceClient::Get()->GetTestInterface();
hansberry67d781c2017-03-02 01:51:50124 device_test_->ClearDevices();
125 device_test_->AddDevice("/device/stub_wifi_device1", shill::kTypeWifi,
126 "stub_wifi_device1");
127 device_test_->AddDevice(kCellular1DevicePath, shill::kTypeCellular,
128 "stub_cellular_device1");
Steven Bennettsb06cf2b2018-04-26 18:33:59129 device_test_->SetDeviceProperty(
130 kCellular1DevicePath, shill::kTechnologyFamilyProperty,
131 base::Value(shill::kNetworkTechnologyGsm), /*notify_changed=*/true);
hansberry67d781c2017-03-02 01:51:50132
Steven Bennettsb4bf6cd2019-04-05 17:02:57133 service_test_ = ShillServiceClient::Get()->GetTestInterface();
hansberry67d781c2017-03-02 01:51:50134 service_test_->ClearServices();
135 const bool add_to_visible = true;
136
137 // Create a wifi network and set to online.
138 service_test_->AddService(kWiFi1ServicePath, kWiFi1Guid, "wifi1",
139 shill::kTypeWifi, shill::kStateIdle,
140 add_to_visible);
141 service_test_->SetServiceProperty(kWiFi1ServicePath,
142 shill::kSecurityClassProperty,
jdoerrie122c4da2017-03-06 11:12:04143 base::Value(shill::kSecurityWep));
jdoerrie239723572017-03-02 12:09:19144 service_test_->SetServiceProperty(
145 kWiFi1ServicePath, shill::kConnectableProperty, base::Value(true));
jdoerrie122c4da2017-03-06 11:12:04146 service_test_->SetServiceProperty(
147 kWiFi1ServicePath, shill::kPassphraseProperty, base::Value("password"));
hansberry67d781c2017-03-02 01:51:50148
149 // Create a cellular network.
150 service_test_->AddService(kCellular1ServicePath, kCellular1Guid,
151 "cellular1", shill::kTypeCellular,
152 shill::kStateIdle, add_to_visible);
jdoerrie239723572017-03-02 12:09:19153 service_test_->SetServiceProperty(
154 kCellular1ServicePath, shill::kConnectableProperty, base::Value(true));
hansberry67d781c2017-03-02 01:51:50155 service_test_->SetServiceProperty(
156 kCellular1ServicePath, shill::kActivationStateProperty,
jdoerrie122c4da2017-03-06 11:12:04157 base::Value(shill::kActivationStateActivated));
hansberry67d781c2017-03-02 01:51:50158 service_test_->SetServiceProperty(kCellular1ServicePath,
159 shill::kOutOfCreditsProperty,
jdoerrie239723572017-03-02 12:09:19160 base::Value(false));
hansberry67d781c2017-03-02 01:51:50161
162 base::RunLoop().RunUntilIdle();
163 }
164
khorimoto00bbba52017-05-03 00:18:48165 void AddTetherNetwork(bool has_connected_to_host) {
166 NetworkStateHandler* handler =
167 NetworkHandler::Get()->network_state_handler();
168 handler->SetTetherTechnologyState(
169 NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED);
170 handler->AddTetherNetworkState(kTetherGuid, "TetherName", "TetherCarrier",
171 100 /* battery_percentage */,
172 100 /* signal_strength */,
173 has_connected_to_host);
174 }
175
hansberry67d781c2017-03-02 01:51:50176 std::unique_ptr<MockDelegate> mock_delegate_;
khorimoto00bbba52017-05-03 00:18:48177 std::unique_ptr<FakeTetherDelegate> fake_tether_delegate_;
fdorayc85e9b82017-04-06 15:37:22178 base::test::ScopedTaskEnvironment scoped_task_environment_;
hansberry67d781c2017-03-02 01:51:50179 ShillDeviceClient::TestInterface* device_test_;
180 ShillServiceClient::TestInterface* service_test_;
181
182 private:
183 DISALLOW_COPY_AND_ASSIGN(NetworkConnectTest);
184};
185
186TEST_F(NetworkConnectTest, ConnectToNetworkId_NoConfiguration) {
187 EXPECT_CALL(*mock_delegate_, ShowNetworkConfigure(_)).Times(0);
188 EXPECT_CALL(*mock_delegate_, ShowNetworkConnectError(_, _)).Times(0);
189
190 NetworkConnect::Get()->ConnectToNetworkId("bad guid");
191}
192
193TEST_F(NetworkConnectTest, ConfigureAndConnectToNetwork_NoConfiguration) {
194 EXPECT_CALL(*mock_delegate_,
195 ShowNetworkConnectError(NetworkConnectionHandler::kErrorNotFound,
196 "bad guid"));
197
198 base::DictionaryValue properties;
199 NetworkConnect::Get()->ConfigureNetworkIdAndConnect("bad guid", properties,
200 true);
201}
202
203TEST_F(NetworkConnectTest,
204 ConfigureAndConnectToNetwork_NotSharedButNoProfilePath) {
205 EXPECT_CALL(*mock_delegate_,
206 ShowNetworkConnectError(
207 NetworkConnectionHandler::kErrorConfigureFailed, kWiFi1Guid));
208
209 base::DictionaryValue properties;
210 NetworkConnect::Get()->ConfigureNetworkIdAndConnect(kWiFi1Guid, properties,
211 false);
212}
213
varkhac6eefbe2017-03-23 23:26:10214TEST_F(NetworkConnectTest, ConnectThenDisconnectWiFiNetwork) {
215 const NetworkState* network =
216 NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid(
217 kWiFi1Guid);
218
219 NetworkConnect::Get()->ConnectToNetworkId(kWiFi1Guid);
220 base::RunLoop().RunUntilIdle();
221 EXPECT_TRUE(network->IsConnectedState());
222
223 NetworkConnect::Get()->DisconnectFromNetworkId(kWiFi1Guid);
224 base::RunLoop().RunUntilIdle();
225 EXPECT_FALSE(network->IsConnectedState());
226 EXPECT_FALSE(network->IsConnectingState());
227}
228
khorimoto00bbba52017-05-03 00:18:48229TEST_F(NetworkConnectTest, ConnectToTetherNetwork_HasConnectedToHost) {
230 EXPECT_CALL(*mock_delegate_, ShowNetworkConfigure(_)).Times(0);
231
232 AddTetherNetwork(true /* has_connected_to_host */);
233
234 NetworkConnect::Get()->ConnectToNetworkId(kTetherGuid);
235 EXPECT_EQ(kTetherGuid,
236 fake_tether_delegate_->last_connected_tether_network_guid());
237}
238
239TEST_F(NetworkConnectTest, ConnectToTetherNetwork_HasNotConnectedToHost) {
240 EXPECT_CALL(*mock_delegate_, ShowNetworkConfigure(_));
241
242 AddTetherNetwork(false /* has_connected_to_host */);
243
244 NetworkConnect::Get()->ConnectToNetworkId(kTetherGuid);
245 EXPECT_TRUE(
246 fake_tether_delegate_->last_connected_tether_network_guid().empty());
247}
248
hansberry67d781c2017-03-02 01:51:50249TEST_F(NetworkConnectTest, ActivateCellular) {
250 EXPECT_CALL(*mock_delegate_, ShowMobileSetupDialog(kCellular1Guid));
251
252 service_test_->SetServiceProperty(
253 kCellular1ServicePath, shill::kActivationStateProperty,
jdoerrie122c4da2017-03-06 11:12:04254 base::Value(shill::kActivationStateNotActivated));
hansberry67d781c2017-03-02 01:51:50255 base::RunLoop().RunUntilIdle();
256
257 NetworkConnect::Get()->ConnectToNetworkId(kCellular1Guid);
258}
259
260TEST_F(NetworkConnectTest, ActivateCellular_Error) {
261 EXPECT_CALL(*mock_delegate_, ShowMobileActivationError(kCellular1Guid));
262
263 service_test_->SetServiceProperty(
264 kCellular1ServicePath, shill::kActivationStateProperty,
jdoerrie122c4da2017-03-06 11:12:04265 base::Value(shill::kActivationStateNotActivated));
hansberry67d781c2017-03-02 01:51:50266 service_test_->SetServiceProperty(
267 kCellular1ServicePath, shill::kActivationTypeProperty,
jdoerrie122c4da2017-03-06 11:12:04268 base::Value(shill::kActivationTypeNonCellular));
hansberry67d781c2017-03-02 01:51:50269 base::RunLoop().RunUntilIdle();
270
271 NetworkConnect::Get()->ConnectToNetworkId(kCellular1Guid);
272}
273
hansberry67d781c2017-03-02 01:51:50274} // namespace chromeos