blob: 2b4b643603aac35813e30f775cf598ac39240fb0 [file] [log] [blame]
Darin Petkovb72b62e2012-05-15 16:55:36 +02001// Copyright (c) 2012 The Chromium OS 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 "shill/wimax_provider.h"
6
Ben Chan084faca2013-07-02 14:25:12 -07007#include <string>
8#include <vector>
9
Darin Petkovc63dcf02012-05-24 11:51:43 +020010#include <base/file_util.h>
Paul Stewart5ad16062013-02-21 18:10:48 -080011#include <base/files/scoped_temp_dir.h>
Ben Chana0ddf462014-02-06 11:32:42 -080012#include <base/strings/stringprintf.h>
Darin Petkov9893d9c2012-05-17 15:27:31 -070013#include <chromeos/dbus/service_constants.h>
Darin Petkovb72b62e2012-05-15 16:55:36 +020014
Paul Stewartc43cbbe2013-04-11 06:29:30 -070015#include "shill/eap_credentials.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020016#include "shill/glib.h"
17#include "shill/key_file_store.h"
Ben Chan084faca2013-07-02 14:25:12 -070018#include "shill/mock_dbus_service_proxy.h"
Darin Petkove4b27022012-05-16 13:28:50 +020019#include "shill/mock_device_info.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020020#include "shill/mock_manager.h"
21#include "shill/mock_metrics.h"
Ben Chan0bc1aca2014-01-27 16:35:37 -080022#include "shill/mock_profile.h"
23#include "shill/mock_proxy_factory.h"
Darin Petkove4b27022012-05-16 13:28:50 +020024#include "shill/mock_wimax.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020025#include "shill/mock_wimax_manager_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020026#include "shill/mock_wimax_network_proxy.h"
27#include "shill/mock_wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020028#include "shill/nice_mock_control.h"
Ben Chan0bc1aca2014-01-27 16:35:37 -080029#include "shill/testing.h"
Darin Petkovd1cd7972012-05-22 15:26:15 +020030#include "shill/wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020031
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080032using base::FilePath;
Darin Petkovb72b62e2012-05-15 16:55:36 +020033using std::string;
34using std::vector;
Darin Petkovb72b62e2012-05-15 16:55:36 +020035using testing::Return;
Ben Chan0bc1aca2014-01-27 16:35:37 -080036using testing::ReturnNull;
Ben Chan084faca2013-07-02 14:25:12 -070037using testing::SaveArg;
38using testing::_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020039
40namespace shill {
41
Darin Petkove4b27022012-05-16 13:28:50 +020042namespace {
Darin Petkove4b27022012-05-16 13:28:50 +020043
44string GetTestLinkName(int index) {
Ben Chana0ddf462014-02-06 11:32:42 -080045 return base::StringPrintf("wm%d", index);
Darin Petkove4b27022012-05-16 13:28:50 +020046}
47
48string GetTestPath(int index) {
Darin Petkov9893d9c2012-05-17 15:27:31 -070049 return wimax_manager::kDeviceObjectPathPrefix + GetTestLinkName(index);
Darin Petkove4b27022012-05-16 13:28:50 +020050}
Darin Petkov9893d9c2012-05-17 15:27:31 -070051
Darin Petkovc63dcf02012-05-24 11:51:43 +020052string GetTestNetworkPath(uint32 identifier) {
53 return base::StringPrintf("%s%08x",
54 wimax_manager::kNetworkObjectPathPrefix,
55 identifier);
56}
57
Darin Petkove4b27022012-05-16 13:28:50 +020058} // namespace
59
Darin Petkovb72b62e2012-05-15 16:55:36 +020060class WiMaxProviderTest : public testing::Test {
61 public:
62 WiMaxProviderTest()
Ben Chan084faca2013-07-02 14:25:12 -070063 : dbus_service_proxy_(new MockDBusServiceProxy()),
64 wimax_manager_proxy_(new MockWiMaxManagerProxy()),
Darin Petkovc63dcf02012-05-24 11:51:43 +020065 network_proxy_(new MockWiMaxNetworkProxy()),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080066 metrics_(NULL),
Darin Petkovb72b62e2012-05-15 16:55:36 +020067 manager_(&control_, NULL, &metrics_, NULL),
Darin Petkove4b27022012-05-16 13:28:50 +020068 device_info_(&control_, NULL, &metrics_, &manager_),
Ben Chan084faca2013-07-02 14:25:12 -070069 dbus_manager_(new DBusManager()),
Darin Petkovb501ad22012-07-03 12:50:52 +020070 provider_(&control_, NULL, &metrics_, &manager_) {
71 manager_.dbus_manager_.reset(dbus_manager_); // Transfers ownership.
72 }
Darin Petkovb72b62e2012-05-15 16:55:36 +020073
74 virtual ~WiMaxProviderTest() {}
75
76 protected:
Darin Petkovb72b62e2012-05-15 16:55:36 +020077 virtual void SetUp() {
Ben Chan084faca2013-07-02 14:25:12 -070078 dbus_manager_->proxy_factory_ = &proxy_factory_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020079 provider_.proxy_factory_ = &proxy_factory_;
80 }
81
82 virtual void TearDown() {
Ben Chan084faca2013-07-02 14:25:12 -070083 dbus_manager_->proxy_factory_ = NULL;
Darin Petkovb72b62e2012-05-15 16:55:36 +020084 provider_.proxy_factory_ = NULL;
85 }
86
Darin Petkov457728b2013-01-09 09:49:08 +010087 string GetServiceFriendlyName(const ServiceRefPtr &service) {
88 return service->friendly_name();
89 }
90
Ben Chan084faca2013-07-02 14:25:12 -070091 scoped_ptr<MockDBusServiceProxy> dbus_service_proxy_;
Darin Petkovb501ad22012-07-03 12:50:52 +020092 scoped_ptr<MockWiMaxManagerProxy> wimax_manager_proxy_;
Darin Petkovc63dcf02012-05-24 11:51:43 +020093 scoped_ptr<MockWiMaxNetworkProxy> network_proxy_;
Ben Chan0bc1aca2014-01-27 16:35:37 -080094 MockProxyFactory proxy_factory_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020095 NiceMockControl control_;
96 MockMetrics metrics_;
97 MockManager manager_;
Darin Petkove4b27022012-05-16 13:28:50 +020098 MockDeviceInfo device_info_;
Ben Chan084faca2013-07-02 14:25:12 -070099 DBusManager *dbus_manager_;
Darin Petkovb72b62e2012-05-15 16:55:36 +0200100 WiMaxProvider provider_;
101};
102
103TEST_F(WiMaxProviderTest, StartStop) {
Ben Chan084faca2013-07-02 14:25:12 -0700104 EXPECT_FALSE(provider_.wimax_manager_name_watcher_.get());
Darin Petkovb501ad22012-07-03 12:50:52 +0200105 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Ben Chan084faca2013-07-02 14:25:12 -0700106
107 StringCallback get_name_owner_callback;
Ben Chan0bc1aca2014-01-27 16:35:37 -0800108 EXPECT_CALL(proxy_factory_, CreateDBusServiceProxy())
109 .WillOnce(ReturnAndReleasePointee(&dbus_service_proxy_));
Ben Chan084faca2013-07-02 14:25:12 -0700110 EXPECT_CALL(*dbus_service_proxy_.get(),
111 GetNameOwner(wimax_manager::kWiMaxManagerServiceName, _, _, _))
112 .WillOnce(SaveArg<2>(&get_name_owner_callback));
113 dbus_manager_->Start();
Darin Petkovb72b62e2012-05-15 16:55:36 +0200114 provider_.Start();
Ben Chan084faca2013-07-02 14:25:12 -0700115 EXPECT_TRUE(provider_.wimax_manager_name_watcher_.get());
Darin Petkovb501ad22012-07-03 12:50:52 +0200116 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200117 provider_.Start();
Ben Chan0bc1aca2014-01-27 16:35:37 -0800118 EXPECT_CALL(proxy_factory_, CreateWiMaxManagerProxy())
119 .WillOnce(ReturnAndReleasePointee(&wimax_manager_proxy_));
Darin Petkovb501ad22012-07-03 12:50:52 +0200120 EXPECT_CALL(*wimax_manager_proxy_, set_devices_changed_callback(_)).Times(1);
121 EXPECT_CALL(*wimax_manager_proxy_, Devices(_))
122 .WillOnce(Return(RpcIdentifiers()));
Ben Chan084faca2013-07-02 14:25:12 -0700123 get_name_owner_callback.Run(":0.11", Error());
Darin Petkovb501ad22012-07-03 12:50:52 +0200124 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200125 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200126 provider_.Stop();
Ben Chan084faca2013-07-02 14:25:12 -0700127 EXPECT_FALSE(provider_.wimax_manager_name_watcher_.get());
Darin Petkovb501ad22012-07-03 12:50:52 +0200128 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200129 EXPECT_TRUE(provider_.pending_devices_.empty());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200130 provider_.Stop();
Ben Chan084faca2013-07-02 14:25:12 -0700131 dbus_manager_->Stop();
Darin Petkovb72b62e2012-05-15 16:55:36 +0200132}
133
Darin Petkovb501ad22012-07-03 12:50:52 +0200134TEST_F(WiMaxProviderTest, ConnectDisconnectWiMaxManager) {
135 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Ben Chan0bc1aca2014-01-27 16:35:37 -0800136 EXPECT_CALL(proxy_factory_, CreateWiMaxManagerProxy())
137 .WillOnce(ReturnAndReleasePointee(&wimax_manager_proxy_));
Darin Petkovb501ad22012-07-03 12:50:52 +0200138 EXPECT_CALL(*wimax_manager_proxy_, set_devices_changed_callback(_)).Times(1);
139 EXPECT_CALL(*wimax_manager_proxy_, Devices(_))
140 .WillOnce(Return(RpcIdentifiers()));
141 provider_.ConnectToWiMaxManager();
142 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
143 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
144 provider_.DisconnectFromWiMaxManager();
145 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
146 EXPECT_TRUE(provider_.pending_devices_.empty());
147}
148
Darin Petkov9893d9c2012-05-17 15:27:31 -0700149TEST_F(WiMaxProviderTest, OnDevicesChanged) {
Darin Petkove4b27022012-05-16 13:28:50 +0200150 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
151
152 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
Darin Petkov9893d9c2012-05-17 15:27:31 -0700153 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200154 live_devices.push_back(GetTestPath(2));
155 live_devices.push_back(GetTestPath(3));
156 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(2))).WillOnce(Return(-1));
157 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(3))).WillOnce(Return(-1));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700158 provider_.OnDevicesChanged(live_devices);
Darin Petkove4b27022012-05-16 13:28:50 +0200159 ASSERT_EQ(2, provider_.pending_devices_.size());
160 EXPECT_EQ(GetTestPath(2), provider_.pending_devices_[GetTestLinkName(2)]);
161 EXPECT_EQ(GetTestPath(3), provider_.pending_devices_[GetTestLinkName(3)]);
162}
163
164TEST_F(WiMaxProviderTest, OnDeviceInfoAvailable) {
165 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
166
167 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
168 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
169 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
170 EXPECT_CALL(device_info_, RegisterDevice(_));
171 provider_.OnDeviceInfoAvailable(GetTestLinkName(1));
172 EXPECT_TRUE(provider_.pending_devices_.empty());
173 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200174 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
175 EXPECT_EQ(GetTestLinkName(1),
176 provider_.devices_[GetTestLinkName(1)]->link_name());
Darin Petkove4b27022012-05-16 13:28:50 +0200177}
178
Darin Petkove4b27022012-05-16 13:28:50 +0200179TEST_F(WiMaxProviderTest, CreateDevice) {
180 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
181
182 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(-1));
183 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
184 EXPECT_TRUE(provider_.devices_.empty());
185 ASSERT_EQ(1, provider_.pending_devices_.size());
186 EXPECT_EQ(GetTestPath(1), provider_.pending_devices_[GetTestLinkName(1)]);
187
188 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
189 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
190 EXPECT_CALL(device_info_, RegisterDevice(_));
191 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
192 EXPECT_TRUE(provider_.pending_devices_.empty());
193 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200194 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
195 EXPECT_EQ(GetTestLinkName(1),
196 provider_.devices_[GetTestLinkName(1)]->link_name());
197
198 WiMax *device = provider_.devices_[GetTestLinkName(1)].get();
199 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
200 EXPECT_EQ(device, provider_.devices_[GetTestLinkName(1)].get());
Darin Petkove4b27022012-05-16 13:28:50 +0200201}
202
203TEST_F(WiMaxProviderTest, DestroyDeadDevices) {
204 for (int i = 0; i < 4; i++) {
Darin Petkovb96a4512012-06-04 11:02:49 +0200205 scoped_refptr<MockWiMax> device(
Darin Petkovc63dcf02012-05-24 11:51:43 +0200206 new MockWiMax(&control_, NULL, &metrics_, &manager_,
Darin Petkovb96a4512012-06-04 11:02:49 +0200207 GetTestLinkName(i), "", i, GetTestPath(i)));
208 EXPECT_CALL(*device, OnDeviceVanished()).Times((i == 0 || i == 3) ? 0 : 1);
209 provider_.devices_[GetTestLinkName(i)] = device;
Darin Petkove4b27022012-05-16 13:28:50 +0200210 }
211 for (int i = 4; i < 8; i++) {
212 provider_.pending_devices_[GetTestLinkName(i)] = GetTestPath(i);
213 }
Darin Petkov9893d9c2012-05-17 15:27:31 -0700214 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200215 live_devices.push_back(GetTestPath(0));
216 live_devices.push_back(GetTestPath(3));
217 live_devices.push_back(GetTestPath(4));
218 live_devices.push_back(GetTestPath(7));
219 live_devices.push_back(GetTestPath(123));
220 EXPECT_CALL(manager_, device_info())
221 .Times(2)
222 .WillRepeatedly(Return(&device_info_));
223 EXPECT_CALL(device_info_, DeregisterDevice(_)).Times(2);
224 provider_.DestroyDeadDevices(live_devices);
225 ASSERT_EQ(2, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200226 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(0)));
227 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(3)));
Darin Petkove4b27022012-05-16 13:28:50 +0200228 EXPECT_EQ(2, provider_.pending_devices_.size());
229 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(4)));
230 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(7)));
231}
232
233TEST_F(WiMaxProviderTest, GetLinkName) {
234 EXPECT_EQ("", provider_.GetLinkName("/random/path"));
235 EXPECT_EQ(GetTestLinkName(1), provider_.GetLinkName(GetTestPath(1)));
236}
237
Darin Petkovfc00fd42012-05-30 11:30:06 +0200238TEST_F(WiMaxProviderTest, RetrieveNetworkInfo) {
239 static const char kName[] = "Default Network";
240 const uint32 kIdentifier = 0xabcdef;
241 static const char kNetworkId[] = "00abcdef";
Ben Chan0bc1aca2014-01-27 16:35:37 -0800242 string network_path = GetTestNetworkPath(kIdentifier);
243 EXPECT_CALL(proxy_factory_, CreateWiMaxNetworkProxy(network_path))
244 .WillOnce(ReturnAndReleasePointee(&network_proxy_));
Darin Petkovfc00fd42012-05-30 11:30:06 +0200245 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
246 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
Ben Chan0bc1aca2014-01-27 16:35:37 -0800247 provider_.RetrieveNetworkInfo(network_path);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200248 EXPECT_EQ(1, provider_.networks_.size());
Ben Chan0bc1aca2014-01-27 16:35:37 -0800249 EXPECT_TRUE(ContainsKey(provider_.networks_, network_path));
250 EXPECT_EQ(kName, provider_.networks_[network_path].name);
251 EXPECT_EQ(kNetworkId, provider_.networks_[network_path].id);
252 provider_.RetrieveNetworkInfo(network_path);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200253 EXPECT_EQ(1, provider_.networks_.size());
254}
255
Darin Petkovc63dcf02012-05-24 11:51:43 +0200256TEST_F(WiMaxProviderTest, FindService) {
257 EXPECT_FALSE(provider_.FindService("some_storage_id"));
258 scoped_refptr<MockWiMaxService> service(
259 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
260 static const char kName[] = "WiMAX Network";
261 static const char kNetworkId[] = "76543210";
262 service->set_friendly_name(kName);
263 service->set_network_id(kNetworkId);
264 service->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200265 provider_.services_[service->GetStorageIdentifier()] = service;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200266 EXPECT_EQ(service.get(),
267 provider_.FindService(
268 WiMaxService::CreateStorageIdentifier(kNetworkId,
269 kName)).get());
270 EXPECT_FALSE(provider_.FindService("some_storage_id"));
271}
272
Darin Petkovfc00fd42012-05-30 11:30:06 +0200273TEST_F(WiMaxProviderTest, StartLiveServices) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200274 const uint32 kIdentifier = 0x1234567;
275 static const char kNetworkId[] = "01234567";
276 static const char kName[] = "Some WiMAX Provider";
277 vector<scoped_refptr<MockWiMaxService> > services(4);
278 for (size_t i = 0; i < services.size(); i++) {
279 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200280 if (i == 0) {
281 services[0]->set_network_id("deadbeef");
282 } else {
283 services[i]->set_network_id(kNetworkId);
284 }
285 // Make services[3] the default service.
286 if (i == 3) {
287 services[i]->set_friendly_name(kName);
288 } else {
289 services[i]->set_friendly_name(
290 base::StringPrintf("Configured %d", static_cast<int>(i)));
291 }
292 services[i]->InitStorageIdentifier();
293 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200294 }
Darin Petkovfc00fd42012-05-30 11:30:06 +0200295 WiMaxProvider::NetworkInfo info;
296 info.id = kNetworkId;
297 info.name = kName;
298 provider_.networks_[GetTestNetworkPath(kIdentifier)] = info;
299 network_proxy_.reset();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200300 EXPECT_CALL(*services[0], IsStarted()).Times(0);
301 EXPECT_CALL(*services[1], IsStarted()).WillOnce(Return(true));
302 EXPECT_CALL(*services[1], Start(_)).Times(0);
303 EXPECT_CALL(*services[2], IsStarted()).WillOnce(Return(false));
304 EXPECT_CALL(*services[2], Start(_)).WillOnce(Return(true));
305 EXPECT_CALL(*services[3], IsStarted()).WillOnce(Return(false));
306 EXPECT_CALL(*services[3], Start(_)).WillOnce(Return(false));
307 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200308 provider_.StartLiveServices();
309 EXPECT_FALSE(services[0]->is_default());
310 EXPECT_FALSE(services[1]->is_default());
311 EXPECT_FALSE(services[2]->is_default());
312 EXPECT_TRUE(services[3]->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200313}
314
315TEST_F(WiMaxProviderTest, DestroyAllServices) {
316 vector<scoped_refptr<MockWiMaxService> > services(2);
317 for (size_t i = 0; i < services.size(); i++) {
318 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200319 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200320 EXPECT_CALL(*services[i], Stop());
321 }
322 EXPECT_CALL(manager_, DeregisterService(_)).Times(services.size());
323 provider_.DestroyAllServices();
324 EXPECT_TRUE(provider_.services_.empty());
325}
326
327TEST_F(WiMaxProviderTest, StopDeadServices) {
328 vector<scoped_refptr<MockWiMaxService> > services(4);
329 for (size_t i = 0; i < services.size(); i++) {
330 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200331 if (i == 0) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200332 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(false));
333 EXPECT_CALL(*services[i], GetNetworkObjectPath()).Times(0);
334 EXPECT_CALL(*services[i], Stop()).Times(0);
Darin Petkovc1e52732012-05-25 15:23:45 +0200335 } else {
336 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(true));
337 EXPECT_CALL(*services[i], GetNetworkObjectPath())
338 .WillOnce(Return(GetTestNetworkPath(100 + i)));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200339 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200340 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200341 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200342 services[3]->set_is_default(true);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200343 EXPECT_CALL(*services[1], Stop()).Times(0);
344 EXPECT_CALL(*services[2], Stop());
345 EXPECT_CALL(*services[3], Stop());
Darin Petkovc1e52732012-05-25 15:23:45 +0200346 EXPECT_CALL(manager_, DeregisterService(_));
Darin Petkovfc00fd42012-05-30 11:30:06 +0200347 provider_.networks_[GetTestNetworkPath(777)].id = "01234567";
348 provider_.networks_[GetTestNetworkPath(101)].id = "12345678";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200349 provider_.StopDeadServices();
Darin Petkovc1e52732012-05-25 15:23:45 +0200350 EXPECT_EQ(3, provider_.services_.size());
351 EXPECT_FALSE(ContainsKey(provider_.services_,
352 services[3]->GetStorageIdentifier()));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200353}
354
355TEST_F(WiMaxProviderTest, OnNetworksChanged) {
356 static const char kName[] = "Default Network";
357 const uint32 kIdentifier = 0xabcdef;
358 static const char kNetworkId[] = "00abcdef";
359
360 // Started service to be stopped.
361 scoped_refptr<MockWiMaxService> service0(
362 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
363 EXPECT_CALL(*service0, IsStarted()).WillOnce(Return(true));
364 EXPECT_CALL(*service0, GetNetworkObjectPath())
365 .WillOnce(Return(GetTestNetworkPath(100)));
366 EXPECT_CALL(*service0, Start(_)).Times(0);
367 EXPECT_CALL(*service0, Stop()).Times(1);
368 service0->set_network_id("1234");
Darin Petkovc1e52732012-05-25 15:23:45 +0200369 service0->InitStorageIdentifier();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200370
371 // Stopped service to be started.
372 scoped_refptr<MockWiMaxService> service1(
373 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
374 EXPECT_CALL(*service1, IsStarted()).Times(2).WillRepeatedly(Return(false));
375 EXPECT_CALL(*service1, Start(_)).WillOnce(Return(true));
376 EXPECT_CALL(*service1, Stop()).Times(0);
377 service1->set_network_id(kNetworkId);
378 service1->set_friendly_name(kName);
379 service1->InitStorageIdentifier();
Ben Chan0bc1aca2014-01-27 16:35:37 -0800380 EXPECT_CALL(proxy_factory_, CreateWiMaxNetworkProxy(GetTestNetworkPath(101)))
381 .Times(2)
382 .WillOnce(ReturnAndReleasePointee(&network_proxy_))
383 .WillOnce(ReturnNull());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200384 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
385 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
386
Darin Petkovc1e52732012-05-25 15:23:45 +0200387 provider_.services_[service0->GetStorageIdentifier()] = service0;
388 provider_.services_[service1->GetStorageIdentifier()] = service1;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200389
390 for (int i = 0; i < 3; i++) {
391 scoped_refptr<MockWiMax> device(
392 new MockWiMax(&control_, NULL, &metrics_, &manager_,
393 GetTestLinkName(i), "", i, GetTestPath(i)));
394 provider_.devices_[GetTestLinkName(i)] = device;
395 if (i > 0) {
396 device->networks_.insert(GetTestNetworkPath(101));
397 }
398 }
399 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
400 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
401
Darin Petkovfc00fd42012-05-30 11:30:06 +0200402 provider_.networks_["/org/chromium/foo"].id = "foo";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200403 provider_.OnNetworksChanged();
404 EXPECT_EQ(1, provider_.networks_.size());
405 EXPECT_TRUE(ContainsKey(provider_.networks_, GetTestNetworkPath(101)));
406}
407
408TEST_F(WiMaxProviderTest, GetUniqueService) {
409 EXPECT_TRUE(provider_.services_.empty());
410
411 static const char kName0[] = "Test WiMAX Network";
412 static const char kName1[] = "Unknown Network";
413 static const char kNetworkId[] = "12340000";
414
415 // Service already exists.
416 scoped_refptr<MockWiMaxService> service0(
417 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
418 service0->set_network_id(kNetworkId);
419 service0->set_friendly_name(kName0);
420 service0->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200421 provider_.services_[service0->GetStorageIdentifier()] = service0;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200422 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
423 WiMaxServiceRefPtr service = provider_.GetUniqueService(kNetworkId, kName0);
424 ASSERT_TRUE(service);
425 EXPECT_EQ(service0.get(), service.get());
426 EXPECT_EQ(1, provider_.services_.size());
427
428 // Create a new service.
429 EXPECT_CALL(manager_, RegisterService(_));
430 service = provider_.GetUniqueService(kNetworkId, kName1);
431 ASSERT_TRUE(service);
432 EXPECT_NE(service0.get(), service.get());
433 EXPECT_EQ(2, provider_.services_.size());
434 EXPECT_EQ(WiMaxService::CreateStorageIdentifier(kNetworkId, kName1),
435 service->GetStorageIdentifier());
Darin Petkovc1e52732012-05-25 15:23:45 +0200436 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200437
438 // Service already exists -- it was just created.
439 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
440 WiMaxServiceRefPtr service1 = provider_.GetUniqueService(kNetworkId, kName1);
441 ASSERT_TRUE(service1);
442 EXPECT_EQ(service.get(), service1.get());
443 EXPECT_EQ(2, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200444 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200445}
446
Darin Petkovc63dcf02012-05-24 11:51:43 +0200447TEST_F(WiMaxProviderTest, CreateServicesFromProfile) {
Paul Stewart5ad16062013-02-21 18:10:48 -0800448 base::ScopedTempDir temp_dir;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200449 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
450 FilePath test_profile = temp_dir.path().Append("test-profile");
451 GLib glib;
452 KeyFileStore store(&glib);
453 store.set_path(test_profile);
454 static const char contents[] =
455 "[no_type]\n"
456 "Name=No Type Entry\n"
457 "\n"
458 "[no_wimax]\n"
459 "Type=vpn\n"
460 "\n"
461 "[wimax_network_01234567]\n"
462 "Name=network\n"
463 "Type=wimax\n"
464 "NetworkId=01234567\n"
465 "\n"
466 "[no_network_id]\n"
467 "Type=wimax\n"
468 "\n"
469 "[no_name]\n"
470 "Type=wimax\n"
471 "NetworkId=76543210\n";
472 EXPECT_EQ(strlen(contents),
Ben Chan6fbf64f2014-05-21 18:07:01 -0700473 base::WriteFile(test_profile, contents, strlen(contents)));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200474 ASSERT_TRUE(store.Open());
Thieu Le5133b712013-02-19 14:47:21 -0800475 scoped_refptr<MockProfile> profile(
476 new MockProfile(&control_, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200477 EXPECT_CALL(*profile, GetConstStorage())
478 .Times(2)
479 .WillRepeatedly(Return(&store));
480 EXPECT_CALL(manager_, RegisterService(_));
481 EXPECT_CALL(*profile, ConfigureService(_)).WillOnce(Return(true));
482 provider_.CreateServicesFromProfile(profile);
483 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200484 WiMaxServiceRefPtr service = provider_.services_.begin()->second;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200485 EXPECT_EQ("wimax_network_01234567", service->GetStorageIdentifier());
486 provider_.CreateServicesFromProfile(profile);
487 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200488 EXPECT_EQ(service.get(), provider_.services_.begin()->second);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200489}
490
Darin Petkovd1cd7972012-05-22 15:26:15 +0200491TEST_F(WiMaxProviderTest, GetService) {
492 KeyValueStore args;
493 Error e;
494
Ben Chan4276cca2013-09-20 10:07:04 -0700495 args.SetString(kTypeProperty, kTypeWimax);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200496
497 // No network id property.
Paul Stewart0e51ad92013-07-26 14:42:55 -0700498 ServiceRefPtr service = provider_.GetService(args, &e);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200499 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200500 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200501
502 // No name property.
503 static const char kNetworkId[] = "1234abcd";
504 args.SetString(WiMaxService::kNetworkIdProperty, kNetworkId);
505 e.Reset();
506 service = provider_.GetService(args, &e);
507 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200508 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200509
510 // Service created and configured.
511 static const char kName[] = "Test WiMAX Network";
Ben Chan4276cca2013-09-20 10:07:04 -0700512 args.SetString(kNameProperty, kName);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200513 static const char kIdentity[] = "joe";
Ben Chan4276cca2013-09-20 10:07:04 -0700514 args.SetString(kEapIdentityProperty, kIdentity);
Paul Stewartbc14fb72013-07-30 08:21:58 -0700515
Darin Petkovd1cd7972012-05-22 15:26:15 +0200516 e.Reset();
Paul Stewartbc14fb72013-07-30 08:21:58 -0700517 service = provider_.FindSimilarService(args, &e);
518 EXPECT_EQ(ServiceRefPtr(), service);
519 EXPECT_EQ(Error::kNotFound, e.type());
520
521 e.Reset();
522 EXPECT_CALL(manager_, RegisterService(_));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200523 service = provider_.GetService(args, &e);
524 EXPECT_TRUE(e.IsSuccess());
525 ASSERT_TRUE(service);
Paul Stewartbc14fb72013-07-30 08:21:58 -0700526 testing::Mock::VerifyAndClearExpectations(&manager_);
Paul Stewart2c575d22012-12-07 12:28:57 -0800527
528 // GetService should create a service with only identifying parameters set.
Darin Petkov457728b2013-01-09 09:49:08 +0100529 EXPECT_EQ(kName, GetServiceFriendlyName(service));
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700530 EXPECT_EQ("", service->eap()->identity());
Paul Stewart2c575d22012-12-07 12:28:57 -0800531
Paul Stewartbc14fb72013-07-30 08:21:58 -0700532 e.Reset();
533 ServiceRefPtr similar_service = provider_.FindSimilarService(args, &e);
534 EXPECT_EQ(service, similar_service);
535 EXPECT_TRUE(e.IsSuccess());
536
Paul Stewart2c575d22012-12-07 12:28:57 -0800537 // After configuring the service, other parameters should be set.
538 service->Configure(args, &e);
539 EXPECT_TRUE(e.IsSuccess());
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700540 EXPECT_EQ(kIdentity, service->eap()->identity());
Paul Stewartbc14fb72013-07-30 08:21:58 -0700541
542 e.Reset();
543 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
544 ServiceRefPtr temporary_service = provider_.CreateTemporaryService(args, &e);
545 EXPECT_NE(ServiceRefPtr(), temporary_service);
546 EXPECT_NE(service, temporary_service);
547 EXPECT_TRUE(e.IsSuccess());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200548}
549
550TEST_F(WiMaxProviderTest, SelectCarrier) {
551 scoped_refptr<MockWiMaxService> service(
552 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
553 EXPECT_FALSE(provider_.SelectCarrier(service));
554 scoped_refptr<MockWiMax> device(
555 new MockWiMax(&control_, NULL, &metrics_, &manager_,
556 GetTestLinkName(1), "", 1, GetTestPath(1)));
557 provider_.devices_[GetTestLinkName(1)] = device;
558 WiMaxRefPtr carrier = provider_.SelectCarrier(service);
559 EXPECT_EQ(device.get(), carrier.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200560}
561
Darin Petkovc1e52732012-05-25 15:23:45 +0200562TEST_F(WiMaxProviderTest, OnServiceUnloaded) {
563 scoped_refptr<MockWiMaxService> service(
564 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
565 EXPECT_FALSE(service->is_default());
566 scoped_refptr<MockWiMaxService> service_default(
567 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
568 service_default->set_is_default(true);
569 provider_.services_[service->GetStorageIdentifier()] = service;
570 provider_.services_[service_default->GetStorageIdentifier()] =
571 service_default;
572 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
573 EXPECT_FALSE(provider_.OnServiceUnloaded(service_default));
574 EXPECT_EQ(2, provider_.services_.size());
575 EXPECT_TRUE(provider_.OnServiceUnloaded(service));
576 EXPECT_EQ(1, provider_.services_.size());
577 EXPECT_EQ(service_default.get(), provider_.services_.begin()->second.get());
578}
579
Darin Petkovb72b62e2012-05-15 16:55:36 +0200580} // namespace shill