blob: 01c768b17fe4ef7fbadea60bd24496cc638fceeb [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
Darin Petkovc63dcf02012-05-24 11:51:43 +02007#include <base/file_util.h>
Paul Stewart5ad16062013-02-21 18:10:48 -08008#include <base/files/scoped_temp_dir.h>
Darin Petkove4b27022012-05-16 13:28:50 +02009#include <base/stringprintf.h>
Darin Petkov9893d9c2012-05-17 15:27:31 -070010#include <chromeos/dbus/service_constants.h>
Darin Petkovb72b62e2012-05-15 16:55:36 +020011#include <gtest/gtest.h>
12
Paul Stewartc43cbbe2013-04-11 06:29:30 -070013#include "shill/eap_credentials.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020014#include "shill/glib.h"
15#include "shill/key_file_store.h"
Darin Petkovb501ad22012-07-03 12:50:52 +020016#include "shill/mock_dbus_manager.h"
Darin Petkove4b27022012-05-16 13:28:50 +020017#include "shill/mock_device_info.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020018#include "shill/mock_profile.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020019#include "shill/mock_manager.h"
20#include "shill/mock_metrics.h"
Darin Petkove4b27022012-05-16 13:28:50 +020021#include "shill/mock_wimax.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020022#include "shill/mock_wimax_manager_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020023#include "shill/mock_wimax_network_proxy.h"
24#include "shill/mock_wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020025#include "shill/nice_mock_control.h"
26#include "shill/proxy_factory.h"
Darin Petkovd1cd7972012-05-22 15:26:15 +020027#include "shill/wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020028
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080029using base::FilePath;
Darin Petkovb72b62e2012-05-15 16:55:36 +020030using std::string;
31using std::vector;
32using testing::_;
33using testing::Return;
34
35namespace shill {
36
Darin Petkove4b27022012-05-16 13:28:50 +020037namespace {
Darin Petkove4b27022012-05-16 13:28:50 +020038
39string GetTestLinkName(int index) {
40 return StringPrintf("wm%d", index);
41}
42
43string GetTestPath(int index) {
Darin Petkov9893d9c2012-05-17 15:27:31 -070044 return wimax_manager::kDeviceObjectPathPrefix + GetTestLinkName(index);
Darin Petkove4b27022012-05-16 13:28:50 +020045}
Darin Petkov9893d9c2012-05-17 15:27:31 -070046
Darin Petkovc63dcf02012-05-24 11:51:43 +020047string GetTestNetworkPath(uint32 identifier) {
48 return base::StringPrintf("%s%08x",
49 wimax_manager::kNetworkObjectPathPrefix,
50 identifier);
51}
52
Darin Petkove4b27022012-05-16 13:28:50 +020053} // namespace
54
Darin Petkovb72b62e2012-05-15 16:55:36 +020055class WiMaxProviderTest : public testing::Test {
56 public:
57 WiMaxProviderTest()
Darin Petkovb501ad22012-07-03 12:50:52 +020058 : wimax_manager_proxy_(new MockWiMaxManagerProxy()),
Darin Petkovc63dcf02012-05-24 11:51:43 +020059 network_proxy_(new MockWiMaxNetworkProxy()),
Darin Petkovb72b62e2012-05-15 16:55:36 +020060 proxy_factory_(this),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080061 metrics_(NULL),
Darin Petkovb72b62e2012-05-15 16:55:36 +020062 manager_(&control_, NULL, &metrics_, NULL),
Darin Petkove4b27022012-05-16 13:28:50 +020063 device_info_(&control_, NULL, &metrics_, &manager_),
Darin Petkovb501ad22012-07-03 12:50:52 +020064 dbus_manager_(new MockDBusManager()),
65 provider_(&control_, NULL, &metrics_, &manager_) {
66 manager_.dbus_manager_.reset(dbus_manager_); // Transfers ownership.
67 }
Darin Petkovb72b62e2012-05-15 16:55:36 +020068
69 virtual ~WiMaxProviderTest() {}
70
71 protected:
72 class TestProxyFactory : public ProxyFactory {
73 public:
74 explicit TestProxyFactory(WiMaxProviderTest *test) : test_(test) {}
75
Darin Petkovb72b62e2012-05-15 16:55:36 +020076 virtual WiMaxManagerProxyInterface *CreateWiMaxManagerProxy() {
Darin Petkovb501ad22012-07-03 12:50:52 +020077 return test_->wimax_manager_proxy_.release();
Darin Petkovb72b62e2012-05-15 16:55:36 +020078 }
79
Darin Petkovc63dcf02012-05-24 11:51:43 +020080 virtual WiMaxNetworkProxyInterface *CreateWiMaxNetworkProxy(
81 const string &/*path*/) {
82 return test_->network_proxy_.release();
83 }
84
Darin Petkovb72b62e2012-05-15 16:55:36 +020085 private:
86 WiMaxProviderTest *test_;
87
88 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
89 };
90
91 virtual void SetUp() {
92 provider_.proxy_factory_ = &proxy_factory_;
93 }
94
95 virtual void TearDown() {
96 provider_.proxy_factory_ = NULL;
97 }
98
Darin Petkov457728b2013-01-09 09:49:08 +010099 string GetServiceFriendlyName(const ServiceRefPtr &service) {
100 return service->friendly_name();
101 }
102
Darin Petkovb501ad22012-07-03 12:50:52 +0200103 scoped_ptr<MockWiMaxManagerProxy> wimax_manager_proxy_;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200104 scoped_ptr<MockWiMaxNetworkProxy> network_proxy_;
Darin Petkovb72b62e2012-05-15 16:55:36 +0200105 TestProxyFactory proxy_factory_;
106 NiceMockControl control_;
107 MockMetrics metrics_;
108 MockManager manager_;
Darin Petkove4b27022012-05-16 13:28:50 +0200109 MockDeviceInfo device_info_;
Darin Petkovb501ad22012-07-03 12:50:52 +0200110 MockDBusManager *dbus_manager_;
Darin Petkovb72b62e2012-05-15 16:55:36 +0200111 WiMaxProvider provider_;
112};
113
114TEST_F(WiMaxProviderTest, StartStop) {
Darin Petkovb501ad22012-07-03 12:50:52 +0200115 EXPECT_TRUE(provider_.on_wimax_manager_appear_.IsCancelled());
116 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
117 EXPECT_CALL(*dbus_manager_,
118 WatchName(wimax_manager::kWiMaxManagerServiceName, _, _));
Darin Petkovb72b62e2012-05-15 16:55:36 +0200119 provider_.Start();
Darin Petkovb501ad22012-07-03 12:50:52 +0200120 EXPECT_FALSE(provider_.on_wimax_manager_appear_.IsCancelled());
121 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200122 provider_.Start();
Darin Petkovb501ad22012-07-03 12:50:52 +0200123 EXPECT_CALL(*wimax_manager_proxy_, set_devices_changed_callback(_)).Times(1);
124 EXPECT_CALL(*wimax_manager_proxy_, Devices(_))
125 .WillOnce(Return(RpcIdentifiers()));
126 provider_.OnWiMaxManagerAppear(":0.11");
127 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200128 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200129 provider_.Stop();
Darin Petkovb501ad22012-07-03 12:50:52 +0200130 EXPECT_TRUE(provider_.on_wimax_manager_appear_.IsCancelled());
131 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200132 EXPECT_TRUE(provider_.pending_devices_.empty());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200133 provider_.Stop();
134}
135
Darin Petkovb501ad22012-07-03 12:50:52 +0200136TEST_F(WiMaxProviderTest, ConnectDisconnectWiMaxManager) {
137 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
138 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";
242 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
243 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
244 provider_.RetrieveNetworkInfo(GetTestNetworkPath(kIdentifier));
245 EXPECT_EQ(1, provider_.networks_.size());
246 EXPECT_TRUE(ContainsKey(provider_.networks_,
247 GetTestNetworkPath(kIdentifier)));
248 EXPECT_EQ(kName,
249 provider_.networks_[GetTestNetworkPath(kIdentifier)].name);
250 EXPECT_EQ(kNetworkId,
251 provider_.networks_[GetTestNetworkPath(kIdentifier)].id);
252 provider_.RetrieveNetworkInfo(GetTestNetworkPath(kIdentifier));
253 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();
380 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
381 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
382
Darin Petkovc1e52732012-05-25 15:23:45 +0200383 provider_.services_[service0->GetStorageIdentifier()] = service0;
384 provider_.services_[service1->GetStorageIdentifier()] = service1;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200385
386 for (int i = 0; i < 3; i++) {
387 scoped_refptr<MockWiMax> device(
388 new MockWiMax(&control_, NULL, &metrics_, &manager_,
389 GetTestLinkName(i), "", i, GetTestPath(i)));
390 provider_.devices_[GetTestLinkName(i)] = device;
391 if (i > 0) {
392 device->networks_.insert(GetTestNetworkPath(101));
393 }
394 }
395 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
396 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
397
Darin Petkovfc00fd42012-05-30 11:30:06 +0200398 provider_.networks_["/org/chromium/foo"].id = "foo";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200399 provider_.OnNetworksChanged();
400 EXPECT_EQ(1, provider_.networks_.size());
401 EXPECT_TRUE(ContainsKey(provider_.networks_, GetTestNetworkPath(101)));
402}
403
404TEST_F(WiMaxProviderTest, GetUniqueService) {
405 EXPECT_TRUE(provider_.services_.empty());
406
407 static const char kName0[] = "Test WiMAX Network";
408 static const char kName1[] = "Unknown Network";
409 static const char kNetworkId[] = "12340000";
410
411 // Service already exists.
412 scoped_refptr<MockWiMaxService> service0(
413 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
414 service0->set_network_id(kNetworkId);
415 service0->set_friendly_name(kName0);
416 service0->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200417 provider_.services_[service0->GetStorageIdentifier()] = service0;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200418 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
419 WiMaxServiceRefPtr service = provider_.GetUniqueService(kNetworkId, kName0);
420 ASSERT_TRUE(service);
421 EXPECT_EQ(service0.get(), service.get());
422 EXPECT_EQ(1, provider_.services_.size());
423
424 // Create a new service.
425 EXPECT_CALL(manager_, RegisterService(_));
426 service = provider_.GetUniqueService(kNetworkId, kName1);
427 ASSERT_TRUE(service);
428 EXPECT_NE(service0.get(), service.get());
429 EXPECT_EQ(2, provider_.services_.size());
430 EXPECT_EQ(WiMaxService::CreateStorageIdentifier(kNetworkId, kName1),
431 service->GetStorageIdentifier());
Darin Petkovc1e52732012-05-25 15:23:45 +0200432 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200433
434 // Service already exists -- it was just created.
435 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
436 WiMaxServiceRefPtr service1 = provider_.GetUniqueService(kNetworkId, kName1);
437 ASSERT_TRUE(service1);
438 EXPECT_EQ(service.get(), service1.get());
439 EXPECT_EQ(2, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200440 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200441}
442
Darin Petkovc63dcf02012-05-24 11:51:43 +0200443TEST_F(WiMaxProviderTest, CreateServicesFromProfile) {
Paul Stewart5ad16062013-02-21 18:10:48 -0800444 base::ScopedTempDir temp_dir;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200445 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
446 FilePath test_profile = temp_dir.path().Append("test-profile");
447 GLib glib;
448 KeyFileStore store(&glib);
449 store.set_path(test_profile);
450 static const char contents[] =
451 "[no_type]\n"
452 "Name=No Type Entry\n"
453 "\n"
454 "[no_wimax]\n"
455 "Type=vpn\n"
456 "\n"
457 "[wimax_network_01234567]\n"
458 "Name=network\n"
459 "Type=wimax\n"
460 "NetworkId=01234567\n"
461 "\n"
462 "[no_network_id]\n"
463 "Type=wimax\n"
464 "\n"
465 "[no_name]\n"
466 "Type=wimax\n"
467 "NetworkId=76543210\n";
468 EXPECT_EQ(strlen(contents),
469 file_util::WriteFile(test_profile, contents, strlen(contents)));
470 ASSERT_TRUE(store.Open());
Thieu Le5133b712013-02-19 14:47:21 -0800471 scoped_refptr<MockProfile> profile(
472 new MockProfile(&control_, &metrics_, &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200473 EXPECT_CALL(*profile, GetConstStorage())
474 .Times(2)
475 .WillRepeatedly(Return(&store));
476 EXPECT_CALL(manager_, RegisterService(_));
477 EXPECT_CALL(*profile, ConfigureService(_)).WillOnce(Return(true));
478 provider_.CreateServicesFromProfile(profile);
479 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200480 WiMaxServiceRefPtr service = provider_.services_.begin()->second;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200481 EXPECT_EQ("wimax_network_01234567", service->GetStorageIdentifier());
482 provider_.CreateServicesFromProfile(profile);
483 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200484 EXPECT_EQ(service.get(), provider_.services_.begin()->second);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200485}
486
Darin Petkovd1cd7972012-05-22 15:26:15 +0200487TEST_F(WiMaxProviderTest, GetService) {
488 KeyValueStore args;
489 Error e;
490
Darin Petkovd1cd7972012-05-22 15:26:15 +0200491 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWimax);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200492
493 // No network id property.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200494 WiMaxServiceRefPtr service = provider_.GetService(args, &e);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200495 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200496 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200497
498 // No name property.
499 static const char kNetworkId[] = "1234abcd";
500 args.SetString(WiMaxService::kNetworkIdProperty, kNetworkId);
501 e.Reset();
502 service = provider_.GetService(args, &e);
503 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200504 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200505
506 // Service created and configured.
507 static const char kName[] = "Test WiMAX Network";
508 args.SetString(flimflam::kNameProperty, kName);
509 static const char kIdentity[] = "joe";
510 args.SetString(flimflam::kEapIdentityProperty, kIdentity);
511 EXPECT_CALL(manager_, RegisterService(_));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200512 e.Reset();
513 service = provider_.GetService(args, &e);
514 EXPECT_TRUE(e.IsSuccess());
515 ASSERT_TRUE(service);
Paul Stewart2c575d22012-12-07 12:28:57 -0800516
517 // GetService should create a service with only identifying parameters set.
Darin Petkov457728b2013-01-09 09:49:08 +0100518 EXPECT_EQ(kName, GetServiceFriendlyName(service));
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700519 EXPECT_EQ("", service->eap()->identity());
Paul Stewart2c575d22012-12-07 12:28:57 -0800520
521 // After configuring the service, other parameters should be set.
522 service->Configure(args, &e);
523 EXPECT_TRUE(e.IsSuccess());
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700524 EXPECT_EQ(kIdentity, service->eap()->identity());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200525}
526
527TEST_F(WiMaxProviderTest, SelectCarrier) {
528 scoped_refptr<MockWiMaxService> service(
529 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
530 EXPECT_FALSE(provider_.SelectCarrier(service));
531 scoped_refptr<MockWiMax> device(
532 new MockWiMax(&control_, NULL, &metrics_, &manager_,
533 GetTestLinkName(1), "", 1, GetTestPath(1)));
534 provider_.devices_[GetTestLinkName(1)] = device;
535 WiMaxRefPtr carrier = provider_.SelectCarrier(service);
536 EXPECT_EQ(device.get(), carrier.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200537}
538
Darin Petkovc1e52732012-05-25 15:23:45 +0200539TEST_F(WiMaxProviderTest, OnServiceUnloaded) {
540 scoped_refptr<MockWiMaxService> service(
541 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
542 EXPECT_FALSE(service->is_default());
543 scoped_refptr<MockWiMaxService> service_default(
544 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
545 service_default->set_is_default(true);
546 provider_.services_[service->GetStorageIdentifier()] = service;
547 provider_.services_[service_default->GetStorageIdentifier()] =
548 service_default;
549 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
550 EXPECT_FALSE(provider_.OnServiceUnloaded(service_default));
551 EXPECT_EQ(2, provider_.services_.size());
552 EXPECT_TRUE(provider_.OnServiceUnloaded(service));
553 EXPECT_EQ(1, provider_.services_.size());
554 EXPECT_EQ(service_default.get(), provider_.services_.begin()->second.get());
555}
556
Darin Petkovb72b62e2012-05-15 16:55:36 +0200557} // namespace shill