blob: 1029efc3bcd1f33140f1c8af24f8ec327da88238 [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>
8#include <base/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
Darin Petkovc63dcf02012-05-24 11:51:43 +020013#include "shill/glib.h"
14#include "shill/key_file_store.h"
Darin Petkovb501ad22012-07-03 12:50:52 +020015#include "shill/mock_dbus_manager.h"
Darin Petkove4b27022012-05-16 13:28:50 +020016#include "shill/mock_device_info.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020017#include "shill/mock_profile.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020018#include "shill/mock_manager.h"
19#include "shill/mock_metrics.h"
Darin Petkove4b27022012-05-16 13:28:50 +020020#include "shill/mock_wimax.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020021#include "shill/mock_wimax_manager_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020022#include "shill/mock_wimax_network_proxy.h"
23#include "shill/mock_wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020024#include "shill/nice_mock_control.h"
25#include "shill/proxy_factory.h"
Darin Petkovd1cd7972012-05-22 15:26:15 +020026#include "shill/wimax_service.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020027
28using std::string;
29using std::vector;
30using testing::_;
31using testing::Return;
32
33namespace shill {
34
Darin Petkove4b27022012-05-16 13:28:50 +020035namespace {
Darin Petkove4b27022012-05-16 13:28:50 +020036
37string GetTestLinkName(int index) {
38 return StringPrintf("wm%d", index);
39}
40
41string GetTestPath(int index) {
Darin Petkov9893d9c2012-05-17 15:27:31 -070042 return wimax_manager::kDeviceObjectPathPrefix + GetTestLinkName(index);
Darin Petkove4b27022012-05-16 13:28:50 +020043}
Darin Petkov9893d9c2012-05-17 15:27:31 -070044
Darin Petkovc63dcf02012-05-24 11:51:43 +020045string GetTestNetworkPath(uint32 identifier) {
46 return base::StringPrintf("%s%08x",
47 wimax_manager::kNetworkObjectPathPrefix,
48 identifier);
49}
50
Darin Petkove4b27022012-05-16 13:28:50 +020051} // namespace
52
Darin Petkovb72b62e2012-05-15 16:55:36 +020053class WiMaxProviderTest : public testing::Test {
54 public:
55 WiMaxProviderTest()
Darin Petkovb501ad22012-07-03 12:50:52 +020056 : wimax_manager_proxy_(new MockWiMaxManagerProxy()),
Darin Petkovc63dcf02012-05-24 11:51:43 +020057 network_proxy_(new MockWiMaxNetworkProxy()),
Darin Petkovb72b62e2012-05-15 16:55:36 +020058 proxy_factory_(this),
59 manager_(&control_, NULL, &metrics_, NULL),
Darin Petkove4b27022012-05-16 13:28:50 +020060 device_info_(&control_, NULL, &metrics_, &manager_),
Darin Petkovb501ad22012-07-03 12:50:52 +020061 dbus_manager_(new MockDBusManager()),
62 provider_(&control_, NULL, &metrics_, &manager_) {
63 manager_.dbus_manager_.reset(dbus_manager_); // Transfers ownership.
64 }
Darin Petkovb72b62e2012-05-15 16:55:36 +020065
66 virtual ~WiMaxProviderTest() {}
67
68 protected:
69 class TestProxyFactory : public ProxyFactory {
70 public:
71 explicit TestProxyFactory(WiMaxProviderTest *test) : test_(test) {}
72
Darin Petkovb72b62e2012-05-15 16:55:36 +020073 virtual WiMaxManagerProxyInterface *CreateWiMaxManagerProxy() {
Darin Petkovb501ad22012-07-03 12:50:52 +020074 return test_->wimax_manager_proxy_.release();
Darin Petkovb72b62e2012-05-15 16:55:36 +020075 }
76
Darin Petkovc63dcf02012-05-24 11:51:43 +020077 virtual WiMaxNetworkProxyInterface *CreateWiMaxNetworkProxy(
78 const string &/*path*/) {
79 return test_->network_proxy_.release();
80 }
81
Darin Petkovb72b62e2012-05-15 16:55:36 +020082 private:
83 WiMaxProviderTest *test_;
84
85 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
86 };
87
88 virtual void SetUp() {
89 provider_.proxy_factory_ = &proxy_factory_;
90 }
91
92 virtual void TearDown() {
93 provider_.proxy_factory_ = NULL;
94 }
95
Darin Petkovb501ad22012-07-03 12:50:52 +020096 scoped_ptr<MockWiMaxManagerProxy> wimax_manager_proxy_;
Darin Petkovc63dcf02012-05-24 11:51:43 +020097 scoped_ptr<MockWiMaxNetworkProxy> network_proxy_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020098 TestProxyFactory proxy_factory_;
99 NiceMockControl control_;
100 MockMetrics metrics_;
101 MockManager manager_;
Darin Petkove4b27022012-05-16 13:28:50 +0200102 MockDeviceInfo device_info_;
Darin Petkovb501ad22012-07-03 12:50:52 +0200103 MockDBusManager *dbus_manager_;
Darin Petkovb72b62e2012-05-15 16:55:36 +0200104 WiMaxProvider provider_;
105};
106
107TEST_F(WiMaxProviderTest, StartStop) {
Darin Petkovb501ad22012-07-03 12:50:52 +0200108 EXPECT_TRUE(provider_.on_wimax_manager_appear_.IsCancelled());
109 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
110 EXPECT_CALL(*dbus_manager_,
111 WatchName(wimax_manager::kWiMaxManagerServiceName, _, _));
Darin Petkovb72b62e2012-05-15 16:55:36 +0200112 provider_.Start();
Darin Petkovb501ad22012-07-03 12:50:52 +0200113 EXPECT_FALSE(provider_.on_wimax_manager_appear_.IsCancelled());
114 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200115 provider_.Start();
Darin Petkovb501ad22012-07-03 12:50:52 +0200116 EXPECT_CALL(*wimax_manager_proxy_, set_devices_changed_callback(_)).Times(1);
117 EXPECT_CALL(*wimax_manager_proxy_, Devices(_))
118 .WillOnce(Return(RpcIdentifiers()));
119 provider_.OnWiMaxManagerAppear(":0.11");
120 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200121 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200122 provider_.Stop();
Darin Petkovb501ad22012-07-03 12:50:52 +0200123 EXPECT_TRUE(provider_.on_wimax_manager_appear_.IsCancelled());
124 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200125 EXPECT_TRUE(provider_.pending_devices_.empty());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200126 provider_.Stop();
127}
128
Darin Petkovb501ad22012-07-03 12:50:52 +0200129TEST_F(WiMaxProviderTest, ConnectDisconnectWiMaxManager) {
130 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
131 EXPECT_CALL(*wimax_manager_proxy_, set_devices_changed_callback(_)).Times(1);
132 EXPECT_CALL(*wimax_manager_proxy_, Devices(_))
133 .WillOnce(Return(RpcIdentifiers()));
134 provider_.ConnectToWiMaxManager();
135 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
136 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
137 provider_.DisconnectFromWiMaxManager();
138 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
139 EXPECT_TRUE(provider_.pending_devices_.empty());
140}
141
Darin Petkov9893d9c2012-05-17 15:27:31 -0700142TEST_F(WiMaxProviderTest, OnDevicesChanged) {
Darin Petkove4b27022012-05-16 13:28:50 +0200143 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
144
145 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
Darin Petkov9893d9c2012-05-17 15:27:31 -0700146 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200147 live_devices.push_back(GetTestPath(2));
148 live_devices.push_back(GetTestPath(3));
149 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(2))).WillOnce(Return(-1));
150 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(3))).WillOnce(Return(-1));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700151 provider_.OnDevicesChanged(live_devices);
Darin Petkove4b27022012-05-16 13:28:50 +0200152 ASSERT_EQ(2, provider_.pending_devices_.size());
153 EXPECT_EQ(GetTestPath(2), provider_.pending_devices_[GetTestLinkName(2)]);
154 EXPECT_EQ(GetTestPath(3), provider_.pending_devices_[GetTestLinkName(3)]);
155}
156
157TEST_F(WiMaxProviderTest, OnDeviceInfoAvailable) {
158 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
159
160 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
161 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
162 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
163 EXPECT_CALL(device_info_, RegisterDevice(_));
164 provider_.OnDeviceInfoAvailable(GetTestLinkName(1));
165 EXPECT_TRUE(provider_.pending_devices_.empty());
166 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200167 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
168 EXPECT_EQ(GetTestLinkName(1),
169 provider_.devices_[GetTestLinkName(1)]->link_name());
Darin Petkove4b27022012-05-16 13:28:50 +0200170}
171
Darin Petkove4b27022012-05-16 13:28:50 +0200172TEST_F(WiMaxProviderTest, CreateDevice) {
173 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
174
175 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(-1));
176 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
177 EXPECT_TRUE(provider_.devices_.empty());
178 ASSERT_EQ(1, provider_.pending_devices_.size());
179 EXPECT_EQ(GetTestPath(1), provider_.pending_devices_[GetTestLinkName(1)]);
180
181 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
182 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
183 EXPECT_CALL(device_info_, RegisterDevice(_));
184 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
185 EXPECT_TRUE(provider_.pending_devices_.empty());
186 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200187 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
188 EXPECT_EQ(GetTestLinkName(1),
189 provider_.devices_[GetTestLinkName(1)]->link_name());
190
191 WiMax *device = provider_.devices_[GetTestLinkName(1)].get();
192 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
193 EXPECT_EQ(device, provider_.devices_[GetTestLinkName(1)].get());
Darin Petkove4b27022012-05-16 13:28:50 +0200194}
195
196TEST_F(WiMaxProviderTest, DestroyDeadDevices) {
197 for (int i = 0; i < 4; i++) {
Darin Petkovb96a4512012-06-04 11:02:49 +0200198 scoped_refptr<MockWiMax> device(
Darin Petkovc63dcf02012-05-24 11:51:43 +0200199 new MockWiMax(&control_, NULL, &metrics_, &manager_,
Darin Petkovb96a4512012-06-04 11:02:49 +0200200 GetTestLinkName(i), "", i, GetTestPath(i)));
201 EXPECT_CALL(*device, OnDeviceVanished()).Times((i == 0 || i == 3) ? 0 : 1);
202 provider_.devices_[GetTestLinkName(i)] = device;
Darin Petkove4b27022012-05-16 13:28:50 +0200203 }
204 for (int i = 4; i < 8; i++) {
205 provider_.pending_devices_[GetTestLinkName(i)] = GetTestPath(i);
206 }
Darin Petkov9893d9c2012-05-17 15:27:31 -0700207 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200208 live_devices.push_back(GetTestPath(0));
209 live_devices.push_back(GetTestPath(3));
210 live_devices.push_back(GetTestPath(4));
211 live_devices.push_back(GetTestPath(7));
212 live_devices.push_back(GetTestPath(123));
213 EXPECT_CALL(manager_, device_info())
214 .Times(2)
215 .WillRepeatedly(Return(&device_info_));
216 EXPECT_CALL(device_info_, DeregisterDevice(_)).Times(2);
217 provider_.DestroyDeadDevices(live_devices);
218 ASSERT_EQ(2, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200219 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(0)));
220 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(3)));
Darin Petkove4b27022012-05-16 13:28:50 +0200221 EXPECT_EQ(2, provider_.pending_devices_.size());
222 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(4)));
223 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(7)));
224}
225
226TEST_F(WiMaxProviderTest, GetLinkName) {
227 EXPECT_EQ("", provider_.GetLinkName("/random/path"));
228 EXPECT_EQ(GetTestLinkName(1), provider_.GetLinkName(GetTestPath(1)));
229}
230
Darin Petkovfc00fd42012-05-30 11:30:06 +0200231TEST_F(WiMaxProviderTest, RetrieveNetworkInfo) {
232 static const char kName[] = "Default Network";
233 const uint32 kIdentifier = 0xabcdef;
234 static const char kNetworkId[] = "00abcdef";
235 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
236 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
237 provider_.RetrieveNetworkInfo(GetTestNetworkPath(kIdentifier));
238 EXPECT_EQ(1, provider_.networks_.size());
239 EXPECT_TRUE(ContainsKey(provider_.networks_,
240 GetTestNetworkPath(kIdentifier)));
241 EXPECT_EQ(kName,
242 provider_.networks_[GetTestNetworkPath(kIdentifier)].name);
243 EXPECT_EQ(kNetworkId,
244 provider_.networks_[GetTestNetworkPath(kIdentifier)].id);
245 provider_.RetrieveNetworkInfo(GetTestNetworkPath(kIdentifier));
246 EXPECT_EQ(1, provider_.networks_.size());
247}
248
Darin Petkovc63dcf02012-05-24 11:51:43 +0200249TEST_F(WiMaxProviderTest, FindService) {
250 EXPECT_FALSE(provider_.FindService("some_storage_id"));
251 scoped_refptr<MockWiMaxService> service(
252 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
253 static const char kName[] = "WiMAX Network";
254 static const char kNetworkId[] = "76543210";
255 service->set_friendly_name(kName);
256 service->set_network_id(kNetworkId);
257 service->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200258 provider_.services_[service->GetStorageIdentifier()] = service;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200259 EXPECT_EQ(service.get(),
260 provider_.FindService(
261 WiMaxService::CreateStorageIdentifier(kNetworkId,
262 kName)).get());
263 EXPECT_FALSE(provider_.FindService("some_storage_id"));
264}
265
Darin Petkovfc00fd42012-05-30 11:30:06 +0200266TEST_F(WiMaxProviderTest, StartLiveServices) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200267 const uint32 kIdentifier = 0x1234567;
268 static const char kNetworkId[] = "01234567";
269 static const char kName[] = "Some WiMAX Provider";
270 vector<scoped_refptr<MockWiMaxService> > services(4);
271 for (size_t i = 0; i < services.size(); i++) {
272 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200273 if (i == 0) {
274 services[0]->set_network_id("deadbeef");
275 } else {
276 services[i]->set_network_id(kNetworkId);
277 }
278 // Make services[3] the default service.
279 if (i == 3) {
280 services[i]->set_friendly_name(kName);
281 } else {
282 services[i]->set_friendly_name(
283 base::StringPrintf("Configured %d", static_cast<int>(i)));
284 }
285 services[i]->InitStorageIdentifier();
286 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200287 }
Darin Petkovfc00fd42012-05-30 11:30:06 +0200288 WiMaxProvider::NetworkInfo info;
289 info.id = kNetworkId;
290 info.name = kName;
291 provider_.networks_[GetTestNetworkPath(kIdentifier)] = info;
292 network_proxy_.reset();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200293 EXPECT_CALL(*services[0], IsStarted()).Times(0);
294 EXPECT_CALL(*services[1], IsStarted()).WillOnce(Return(true));
295 EXPECT_CALL(*services[1], Start(_)).Times(0);
296 EXPECT_CALL(*services[2], IsStarted()).WillOnce(Return(false));
297 EXPECT_CALL(*services[2], Start(_)).WillOnce(Return(true));
298 EXPECT_CALL(*services[3], IsStarted()).WillOnce(Return(false));
299 EXPECT_CALL(*services[3], Start(_)).WillOnce(Return(false));
300 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200301 provider_.StartLiveServices();
302 EXPECT_FALSE(services[0]->is_default());
303 EXPECT_FALSE(services[1]->is_default());
304 EXPECT_FALSE(services[2]->is_default());
305 EXPECT_TRUE(services[3]->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200306}
307
308TEST_F(WiMaxProviderTest, DestroyAllServices) {
309 vector<scoped_refptr<MockWiMaxService> > services(2);
310 for (size_t i = 0; i < services.size(); i++) {
311 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200312 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200313 EXPECT_CALL(*services[i], Stop());
314 }
315 EXPECT_CALL(manager_, DeregisterService(_)).Times(services.size());
316 provider_.DestroyAllServices();
317 EXPECT_TRUE(provider_.services_.empty());
318}
319
320TEST_F(WiMaxProviderTest, StopDeadServices) {
321 vector<scoped_refptr<MockWiMaxService> > services(4);
322 for (size_t i = 0; i < services.size(); i++) {
323 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200324 if (i == 0) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200325 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(false));
326 EXPECT_CALL(*services[i], GetNetworkObjectPath()).Times(0);
327 EXPECT_CALL(*services[i], Stop()).Times(0);
Darin Petkovc1e52732012-05-25 15:23:45 +0200328 } else {
329 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(true));
330 EXPECT_CALL(*services[i], GetNetworkObjectPath())
331 .WillOnce(Return(GetTestNetworkPath(100 + i)));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200332 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200333 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200334 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200335 services[3]->set_is_default(true);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200336 EXPECT_CALL(*services[1], Stop()).Times(0);
337 EXPECT_CALL(*services[2], Stop());
338 EXPECT_CALL(*services[3], Stop());
Darin Petkovc1e52732012-05-25 15:23:45 +0200339 EXPECT_CALL(manager_, DeregisterService(_));
Darin Petkovfc00fd42012-05-30 11:30:06 +0200340 provider_.networks_[GetTestNetworkPath(777)].id = "01234567";
341 provider_.networks_[GetTestNetworkPath(101)].id = "12345678";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200342 provider_.StopDeadServices();
Darin Petkovc1e52732012-05-25 15:23:45 +0200343 EXPECT_EQ(3, provider_.services_.size());
344 EXPECT_FALSE(ContainsKey(provider_.services_,
345 services[3]->GetStorageIdentifier()));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200346}
347
348TEST_F(WiMaxProviderTest, OnNetworksChanged) {
349 static const char kName[] = "Default Network";
350 const uint32 kIdentifier = 0xabcdef;
351 static const char kNetworkId[] = "00abcdef";
352
353 // Started service to be stopped.
354 scoped_refptr<MockWiMaxService> service0(
355 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
356 EXPECT_CALL(*service0, IsStarted()).WillOnce(Return(true));
357 EXPECT_CALL(*service0, GetNetworkObjectPath())
358 .WillOnce(Return(GetTestNetworkPath(100)));
359 EXPECT_CALL(*service0, Start(_)).Times(0);
360 EXPECT_CALL(*service0, Stop()).Times(1);
361 service0->set_network_id("1234");
Darin Petkovc1e52732012-05-25 15:23:45 +0200362 service0->InitStorageIdentifier();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200363
364 // Stopped service to be started.
365 scoped_refptr<MockWiMaxService> service1(
366 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
367 EXPECT_CALL(*service1, IsStarted()).Times(2).WillRepeatedly(Return(false));
368 EXPECT_CALL(*service1, Start(_)).WillOnce(Return(true));
369 EXPECT_CALL(*service1, Stop()).Times(0);
370 service1->set_network_id(kNetworkId);
371 service1->set_friendly_name(kName);
372 service1->InitStorageIdentifier();
373 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
374 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
375
Darin Petkovc1e52732012-05-25 15:23:45 +0200376 provider_.services_[service0->GetStorageIdentifier()] = service0;
377 provider_.services_[service1->GetStorageIdentifier()] = service1;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200378
379 for (int i = 0; i < 3; i++) {
380 scoped_refptr<MockWiMax> device(
381 new MockWiMax(&control_, NULL, &metrics_, &manager_,
382 GetTestLinkName(i), "", i, GetTestPath(i)));
383 provider_.devices_[GetTestLinkName(i)] = device;
384 if (i > 0) {
385 device->networks_.insert(GetTestNetworkPath(101));
386 }
387 }
388 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
389 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
390
Darin Petkovfc00fd42012-05-30 11:30:06 +0200391 provider_.networks_["/org/chromium/foo"].id = "foo";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200392 provider_.OnNetworksChanged();
393 EXPECT_EQ(1, provider_.networks_.size());
394 EXPECT_TRUE(ContainsKey(provider_.networks_, GetTestNetworkPath(101)));
395}
396
397TEST_F(WiMaxProviderTest, GetUniqueService) {
398 EXPECT_TRUE(provider_.services_.empty());
399
400 static const char kName0[] = "Test WiMAX Network";
401 static const char kName1[] = "Unknown Network";
402 static const char kNetworkId[] = "12340000";
403
404 // Service already exists.
405 scoped_refptr<MockWiMaxService> service0(
406 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
407 service0->set_network_id(kNetworkId);
408 service0->set_friendly_name(kName0);
409 service0->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200410 provider_.services_[service0->GetStorageIdentifier()] = service0;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200411 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
412 WiMaxServiceRefPtr service = provider_.GetUniqueService(kNetworkId, kName0);
413 ASSERT_TRUE(service);
414 EXPECT_EQ(service0.get(), service.get());
415 EXPECT_EQ(1, provider_.services_.size());
416
417 // Create a new service.
418 EXPECT_CALL(manager_, RegisterService(_));
419 service = provider_.GetUniqueService(kNetworkId, kName1);
420 ASSERT_TRUE(service);
421 EXPECT_NE(service0.get(), service.get());
422 EXPECT_EQ(2, provider_.services_.size());
423 EXPECT_EQ(WiMaxService::CreateStorageIdentifier(kNetworkId, kName1),
424 service->GetStorageIdentifier());
Darin Petkovc1e52732012-05-25 15:23:45 +0200425 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200426
427 // Service already exists -- it was just created.
428 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
429 WiMaxServiceRefPtr service1 = provider_.GetUniqueService(kNetworkId, kName1);
430 ASSERT_TRUE(service1);
431 EXPECT_EQ(service.get(), service1.get());
432 EXPECT_EQ(2, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200433 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200434}
435
Darin Petkovc63dcf02012-05-24 11:51:43 +0200436TEST_F(WiMaxProviderTest, CreateServicesFromProfile) {
437 ScopedTempDir temp_dir;
438 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
439 FilePath test_profile = temp_dir.path().Append("test-profile");
440 GLib glib;
441 KeyFileStore store(&glib);
442 store.set_path(test_profile);
443 static const char contents[] =
444 "[no_type]\n"
445 "Name=No Type Entry\n"
446 "\n"
447 "[no_wimax]\n"
448 "Type=vpn\n"
449 "\n"
450 "[wimax_network_01234567]\n"
451 "Name=network\n"
452 "Type=wimax\n"
453 "NetworkId=01234567\n"
454 "\n"
455 "[no_network_id]\n"
456 "Type=wimax\n"
457 "\n"
458 "[no_name]\n"
459 "Type=wimax\n"
460 "NetworkId=76543210\n";
461 EXPECT_EQ(strlen(contents),
462 file_util::WriteFile(test_profile, contents, strlen(contents)));
463 ASSERT_TRUE(store.Open());
464 scoped_refptr<MockProfile> profile(new MockProfile(&control_, &manager_));
465 EXPECT_CALL(*profile, GetConstStorage())
466 .Times(2)
467 .WillRepeatedly(Return(&store));
468 EXPECT_CALL(manager_, RegisterService(_));
469 EXPECT_CALL(*profile, ConfigureService(_)).WillOnce(Return(true));
470 provider_.CreateServicesFromProfile(profile);
471 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200472 WiMaxServiceRefPtr service = provider_.services_.begin()->second;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200473 EXPECT_EQ("wimax_network_01234567", service->GetStorageIdentifier());
474 provider_.CreateServicesFromProfile(profile);
475 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200476 EXPECT_EQ(service.get(), provider_.services_.begin()->second);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200477}
478
Darin Petkovd1cd7972012-05-22 15:26:15 +0200479TEST_F(WiMaxProviderTest, GetService) {
480 KeyValueStore args;
481 Error e;
482
Darin Petkovd1cd7972012-05-22 15:26:15 +0200483 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWimax);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200484
485 // No network id property.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200486 WiMaxServiceRefPtr service = provider_.GetService(args, &e);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200487 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200488 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200489
490 // No name property.
491 static const char kNetworkId[] = "1234abcd";
492 args.SetString(WiMaxService::kNetworkIdProperty, kNetworkId);
493 e.Reset();
494 service = provider_.GetService(args, &e);
495 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 // Service created and configured.
499 static const char kName[] = "Test WiMAX Network";
500 args.SetString(flimflam::kNameProperty, kName);
501 static const char kIdentity[] = "joe";
502 args.SetString(flimflam::kEapIdentityProperty, kIdentity);
503 EXPECT_CALL(manager_, RegisterService(_));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200504 e.Reset();
505 service = provider_.GetService(args, &e);
506 EXPECT_TRUE(e.IsSuccess());
507 ASSERT_TRUE(service);
508 EXPECT_EQ(kIdentity, service->eap().identity);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200509}
510
511TEST_F(WiMaxProviderTest, SelectCarrier) {
512 scoped_refptr<MockWiMaxService> service(
513 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
514 EXPECT_FALSE(provider_.SelectCarrier(service));
515 scoped_refptr<MockWiMax> device(
516 new MockWiMax(&control_, NULL, &metrics_, &manager_,
517 GetTestLinkName(1), "", 1, GetTestPath(1)));
518 provider_.devices_[GetTestLinkName(1)] = device;
519 WiMaxRefPtr carrier = provider_.SelectCarrier(service);
520 EXPECT_EQ(device.get(), carrier.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200521}
522
Darin Petkovc1e52732012-05-25 15:23:45 +0200523TEST_F(WiMaxProviderTest, OnServiceUnloaded) {
524 scoped_refptr<MockWiMaxService> service(
525 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
526 EXPECT_FALSE(service->is_default());
527 scoped_refptr<MockWiMaxService> service_default(
528 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
529 service_default->set_is_default(true);
530 provider_.services_[service->GetStorageIdentifier()] = service;
531 provider_.services_[service_default->GetStorageIdentifier()] =
532 service_default;
533 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
534 EXPECT_FALSE(provider_.OnServiceUnloaded(service_default));
535 EXPECT_EQ(2, provider_.services_.size());
536 EXPECT_TRUE(provider_.OnServiceUnloaded(service));
537 EXPECT_EQ(1, provider_.services_.size());
538 EXPECT_EQ(service_default.get(), provider_.services_.begin()->second.get());
539}
540
Darin Petkovb72b62e2012-05-15 16:55:36 +0200541} // namespace shill