blob: 8659c2833c4e4248dbf8760ba706fe6c622fc17d [file] [log] [blame]
Peter Qiuc0beca52015-09-03 11:25:46 -07001//
2// Copyright (C) 2012 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Darin Petkovb72b62e2012-05-15 16:55:36 +020016
Ben Chanc3d707d2014-10-31 08:56:05 -070017#include "shill/wimax/wimax_provider.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020018
Ben Chan084faca2013-07-02 14:25:12 -070019#include <string>
20#include <vector>
21
Ben Chana0ddf462014-02-06 11:32:42 -080022#include <base/strings/stringprintf.h>
Samuel Tan289a5a52015-09-21 11:35:20 -070023#if defined(__ANDROID__)
24#include <dbus/service_constants.h>
25#else
Darin Petkov9893d9c2012-05-17 15:27:31 -070026#include <chromeos/dbus/service_constants.h>
Samuel Tan289a5a52015-09-21 11:35:20 -070027#endif // __ANDROID__
Darin Petkovb72b62e2012-05-15 16:55:36 +020028
Paul Stewartc43cbbe2013-04-11 06:29:30 -070029#include "shill/eap_credentials.h"
mukesh agrawal4f930f92015-08-26 16:00:49 -070030#include "shill/fake_store.h"
Darin Petkove4b27022012-05-16 13:28:50 +020031#include "shill/mock_device_info.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020032#include "shill/mock_manager.h"
33#include "shill/mock_metrics.h"
Ben Chan0bc1aca2014-01-27 16:35:37 -080034#include "shill/mock_profile.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020035#include "shill/nice_mock_control.h"
Ben Chan0bc1aca2014-01-27 16:35:37 -080036#include "shill/testing.h"
Ben Chanc3d707d2014-10-31 08:56:05 -070037#include "shill/wimax/mock_wimax.h"
38#include "shill/wimax/mock_wimax_manager_proxy.h"
39#include "shill/wimax/mock_wimax_network_proxy.h"
40#include "shill/wimax/mock_wimax_service.h"
41#include "shill/wimax/wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020042
43using std::string;
44using std::vector;
Darin Petkovb72b62e2012-05-15 16:55:36 +020045using testing::Return;
Ben Chan0bc1aca2014-01-27 16:35:37 -080046using testing::ReturnNull;
Ben Chan084faca2013-07-02 14:25:12 -070047using testing::SaveArg;
Peter Qiu18213652015-04-21 16:01:51 -070048using testing::StartsWith;
Ben Chan084faca2013-07-02 14:25:12 -070049using testing::_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020050
51namespace shill {
52
Darin Petkove4b27022012-05-16 13:28:50 +020053namespace {
Darin Petkove4b27022012-05-16 13:28:50 +020054
55string GetTestLinkName(int index) {
Ben Chana0ddf462014-02-06 11:32:42 -080056 return base::StringPrintf("wm%d", index);
Darin Petkove4b27022012-05-16 13:28:50 +020057}
58
59string GetTestPath(int index) {
Darin Petkov9893d9c2012-05-17 15:27:31 -070060 return wimax_manager::kDeviceObjectPathPrefix + GetTestLinkName(index);
Darin Petkove4b27022012-05-16 13:28:50 +020061}
Darin Petkov9893d9c2012-05-17 15:27:31 -070062
Ben Chan7fab8972014-08-10 17:14:46 -070063string GetTestNetworkPath(uint32_t identifier) {
Darin Petkovc63dcf02012-05-24 11:51:43 +020064 return base::StringPrintf("%s%08x",
65 wimax_manager::kNetworkObjectPathPrefix,
66 identifier);
67}
68
Darin Petkove4b27022012-05-16 13:28:50 +020069} // namespace
70
Darin Petkovb72b62e2012-05-15 16:55:36 +020071class WiMaxProviderTest : public testing::Test {
72 public:
73 WiMaxProviderTest()
Peter Qiu77236772015-08-13 13:03:43 -070074 : network_proxy_(new MockWiMaxNetworkProxy()),
Ben Chan53cc8942014-09-30 10:49:57 -070075 metrics_(nullptr),
mukesh agrawalbad1c102015-09-18 16:15:08 -070076 manager_(&control_, nullptr, &metrics_),
Ben Chan53cc8942014-09-30 10:49:57 -070077 device_info_(&control_, nullptr, &metrics_, &manager_),
Peter Qiu77236772015-08-13 13:03:43 -070078 provider_(&control_, nullptr, &metrics_, &manager_) {}
Darin Petkovb72b62e2012-05-15 16:55:36 +020079
80 virtual ~WiMaxProviderTest() {}
81
82 protected:
Paul Stewart93d81792015-06-16 13:13:10 -070083 string GetServiceFriendlyName(const ServiceRefPtr& service) {
Darin Petkov457728b2013-01-09 09:49:08 +010084 return service->friendly_name();
85 }
86
Ben Chan247dcc12014-10-13 06:49:26 -070087 std::unique_ptr<MockWiMaxNetworkProxy> network_proxy_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020088 NiceMockControl control_;
89 MockMetrics metrics_;
90 MockManager manager_;
Darin Petkove4b27022012-05-16 13:28:50 +020091 MockDeviceInfo device_info_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020092 WiMaxProvider provider_;
93};
94
95TEST_F(WiMaxProviderTest, StartStop) {
Peter Qiu77236772015-08-13 13:03:43 -070096 MockWiMaxManagerProxy* wimax_manager_proxy = new MockWiMaxManagerProxy();
Ben Chan084faca2013-07-02 14:25:12 -070097
Peter Qiu77236772015-08-13 13:03:43 -070098 base::Closure service_appeared_callback;
Darin Petkovb501ad22012-07-03 12:50:52 +020099 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Peter Qiu77236772015-08-13 13:03:43 -0700100 EXPECT_CALL(control_, CreateWiMaxManagerProxy(_, _))
101 .WillOnce(DoAll(SaveArg<0>(&service_appeared_callback),
102 Return(wimax_manager_proxy)));
103 EXPECT_CALL(*wimax_manager_proxy, set_devices_changed_callback(_)).Times(1);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200104 provider_.Start();
Darin Petkovb501ad22012-07-03 12:50:52 +0200105 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
Peter Qiu77236772015-08-13 13:03:43 -0700106
107 EXPECT_CALL(*wimax_manager_proxy, Devices(_))
108 .WillOnce(Return(RpcIdentifiers()));
109 service_appeared_callback.Run();
110
Darin Petkove4b27022012-05-16 13:28:50 +0200111 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200112 provider_.Stop();
Darin Petkovb501ad22012-07-03 12:50:52 +0200113 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200114 EXPECT_TRUE(provider_.pending_devices_.empty());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200115}
116
Darin Petkovb501ad22012-07-03 12:50:52 +0200117TEST_F(WiMaxProviderTest, ConnectDisconnectWiMaxManager) {
Peter Qiu77236772015-08-13 13:03:43 -0700118 MockWiMaxManagerProxy* wimax_manager_proxy = new MockWiMaxManagerProxy();
119 provider_.wimax_manager_proxy_.reset(wimax_manager_proxy);
120
121 EXPECT_CALL(*wimax_manager_proxy, Devices(_))
Darin Petkovb501ad22012-07-03 12:50:52 +0200122 .WillOnce(Return(RpcIdentifiers()));
123 provider_.ConnectToWiMaxManager();
Peter Qiu77236772015-08-13 13:03:43 -0700124
Darin Petkovb501ad22012-07-03 12:50:52 +0200125 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
126 provider_.DisconnectFromWiMaxManager();
Darin Petkovb501ad22012-07-03 12:50:52 +0200127 EXPECT_TRUE(provider_.pending_devices_.empty());
128}
129
Darin Petkov9893d9c2012-05-17 15:27:31 -0700130TEST_F(WiMaxProviderTest, OnDevicesChanged) {
Darin Petkove4b27022012-05-16 13:28:50 +0200131 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
132
133 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
Darin Petkov9893d9c2012-05-17 15:27:31 -0700134 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200135 live_devices.push_back(GetTestPath(2));
136 live_devices.push_back(GetTestPath(3));
137 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(2))).WillOnce(Return(-1));
138 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(3))).WillOnce(Return(-1));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700139 provider_.OnDevicesChanged(live_devices);
Darin Petkove4b27022012-05-16 13:28:50 +0200140 ASSERT_EQ(2, provider_.pending_devices_.size());
141 EXPECT_EQ(GetTestPath(2), provider_.pending_devices_[GetTestLinkName(2)]);
142 EXPECT_EQ(GetTestPath(3), provider_.pending_devices_[GetTestLinkName(3)]);
143}
144
145TEST_F(WiMaxProviderTest, OnDeviceInfoAvailable) {
146 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
147
148 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
149 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
150 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
151 EXPECT_CALL(device_info_, RegisterDevice(_));
152 provider_.OnDeviceInfoAvailable(GetTestLinkName(1));
153 EXPECT_TRUE(provider_.pending_devices_.empty());
154 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200155 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
156 EXPECT_EQ(GetTestLinkName(1),
157 provider_.devices_[GetTestLinkName(1)]->link_name());
Darin Petkove4b27022012-05-16 13:28:50 +0200158}
159
Darin Petkove4b27022012-05-16 13:28:50 +0200160TEST_F(WiMaxProviderTest, CreateDevice) {
161 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
162
163 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(-1));
164 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
165 EXPECT_TRUE(provider_.devices_.empty());
166 ASSERT_EQ(1, provider_.pending_devices_.size());
167 EXPECT_EQ(GetTestPath(1), provider_.pending_devices_[GetTestLinkName(1)]);
168
169 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
170 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
171 EXPECT_CALL(device_info_, RegisterDevice(_));
172 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
173 EXPECT_TRUE(provider_.pending_devices_.empty());
174 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200175 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
176 EXPECT_EQ(GetTestLinkName(1),
177 provider_.devices_[GetTestLinkName(1)]->link_name());
178
Paul Stewart93d81792015-06-16 13:13:10 -0700179 WiMax* device = provider_.devices_[GetTestLinkName(1)].get();
Darin Petkov0fcd3462012-05-17 11:25:11 +0200180 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
181 EXPECT_EQ(device, provider_.devices_[GetTestLinkName(1)].get());
Darin Petkove4b27022012-05-16 13:28:50 +0200182}
183
184TEST_F(WiMaxProviderTest, DestroyDeadDevices) {
185 for (int i = 0; i < 4; i++) {
Darin Petkovb96a4512012-06-04 11:02:49 +0200186 scoped_refptr<MockWiMax> device(
Ben Chan53cc8942014-09-30 10:49:57 -0700187 new MockWiMax(&control_, nullptr, &metrics_, &manager_,
Darin Petkovb96a4512012-06-04 11:02:49 +0200188 GetTestLinkName(i), "", i, GetTestPath(i)));
189 EXPECT_CALL(*device, OnDeviceVanished()).Times((i == 0 || i == 3) ? 0 : 1);
190 provider_.devices_[GetTestLinkName(i)] = device;
Darin Petkove4b27022012-05-16 13:28:50 +0200191 }
192 for (int i = 4; i < 8; i++) {
193 provider_.pending_devices_[GetTestLinkName(i)] = GetTestPath(i);
194 }
Darin Petkov9893d9c2012-05-17 15:27:31 -0700195 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200196 live_devices.push_back(GetTestPath(0));
197 live_devices.push_back(GetTestPath(3));
198 live_devices.push_back(GetTestPath(4));
199 live_devices.push_back(GetTestPath(7));
200 live_devices.push_back(GetTestPath(123));
201 EXPECT_CALL(manager_, device_info())
202 .Times(2)
203 .WillRepeatedly(Return(&device_info_));
204 EXPECT_CALL(device_info_, DeregisterDevice(_)).Times(2);
205 provider_.DestroyDeadDevices(live_devices);
206 ASSERT_EQ(2, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200207 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(0)));
208 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(3)));
Darin Petkove4b27022012-05-16 13:28:50 +0200209 EXPECT_EQ(2, provider_.pending_devices_.size());
210 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(4)));
211 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(7)));
212}
213
214TEST_F(WiMaxProviderTest, GetLinkName) {
215 EXPECT_EQ("", provider_.GetLinkName("/random/path"));
216 EXPECT_EQ(GetTestLinkName(1), provider_.GetLinkName(GetTestPath(1)));
217}
218
Darin Petkovfc00fd42012-05-30 11:30:06 +0200219TEST_F(WiMaxProviderTest, RetrieveNetworkInfo) {
220 static const char kName[] = "Default Network";
Ben Chan7fab8972014-08-10 17:14:46 -0700221 const uint32_t kIdentifier = 0xabcdef;
Darin Petkovfc00fd42012-05-30 11:30:06 +0200222 static const char kNetworkId[] = "00abcdef";
Ben Chan0bc1aca2014-01-27 16:35:37 -0800223 string network_path = GetTestNetworkPath(kIdentifier);
Peter Qiu608ec292015-07-30 15:46:16 -0700224 EXPECT_CALL(control_, CreateWiMaxNetworkProxy(network_path))
Ben Chan0bc1aca2014-01-27 16:35:37 -0800225 .WillOnce(ReturnAndReleasePointee(&network_proxy_));
Darin Petkovfc00fd42012-05-30 11:30:06 +0200226 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
227 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
Ben Chan0bc1aca2014-01-27 16:35:37 -0800228 provider_.RetrieveNetworkInfo(network_path);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200229 EXPECT_EQ(1, provider_.networks_.size());
Ben Chan0bc1aca2014-01-27 16:35:37 -0800230 EXPECT_TRUE(ContainsKey(provider_.networks_, network_path));
231 EXPECT_EQ(kName, provider_.networks_[network_path].name);
232 EXPECT_EQ(kNetworkId, provider_.networks_[network_path].id);
233 provider_.RetrieveNetworkInfo(network_path);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200234 EXPECT_EQ(1, provider_.networks_.size());
235}
236
Darin Petkovc63dcf02012-05-24 11:51:43 +0200237TEST_F(WiMaxProviderTest, FindService) {
238 EXPECT_FALSE(provider_.FindService("some_storage_id"));
239 scoped_refptr<MockWiMaxService> service(
Ben Chan53cc8942014-09-30 10:49:57 -0700240 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200241 static const char kName[] = "WiMAX Network";
242 static const char kNetworkId[] = "76543210";
243 service->set_friendly_name(kName);
244 service->set_network_id(kNetworkId);
245 service->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200246 provider_.services_[service->GetStorageIdentifier()] = service;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200247 EXPECT_EQ(service.get(),
248 provider_.FindService(
249 WiMaxService::CreateStorageIdentifier(kNetworkId,
250 kName)).get());
251 EXPECT_FALSE(provider_.FindService("some_storage_id"));
252}
253
Darin Petkovfc00fd42012-05-30 11:30:06 +0200254TEST_F(WiMaxProviderTest, StartLiveServices) {
Ben Chan7fab8972014-08-10 17:14:46 -0700255 const uint32_t kIdentifier = 0x1234567;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200256 static const char kNetworkId[] = "01234567";
257 static const char kName[] = "Some WiMAX Provider";
Ben Chane2ee5e02014-09-19 19:29:42 -0700258 vector<scoped_refptr<MockWiMaxService>> services(4);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200259 for (size_t i = 0; i < services.size(); i++) {
Ben Chan53cc8942014-09-30 10:49:57 -0700260 services[i] =
261 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200262 if (i == 0) {
263 services[0]->set_network_id("deadbeef");
264 } else {
265 services[i]->set_network_id(kNetworkId);
266 }
267 // Make services[3] the default service.
268 if (i == 3) {
269 services[i]->set_friendly_name(kName);
270 } else {
271 services[i]->set_friendly_name(
272 base::StringPrintf("Configured %d", static_cast<int>(i)));
273 }
274 services[i]->InitStorageIdentifier();
275 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200276 }
Darin Petkovfc00fd42012-05-30 11:30:06 +0200277 WiMaxProvider::NetworkInfo info;
278 info.id = kNetworkId;
279 info.name = kName;
280 provider_.networks_[GetTestNetworkPath(kIdentifier)] = info;
281 network_proxy_.reset();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200282 EXPECT_CALL(*services[0], IsStarted()).Times(0);
283 EXPECT_CALL(*services[1], IsStarted()).WillOnce(Return(true));
284 EXPECT_CALL(*services[1], Start(_)).Times(0);
285 EXPECT_CALL(*services[2], IsStarted()).WillOnce(Return(false));
286 EXPECT_CALL(*services[2], Start(_)).WillOnce(Return(true));
287 EXPECT_CALL(*services[3], IsStarted()).WillOnce(Return(false));
288 EXPECT_CALL(*services[3], Start(_)).WillOnce(Return(false));
289 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200290 provider_.StartLiveServices();
291 EXPECT_FALSE(services[0]->is_default());
292 EXPECT_FALSE(services[1]->is_default());
293 EXPECT_FALSE(services[2]->is_default());
294 EXPECT_TRUE(services[3]->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200295}
296
297TEST_F(WiMaxProviderTest, DestroyAllServices) {
Ben Chane2ee5e02014-09-19 19:29:42 -0700298 vector<scoped_refptr<MockWiMaxService>> services(2);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200299 for (size_t i = 0; i < services.size(); i++) {
Ben Chan53cc8942014-09-30 10:49:57 -0700300 services[i] =
301 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200302 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200303 EXPECT_CALL(*services[i], Stop());
304 }
305 EXPECT_CALL(manager_, DeregisterService(_)).Times(services.size());
306 provider_.DestroyAllServices();
307 EXPECT_TRUE(provider_.services_.empty());
308}
309
310TEST_F(WiMaxProviderTest, StopDeadServices) {
Ben Chane2ee5e02014-09-19 19:29:42 -0700311 vector<scoped_refptr<MockWiMaxService>> services(4);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200312 for (size_t i = 0; i < services.size(); i++) {
Ben Chan53cc8942014-09-30 10:49:57 -0700313 services[i] =
314 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200315 if (i == 0) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200316 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(false));
317 EXPECT_CALL(*services[i], GetNetworkObjectPath()).Times(0);
318 EXPECT_CALL(*services[i], Stop()).Times(0);
Darin Petkovc1e52732012-05-25 15:23:45 +0200319 } else {
320 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(true));
321 EXPECT_CALL(*services[i], GetNetworkObjectPath())
322 .WillOnce(Return(GetTestNetworkPath(100 + i)));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200323 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200324 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200325 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200326 services[3]->set_is_default(true);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200327 EXPECT_CALL(*services[1], Stop()).Times(0);
328 EXPECT_CALL(*services[2], Stop());
329 EXPECT_CALL(*services[3], Stop());
Darin Petkovc1e52732012-05-25 15:23:45 +0200330 EXPECT_CALL(manager_, DeregisterService(_));
Darin Petkovfc00fd42012-05-30 11:30:06 +0200331 provider_.networks_[GetTestNetworkPath(777)].id = "01234567";
332 provider_.networks_[GetTestNetworkPath(101)].id = "12345678";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200333 provider_.StopDeadServices();
Darin Petkovc1e52732012-05-25 15:23:45 +0200334 EXPECT_EQ(3, provider_.services_.size());
335 EXPECT_FALSE(ContainsKey(provider_.services_,
336 services[3]->GetStorageIdentifier()));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200337}
338
339TEST_F(WiMaxProviderTest, OnNetworksChanged) {
340 static const char kName[] = "Default Network";
Ben Chan7fab8972014-08-10 17:14:46 -0700341 const uint32_t kIdentifier = 0xabcdef;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200342 static const char kNetworkId[] = "00abcdef";
343
344 // Started service to be stopped.
345 scoped_refptr<MockWiMaxService> service0(
Ben Chan53cc8942014-09-30 10:49:57 -0700346 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200347 EXPECT_CALL(*service0, IsStarted()).WillOnce(Return(true));
348 EXPECT_CALL(*service0, GetNetworkObjectPath())
349 .WillOnce(Return(GetTestNetworkPath(100)));
350 EXPECT_CALL(*service0, Start(_)).Times(0);
351 EXPECT_CALL(*service0, Stop()).Times(1);
352 service0->set_network_id("1234");
Darin Petkovc1e52732012-05-25 15:23:45 +0200353 service0->InitStorageIdentifier();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200354
355 // Stopped service to be started.
356 scoped_refptr<MockWiMaxService> service1(
Ben Chan53cc8942014-09-30 10:49:57 -0700357 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200358 EXPECT_CALL(*service1, IsStarted()).Times(2).WillRepeatedly(Return(false));
359 EXPECT_CALL(*service1, Start(_)).WillOnce(Return(true));
360 EXPECT_CALL(*service1, Stop()).Times(0);
361 service1->set_network_id(kNetworkId);
362 service1->set_friendly_name(kName);
363 service1->InitStorageIdentifier();
Peter Qiu608ec292015-07-30 15:46:16 -0700364 EXPECT_CALL(control_, CreateWiMaxNetworkProxy(GetTestNetworkPath(101)))
Ben Chan0bc1aca2014-01-27 16:35:37 -0800365 .Times(2)
366 .WillOnce(ReturnAndReleasePointee(&network_proxy_))
367 .WillOnce(ReturnNull());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200368 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
369 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
370
Darin Petkovc1e52732012-05-25 15:23:45 +0200371 provider_.services_[service0->GetStorageIdentifier()] = service0;
372 provider_.services_[service1->GetStorageIdentifier()] = service1;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200373
374 for (int i = 0; i < 3; i++) {
375 scoped_refptr<MockWiMax> device(
Ben Chan53cc8942014-09-30 10:49:57 -0700376 new MockWiMax(&control_, nullptr, &metrics_, &manager_,
Darin Petkovc63dcf02012-05-24 11:51:43 +0200377 GetTestLinkName(i), "", i, GetTestPath(i)));
378 provider_.devices_[GetTestLinkName(i)] = device;
379 if (i > 0) {
380 device->networks_.insert(GetTestNetworkPath(101));
381 }
382 }
383 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
384 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
385
Darin Petkovfc00fd42012-05-30 11:30:06 +0200386 provider_.networks_["/org/chromium/foo"].id = "foo";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200387 provider_.OnNetworksChanged();
388 EXPECT_EQ(1, provider_.networks_.size());
389 EXPECT_TRUE(ContainsKey(provider_.networks_, GetTestNetworkPath(101)));
390}
391
392TEST_F(WiMaxProviderTest, GetUniqueService) {
393 EXPECT_TRUE(provider_.services_.empty());
394
395 static const char kName0[] = "Test WiMAX Network";
396 static const char kName1[] = "Unknown Network";
397 static const char kNetworkId[] = "12340000";
398
399 // Service already exists.
400 scoped_refptr<MockWiMaxService> service0(
Ben Chan53cc8942014-09-30 10:49:57 -0700401 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200402 service0->set_network_id(kNetworkId);
403 service0->set_friendly_name(kName0);
404 service0->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200405 provider_.services_[service0->GetStorageIdentifier()] = service0;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200406 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
407 WiMaxServiceRefPtr service = provider_.GetUniqueService(kNetworkId, kName0);
408 ASSERT_TRUE(service);
409 EXPECT_EQ(service0.get(), service.get());
410 EXPECT_EQ(1, provider_.services_.size());
411
412 // Create a new service.
413 EXPECT_CALL(manager_, RegisterService(_));
414 service = provider_.GetUniqueService(kNetworkId, kName1);
415 ASSERT_TRUE(service);
416 EXPECT_NE(service0.get(), service.get());
417 EXPECT_EQ(2, provider_.services_.size());
418 EXPECT_EQ(WiMaxService::CreateStorageIdentifier(kNetworkId, kName1),
419 service->GetStorageIdentifier());
Darin Petkovc1e52732012-05-25 15:23:45 +0200420 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200421
422 // Service already exists -- it was just created.
423 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
424 WiMaxServiceRefPtr service1 = provider_.GetUniqueService(kNetworkId, kName1);
425 ASSERT_TRUE(service1);
426 EXPECT_EQ(service.get(), service1.get());
427 EXPECT_EQ(2, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200428 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200429}
430
Darin Petkovc63dcf02012-05-24 11:51:43 +0200431TEST_F(WiMaxProviderTest, CreateServicesFromProfile) {
mukesh agrawal4f930f92015-08-26 16:00:49 -0700432 FakeStore store;
433 store.SetString("no_type", "Name", "No Type Entry");
434 store.SetString("no_wimax", "Type", "vpn");
435 store.SetString("wimax_network_01234567", "Name", "network");
436 store.SetString("wimax_network_01234567", "Type", "wimax");
437 store.SetString("wimax_network_01234567", "NetworkId", "01234567");
438 store.SetString("no_network_id", "Type", "wimax");
439 store.SetString("no_name", "Type", "wimax");
440 store.SetString("no_name", "NetworkId", "76543210");
441
Thieu Le5133b712013-02-19 14:47:21 -0800442 scoped_refptr<MockProfile> profile(
443 new MockProfile(&control_, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200444 EXPECT_CALL(*profile, GetConstStorage())
445 .Times(2)
446 .WillRepeatedly(Return(&store));
447 EXPECT_CALL(manager_, RegisterService(_));
448 EXPECT_CALL(*profile, ConfigureService(_)).WillOnce(Return(true));
449 provider_.CreateServicesFromProfile(profile);
450 ASSERT_EQ(1, provider_.services_.size());
mukesh agrawal4f930f92015-08-26 16:00:49 -0700451
Darin Petkovc1e52732012-05-25 15:23:45 +0200452 WiMaxServiceRefPtr service = provider_.services_.begin()->second;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200453 EXPECT_EQ("wimax_network_01234567", service->GetStorageIdentifier());
454 provider_.CreateServicesFromProfile(profile);
455 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200456 EXPECT_EQ(service.get(), provider_.services_.begin()->second);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200457}
458
Peter Qiu18213652015-04-21 16:01:51 -0700459TEST_F(WiMaxProviderTest, CreateTemporaryServiceFromProfile) {
mukesh agrawal4f930f92015-08-26 16:00:49 -0700460 FakeStore store;
461 store.SetString("no_type", "Name", "No Type Entry");
462 store.SetString("no_wimax", "Type", "vpn");
463 store.SetString("wimax_network_01234567", "Name", "network");
464 store.SetString("wimax_network_01234567", "Type", "wimax");
465 store.SetString("wimax_network_01234567", "NetworkId", "01234567");
466 store.SetString("no_network_id", "Type", "wimax");
467 store.SetString("no_name", "Type", "wimax");
468 store.SetString("no_name", "NetworkId", "76543210");
Peter Qiu18213652015-04-21 16:01:51 -0700469 scoped_refptr<MockProfile> profile(
470 new MockProfile(&control_, &metrics_, &manager_));
471 EXPECT_CALL(*profile, GetConstStorage())
472 .WillRepeatedly(Return(&store));
473 Error error;
474
475 // Network type not specified.
476 EXPECT_EQ(nullptr,
477 provider_.CreateTemporaryServiceFromProfile(profile,
478 "no_type",
479 &error));
480 EXPECT_FALSE(error.IsSuccess());
481 EXPECT_THAT(error.message(),
482 StartsWith("Unspecified or invalid network type"));
483
mukesh agrawal4f930f92015-08-26 16:00:49 -0700484 // Not a WiMAX network.
485 error.Reset();
486 EXPECT_EQ(nullptr,
487 provider_.CreateTemporaryServiceFromProfile(profile,
488 "no_wimax",
489 &error));
490 EXPECT_FALSE(error.IsSuccess());
491 EXPECT_THAT(error.message(),
492 StartsWith("Unspecified or invalid network type"));
493
494 // WiMAX network with required properties.
495 error.Reset();
496 EXPECT_TRUE(
497 provider_.CreateTemporaryServiceFromProfile(profile,
498 "wimax_network_01234567",
499 &error));
500 EXPECT_TRUE(error.IsSuccess());
501
Peter Qiu18213652015-04-21 16:01:51 -0700502 // Network ID not specified.
503 error.Reset();
504 EXPECT_EQ(nullptr,
505 provider_.CreateTemporaryServiceFromProfile(profile,
506 "no_network_id",
507 &error));
508 EXPECT_FALSE(error.IsSuccess());
509 EXPECT_THAT(error.message(),
510 StartsWith("Network ID not specified"));
511
512 // Network name not specified.
513 error.Reset();
514 EXPECT_EQ(nullptr,
515 provider_.CreateTemporaryServiceFromProfile(profile,
516 "no_name",
517 &error));
518 EXPECT_FALSE(error.IsSuccess());
519 EXPECT_THAT(error.message(),
520 StartsWith("Network name not specified"));
521}
522
Darin Petkovd1cd7972012-05-22 15:26:15 +0200523TEST_F(WiMaxProviderTest, GetService) {
524 KeyValueStore args;
525 Error e;
526
Ben Chan4276cca2013-09-20 10:07:04 -0700527 args.SetString(kTypeProperty, kTypeWimax);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200528
529 // No network id property.
Paul Stewart0e51ad92013-07-26 14:42:55 -0700530 ServiceRefPtr service = provider_.GetService(args, &e);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200531 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200532 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200533
534 // No name property.
535 static const char kNetworkId[] = "1234abcd";
536 args.SetString(WiMaxService::kNetworkIdProperty, kNetworkId);
537 e.Reset();
538 service = provider_.GetService(args, &e);
539 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200540 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200541
542 // Service created and configured.
543 static const char kName[] = "Test WiMAX Network";
Ben Chan4276cca2013-09-20 10:07:04 -0700544 args.SetString(kNameProperty, kName);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200545 static const char kIdentity[] = "joe";
Ben Chan4276cca2013-09-20 10:07:04 -0700546 args.SetString(kEapIdentityProperty, kIdentity);
Paul Stewartbc14fb72013-07-30 08:21:58 -0700547
Darin Petkovd1cd7972012-05-22 15:26:15 +0200548 e.Reset();
Paul Stewartbc14fb72013-07-30 08:21:58 -0700549 service = provider_.FindSimilarService(args, &e);
550 EXPECT_EQ(ServiceRefPtr(), service);
551 EXPECT_EQ(Error::kNotFound, e.type());
552
553 e.Reset();
554 EXPECT_CALL(manager_, RegisterService(_));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200555 service = provider_.GetService(args, &e);
556 EXPECT_TRUE(e.IsSuccess());
557 ASSERT_TRUE(service);
Paul Stewartbc14fb72013-07-30 08:21:58 -0700558 testing::Mock::VerifyAndClearExpectations(&manager_);
Paul Stewart2c575d22012-12-07 12:28:57 -0800559
560 // GetService should create a service with only identifying parameters set.
Darin Petkov457728b2013-01-09 09:49:08 +0100561 EXPECT_EQ(kName, GetServiceFriendlyName(service));
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700562 EXPECT_EQ("", service->eap()->identity());
Paul Stewart2c575d22012-12-07 12:28:57 -0800563
Paul Stewartbc14fb72013-07-30 08:21:58 -0700564 e.Reset();
565 ServiceRefPtr similar_service = provider_.FindSimilarService(args, &e);
566 EXPECT_EQ(service, similar_service);
567 EXPECT_TRUE(e.IsSuccess());
568
Paul Stewart2c575d22012-12-07 12:28:57 -0800569 // After configuring the service, other parameters should be set.
570 service->Configure(args, &e);
571 EXPECT_TRUE(e.IsSuccess());
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700572 EXPECT_EQ(kIdentity, service->eap()->identity());
Paul Stewartbc14fb72013-07-30 08:21:58 -0700573
574 e.Reset();
575 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
576 ServiceRefPtr temporary_service = provider_.CreateTemporaryService(args, &e);
577 EXPECT_NE(ServiceRefPtr(), temporary_service);
578 EXPECT_NE(service, temporary_service);
579 EXPECT_TRUE(e.IsSuccess());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200580}
581
582TEST_F(WiMaxProviderTest, SelectCarrier) {
583 scoped_refptr<MockWiMaxService> service(
Ben Chan53cc8942014-09-30 10:49:57 -0700584 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200585 EXPECT_FALSE(provider_.SelectCarrier(service));
586 scoped_refptr<MockWiMax> device(
Ben Chan53cc8942014-09-30 10:49:57 -0700587 new MockWiMax(&control_, nullptr, &metrics_, &manager_,
Darin Petkovc63dcf02012-05-24 11:51:43 +0200588 GetTestLinkName(1), "", 1, GetTestPath(1)));
589 provider_.devices_[GetTestLinkName(1)] = device;
590 WiMaxRefPtr carrier = provider_.SelectCarrier(service);
591 EXPECT_EQ(device.get(), carrier.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200592}
593
Darin Petkovc1e52732012-05-25 15:23:45 +0200594TEST_F(WiMaxProviderTest, OnServiceUnloaded) {
595 scoped_refptr<MockWiMaxService> service(
Ben Chan53cc8942014-09-30 10:49:57 -0700596 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc1e52732012-05-25 15:23:45 +0200597 EXPECT_FALSE(service->is_default());
598 scoped_refptr<MockWiMaxService> service_default(
Ben Chan53cc8942014-09-30 10:49:57 -0700599 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
Darin Petkovc1e52732012-05-25 15:23:45 +0200600 service_default->set_is_default(true);
601 provider_.services_[service->GetStorageIdentifier()] = service;
602 provider_.services_[service_default->GetStorageIdentifier()] =
603 service_default;
604 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
605 EXPECT_FALSE(provider_.OnServiceUnloaded(service_default));
606 EXPECT_EQ(2, provider_.services_.size());
607 EXPECT_TRUE(provider_.OnServiceUnloaded(service));
608 EXPECT_EQ(1, provider_.services_.size());
609 EXPECT_EQ(service_default.get(), provider_.services_.begin()->second.get());
610}
611
Darin Petkovb72b62e2012-05-15 16:55:36 +0200612} // namespace shill