blob: b528ad8e74d5a810e6769e4ab66e3f19f8ff9b1e [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 Petkov457728b2013-01-09 09:49:08 +010096 string GetServiceFriendlyName(const ServiceRefPtr &service) {
97 return service->friendly_name();
98 }
99
Darin Petkovb501ad22012-07-03 12:50:52 +0200100 scoped_ptr<MockWiMaxManagerProxy> wimax_manager_proxy_;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200101 scoped_ptr<MockWiMaxNetworkProxy> network_proxy_;
Darin Petkovb72b62e2012-05-15 16:55:36 +0200102 TestProxyFactory proxy_factory_;
103 NiceMockControl control_;
104 MockMetrics metrics_;
105 MockManager manager_;
Darin Petkove4b27022012-05-16 13:28:50 +0200106 MockDeviceInfo device_info_;
Darin Petkovb501ad22012-07-03 12:50:52 +0200107 MockDBusManager *dbus_manager_;
Darin Petkovb72b62e2012-05-15 16:55:36 +0200108 WiMaxProvider provider_;
109};
110
111TEST_F(WiMaxProviderTest, StartStop) {
Darin Petkovb501ad22012-07-03 12:50:52 +0200112 EXPECT_TRUE(provider_.on_wimax_manager_appear_.IsCancelled());
113 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
114 EXPECT_CALL(*dbus_manager_,
115 WatchName(wimax_manager::kWiMaxManagerServiceName, _, _));
Darin Petkovb72b62e2012-05-15 16:55:36 +0200116 provider_.Start();
Darin Petkovb501ad22012-07-03 12:50:52 +0200117 EXPECT_FALSE(provider_.on_wimax_manager_appear_.IsCancelled());
118 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200119 provider_.Start();
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()));
123 provider_.OnWiMaxManagerAppear(":0.11");
124 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();
Darin Petkovb501ad22012-07-03 12:50:52 +0200127 EXPECT_TRUE(provider_.on_wimax_manager_appear_.IsCancelled());
128 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();
131}
132
Darin Petkovb501ad22012-07-03 12:50:52 +0200133TEST_F(WiMaxProviderTest, ConnectDisconnectWiMaxManager) {
134 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
135 EXPECT_CALL(*wimax_manager_proxy_, set_devices_changed_callback(_)).Times(1);
136 EXPECT_CALL(*wimax_manager_proxy_, Devices(_))
137 .WillOnce(Return(RpcIdentifiers()));
138 provider_.ConnectToWiMaxManager();
139 EXPECT_TRUE(provider_.wimax_manager_proxy_.get());
140 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
141 provider_.DisconnectFromWiMaxManager();
142 EXPECT_FALSE(provider_.wimax_manager_proxy_.get());
143 EXPECT_TRUE(provider_.pending_devices_.empty());
144}
145
Darin Petkov9893d9c2012-05-17 15:27:31 -0700146TEST_F(WiMaxProviderTest, OnDevicesChanged) {
Darin Petkove4b27022012-05-16 13:28:50 +0200147 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
148
149 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
Darin Petkov9893d9c2012-05-17 15:27:31 -0700150 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200151 live_devices.push_back(GetTestPath(2));
152 live_devices.push_back(GetTestPath(3));
153 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(2))).WillOnce(Return(-1));
154 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(3))).WillOnce(Return(-1));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700155 provider_.OnDevicesChanged(live_devices);
Darin Petkove4b27022012-05-16 13:28:50 +0200156 ASSERT_EQ(2, provider_.pending_devices_.size());
157 EXPECT_EQ(GetTestPath(2), provider_.pending_devices_[GetTestLinkName(2)]);
158 EXPECT_EQ(GetTestPath(3), provider_.pending_devices_[GetTestLinkName(3)]);
159}
160
161TEST_F(WiMaxProviderTest, OnDeviceInfoAvailable) {
162 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
163
164 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
165 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
166 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
167 EXPECT_CALL(device_info_, RegisterDevice(_));
168 provider_.OnDeviceInfoAvailable(GetTestLinkName(1));
169 EXPECT_TRUE(provider_.pending_devices_.empty());
170 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200171 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
172 EXPECT_EQ(GetTestLinkName(1),
173 provider_.devices_[GetTestLinkName(1)]->link_name());
Darin Petkove4b27022012-05-16 13:28:50 +0200174}
175
Darin Petkove4b27022012-05-16 13:28:50 +0200176TEST_F(WiMaxProviderTest, CreateDevice) {
177 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
178
179 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(-1));
180 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
181 EXPECT_TRUE(provider_.devices_.empty());
182 ASSERT_EQ(1, provider_.pending_devices_.size());
183 EXPECT_EQ(GetTestPath(1), provider_.pending_devices_[GetTestLinkName(1)]);
184
185 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
186 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
187 EXPECT_CALL(device_info_, RegisterDevice(_));
188 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
189 EXPECT_TRUE(provider_.pending_devices_.empty());
190 ASSERT_EQ(1, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200191 ASSERT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(1)));
192 EXPECT_EQ(GetTestLinkName(1),
193 provider_.devices_[GetTestLinkName(1)]->link_name());
194
195 WiMax *device = provider_.devices_[GetTestLinkName(1)].get();
196 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
197 EXPECT_EQ(device, provider_.devices_[GetTestLinkName(1)].get());
Darin Petkove4b27022012-05-16 13:28:50 +0200198}
199
200TEST_F(WiMaxProviderTest, DestroyDeadDevices) {
201 for (int i = 0; i < 4; i++) {
Darin Petkovb96a4512012-06-04 11:02:49 +0200202 scoped_refptr<MockWiMax> device(
Darin Petkovc63dcf02012-05-24 11:51:43 +0200203 new MockWiMax(&control_, NULL, &metrics_, &manager_,
Darin Petkovb96a4512012-06-04 11:02:49 +0200204 GetTestLinkName(i), "", i, GetTestPath(i)));
205 EXPECT_CALL(*device, OnDeviceVanished()).Times((i == 0 || i == 3) ? 0 : 1);
206 provider_.devices_[GetTestLinkName(i)] = device;
Darin Petkove4b27022012-05-16 13:28:50 +0200207 }
208 for (int i = 4; i < 8; i++) {
209 provider_.pending_devices_[GetTestLinkName(i)] = GetTestPath(i);
210 }
Darin Petkov9893d9c2012-05-17 15:27:31 -0700211 RpcIdentifiers live_devices;
Darin Petkove4b27022012-05-16 13:28:50 +0200212 live_devices.push_back(GetTestPath(0));
213 live_devices.push_back(GetTestPath(3));
214 live_devices.push_back(GetTestPath(4));
215 live_devices.push_back(GetTestPath(7));
216 live_devices.push_back(GetTestPath(123));
217 EXPECT_CALL(manager_, device_info())
218 .Times(2)
219 .WillRepeatedly(Return(&device_info_));
220 EXPECT_CALL(device_info_, DeregisterDevice(_)).Times(2);
221 provider_.DestroyDeadDevices(live_devices);
222 ASSERT_EQ(2, provider_.devices_.size());
Darin Petkov0fcd3462012-05-17 11:25:11 +0200223 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(0)));
224 EXPECT_TRUE(ContainsKey(provider_.devices_, GetTestLinkName(3)));
Darin Petkove4b27022012-05-16 13:28:50 +0200225 EXPECT_EQ(2, provider_.pending_devices_.size());
226 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(4)));
227 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(7)));
228}
229
230TEST_F(WiMaxProviderTest, GetLinkName) {
231 EXPECT_EQ("", provider_.GetLinkName("/random/path"));
232 EXPECT_EQ(GetTestLinkName(1), provider_.GetLinkName(GetTestPath(1)));
233}
234
Darin Petkovfc00fd42012-05-30 11:30:06 +0200235TEST_F(WiMaxProviderTest, RetrieveNetworkInfo) {
236 static const char kName[] = "Default Network";
237 const uint32 kIdentifier = 0xabcdef;
238 static const char kNetworkId[] = "00abcdef";
239 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
240 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
241 provider_.RetrieveNetworkInfo(GetTestNetworkPath(kIdentifier));
242 EXPECT_EQ(1, provider_.networks_.size());
243 EXPECT_TRUE(ContainsKey(provider_.networks_,
244 GetTestNetworkPath(kIdentifier)));
245 EXPECT_EQ(kName,
246 provider_.networks_[GetTestNetworkPath(kIdentifier)].name);
247 EXPECT_EQ(kNetworkId,
248 provider_.networks_[GetTestNetworkPath(kIdentifier)].id);
249 provider_.RetrieveNetworkInfo(GetTestNetworkPath(kIdentifier));
250 EXPECT_EQ(1, provider_.networks_.size());
251}
252
Darin Petkovc63dcf02012-05-24 11:51:43 +0200253TEST_F(WiMaxProviderTest, FindService) {
254 EXPECT_FALSE(provider_.FindService("some_storage_id"));
255 scoped_refptr<MockWiMaxService> service(
256 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
257 static const char kName[] = "WiMAX Network";
258 static const char kNetworkId[] = "76543210";
259 service->set_friendly_name(kName);
260 service->set_network_id(kNetworkId);
261 service->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200262 provider_.services_[service->GetStorageIdentifier()] = service;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200263 EXPECT_EQ(service.get(),
264 provider_.FindService(
265 WiMaxService::CreateStorageIdentifier(kNetworkId,
266 kName)).get());
267 EXPECT_FALSE(provider_.FindService("some_storage_id"));
268}
269
Darin Petkovfc00fd42012-05-30 11:30:06 +0200270TEST_F(WiMaxProviderTest, StartLiveServices) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200271 const uint32 kIdentifier = 0x1234567;
272 static const char kNetworkId[] = "01234567";
273 static const char kName[] = "Some WiMAX Provider";
274 vector<scoped_refptr<MockWiMaxService> > services(4);
275 for (size_t i = 0; i < services.size(); i++) {
276 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200277 if (i == 0) {
278 services[0]->set_network_id("deadbeef");
279 } else {
280 services[i]->set_network_id(kNetworkId);
281 }
282 // Make services[3] the default service.
283 if (i == 3) {
284 services[i]->set_friendly_name(kName);
285 } else {
286 services[i]->set_friendly_name(
287 base::StringPrintf("Configured %d", static_cast<int>(i)));
288 }
289 services[i]->InitStorageIdentifier();
290 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200291 }
Darin Petkovfc00fd42012-05-30 11:30:06 +0200292 WiMaxProvider::NetworkInfo info;
293 info.id = kNetworkId;
294 info.name = kName;
295 provider_.networks_[GetTestNetworkPath(kIdentifier)] = info;
296 network_proxy_.reset();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200297 EXPECT_CALL(*services[0], IsStarted()).Times(0);
298 EXPECT_CALL(*services[1], IsStarted()).WillOnce(Return(true));
299 EXPECT_CALL(*services[1], Start(_)).Times(0);
300 EXPECT_CALL(*services[2], IsStarted()).WillOnce(Return(false));
301 EXPECT_CALL(*services[2], Start(_)).WillOnce(Return(true));
302 EXPECT_CALL(*services[3], IsStarted()).WillOnce(Return(false));
303 EXPECT_CALL(*services[3], Start(_)).WillOnce(Return(false));
304 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
Darin Petkovfc00fd42012-05-30 11:30:06 +0200305 provider_.StartLiveServices();
306 EXPECT_FALSE(services[0]->is_default());
307 EXPECT_FALSE(services[1]->is_default());
308 EXPECT_FALSE(services[2]->is_default());
309 EXPECT_TRUE(services[3]->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200310}
311
312TEST_F(WiMaxProviderTest, DestroyAllServices) {
313 vector<scoped_refptr<MockWiMaxService> > services(2);
314 for (size_t i = 0; i < services.size(); i++) {
315 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200316 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200317 EXPECT_CALL(*services[i], Stop());
318 }
319 EXPECT_CALL(manager_, DeregisterService(_)).Times(services.size());
320 provider_.DestroyAllServices();
321 EXPECT_TRUE(provider_.services_.empty());
322}
323
324TEST_F(WiMaxProviderTest, StopDeadServices) {
325 vector<scoped_refptr<MockWiMaxService> > services(4);
326 for (size_t i = 0; i < services.size(); i++) {
327 services[i] = new MockWiMaxService(&control_, NULL, &metrics_, &manager_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200328 if (i == 0) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200329 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(false));
330 EXPECT_CALL(*services[i], GetNetworkObjectPath()).Times(0);
331 EXPECT_CALL(*services[i], Stop()).Times(0);
Darin Petkovc1e52732012-05-25 15:23:45 +0200332 } else {
333 EXPECT_CALL(*services[i], IsStarted()).WillOnce(Return(true));
334 EXPECT_CALL(*services[i], GetNetworkObjectPath())
335 .WillOnce(Return(GetTestNetworkPath(100 + i)));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200336 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200337 provider_.services_[services[i]->GetStorageIdentifier()] = services[i];
Darin Petkovc63dcf02012-05-24 11:51:43 +0200338 }
Darin Petkovc1e52732012-05-25 15:23:45 +0200339 services[3]->set_is_default(true);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200340 EXPECT_CALL(*services[1], Stop()).Times(0);
341 EXPECT_CALL(*services[2], Stop());
342 EXPECT_CALL(*services[3], Stop());
Darin Petkovc1e52732012-05-25 15:23:45 +0200343 EXPECT_CALL(manager_, DeregisterService(_));
Darin Petkovfc00fd42012-05-30 11:30:06 +0200344 provider_.networks_[GetTestNetworkPath(777)].id = "01234567";
345 provider_.networks_[GetTestNetworkPath(101)].id = "12345678";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200346 provider_.StopDeadServices();
Darin Petkovc1e52732012-05-25 15:23:45 +0200347 EXPECT_EQ(3, provider_.services_.size());
348 EXPECT_FALSE(ContainsKey(provider_.services_,
349 services[3]->GetStorageIdentifier()));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200350}
351
352TEST_F(WiMaxProviderTest, OnNetworksChanged) {
353 static const char kName[] = "Default Network";
354 const uint32 kIdentifier = 0xabcdef;
355 static const char kNetworkId[] = "00abcdef";
356
357 // Started service to be stopped.
358 scoped_refptr<MockWiMaxService> service0(
359 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
360 EXPECT_CALL(*service0, IsStarted()).WillOnce(Return(true));
361 EXPECT_CALL(*service0, GetNetworkObjectPath())
362 .WillOnce(Return(GetTestNetworkPath(100)));
363 EXPECT_CALL(*service0, Start(_)).Times(0);
364 EXPECT_CALL(*service0, Stop()).Times(1);
365 service0->set_network_id("1234");
Darin Petkovc1e52732012-05-25 15:23:45 +0200366 service0->InitStorageIdentifier();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200367
368 // Stopped service to be started.
369 scoped_refptr<MockWiMaxService> service1(
370 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
371 EXPECT_CALL(*service1, IsStarted()).Times(2).WillRepeatedly(Return(false));
372 EXPECT_CALL(*service1, Start(_)).WillOnce(Return(true));
373 EXPECT_CALL(*service1, Stop()).Times(0);
374 service1->set_network_id(kNetworkId);
375 service1->set_friendly_name(kName);
376 service1->InitStorageIdentifier();
377 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kName));
378 EXPECT_CALL(*network_proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
379
Darin Petkovc1e52732012-05-25 15:23:45 +0200380 provider_.services_[service0->GetStorageIdentifier()] = service0;
381 provider_.services_[service1->GetStorageIdentifier()] = service1;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200382
383 for (int i = 0; i < 3; i++) {
384 scoped_refptr<MockWiMax> device(
385 new MockWiMax(&control_, NULL, &metrics_, &manager_,
386 GetTestLinkName(i), "", i, GetTestPath(i)));
387 provider_.devices_[GetTestLinkName(i)] = device;
388 if (i > 0) {
389 device->networks_.insert(GetTestNetworkPath(101));
390 }
391 }
392 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
393 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
394
Darin Petkovfc00fd42012-05-30 11:30:06 +0200395 provider_.networks_["/org/chromium/foo"].id = "foo";
Darin Petkovc63dcf02012-05-24 11:51:43 +0200396 provider_.OnNetworksChanged();
397 EXPECT_EQ(1, provider_.networks_.size());
398 EXPECT_TRUE(ContainsKey(provider_.networks_, GetTestNetworkPath(101)));
399}
400
401TEST_F(WiMaxProviderTest, GetUniqueService) {
402 EXPECT_TRUE(provider_.services_.empty());
403
404 static const char kName0[] = "Test WiMAX Network";
405 static const char kName1[] = "Unknown Network";
406 static const char kNetworkId[] = "12340000";
407
408 // Service already exists.
409 scoped_refptr<MockWiMaxService> service0(
410 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
411 service0->set_network_id(kNetworkId);
412 service0->set_friendly_name(kName0);
413 service0->InitStorageIdentifier();
Darin Petkovc1e52732012-05-25 15:23:45 +0200414 provider_.services_[service0->GetStorageIdentifier()] = service0;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200415 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
416 WiMaxServiceRefPtr service = provider_.GetUniqueService(kNetworkId, kName0);
417 ASSERT_TRUE(service);
418 EXPECT_EQ(service0.get(), service.get());
419 EXPECT_EQ(1, provider_.services_.size());
420
421 // Create a new service.
422 EXPECT_CALL(manager_, RegisterService(_));
423 service = provider_.GetUniqueService(kNetworkId, kName1);
424 ASSERT_TRUE(service);
425 EXPECT_NE(service0.get(), service.get());
426 EXPECT_EQ(2, provider_.services_.size());
427 EXPECT_EQ(WiMaxService::CreateStorageIdentifier(kNetworkId, kName1),
428 service->GetStorageIdentifier());
Darin Petkovc1e52732012-05-25 15:23:45 +0200429 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200430
431 // Service already exists -- it was just created.
432 EXPECT_CALL(manager_, RegisterService(_)).Times(0);
433 WiMaxServiceRefPtr service1 = provider_.GetUniqueService(kNetworkId, kName1);
434 ASSERT_TRUE(service1);
435 EXPECT_EQ(service.get(), service1.get());
436 EXPECT_EQ(2, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200437 EXPECT_FALSE(service->is_default());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200438}
439
Darin Petkovc63dcf02012-05-24 11:51:43 +0200440TEST_F(WiMaxProviderTest, CreateServicesFromProfile) {
441 ScopedTempDir temp_dir;
442 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
443 FilePath test_profile = temp_dir.path().Append("test-profile");
444 GLib glib;
445 KeyFileStore store(&glib);
446 store.set_path(test_profile);
447 static const char contents[] =
448 "[no_type]\n"
449 "Name=No Type Entry\n"
450 "\n"
451 "[no_wimax]\n"
452 "Type=vpn\n"
453 "\n"
454 "[wimax_network_01234567]\n"
455 "Name=network\n"
456 "Type=wimax\n"
457 "NetworkId=01234567\n"
458 "\n"
459 "[no_network_id]\n"
460 "Type=wimax\n"
461 "\n"
462 "[no_name]\n"
463 "Type=wimax\n"
464 "NetworkId=76543210\n";
465 EXPECT_EQ(strlen(contents),
466 file_util::WriteFile(test_profile, contents, strlen(contents)));
467 ASSERT_TRUE(store.Open());
468 scoped_refptr<MockProfile> profile(new MockProfile(&control_, &manager_));
469 EXPECT_CALL(*profile, GetConstStorage())
470 .Times(2)
471 .WillRepeatedly(Return(&store));
472 EXPECT_CALL(manager_, RegisterService(_));
473 EXPECT_CALL(*profile, ConfigureService(_)).WillOnce(Return(true));
474 provider_.CreateServicesFromProfile(profile);
475 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200476 WiMaxServiceRefPtr service = provider_.services_.begin()->second;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200477 EXPECT_EQ("wimax_network_01234567", service->GetStorageIdentifier());
478 provider_.CreateServicesFromProfile(profile);
479 ASSERT_EQ(1, provider_.services_.size());
Darin Petkovc1e52732012-05-25 15:23:45 +0200480 EXPECT_EQ(service.get(), provider_.services_.begin()->second);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200481}
482
Darin Petkovd1cd7972012-05-22 15:26:15 +0200483TEST_F(WiMaxProviderTest, GetService) {
484 KeyValueStore args;
485 Error e;
486
Darin Petkovd1cd7972012-05-22 15:26:15 +0200487 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWimax);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200488
489 // No network id property.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200490 WiMaxServiceRefPtr service = provider_.GetService(args, &e);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200491 EXPECT_EQ(Error::kInvalidArguments, e.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200492 EXPECT_FALSE(service);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200493
494 // No name property.
495 static const char kNetworkId[] = "1234abcd";
496 args.SetString(WiMaxService::kNetworkIdProperty, kNetworkId);
497 e.Reset();
498 service = provider_.GetService(args, &e);
499 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 // Service created and configured.
503 static const char kName[] = "Test WiMAX Network";
504 args.SetString(flimflam::kNameProperty, kName);
505 static const char kIdentity[] = "joe";
506 args.SetString(flimflam::kEapIdentityProperty, kIdentity);
507 EXPECT_CALL(manager_, RegisterService(_));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200508 e.Reset();
509 service = provider_.GetService(args, &e);
510 EXPECT_TRUE(e.IsSuccess());
511 ASSERT_TRUE(service);
Paul Stewart2c575d22012-12-07 12:28:57 -0800512
513 // GetService should create a service with only identifying parameters set.
Darin Petkov457728b2013-01-09 09:49:08 +0100514 EXPECT_EQ(kName, GetServiceFriendlyName(service));
Paul Stewart2c575d22012-12-07 12:28:57 -0800515 EXPECT_EQ("", service->eap().identity);
516
517 // After configuring the service, other parameters should be set.
518 service->Configure(args, &e);
519 EXPECT_TRUE(e.IsSuccess());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200520 EXPECT_EQ(kIdentity, service->eap().identity);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200521}
522
523TEST_F(WiMaxProviderTest, SelectCarrier) {
524 scoped_refptr<MockWiMaxService> service(
525 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
526 EXPECT_FALSE(provider_.SelectCarrier(service));
527 scoped_refptr<MockWiMax> device(
528 new MockWiMax(&control_, NULL, &metrics_, &manager_,
529 GetTestLinkName(1), "", 1, GetTestPath(1)));
530 provider_.devices_[GetTestLinkName(1)] = device;
531 WiMaxRefPtr carrier = provider_.SelectCarrier(service);
532 EXPECT_EQ(device.get(), carrier.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200533}
534
Darin Petkovc1e52732012-05-25 15:23:45 +0200535TEST_F(WiMaxProviderTest, OnServiceUnloaded) {
536 scoped_refptr<MockWiMaxService> service(
537 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
538 EXPECT_FALSE(service->is_default());
539 scoped_refptr<MockWiMaxService> service_default(
540 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
541 service_default->set_is_default(true);
542 provider_.services_[service->GetStorageIdentifier()] = service;
543 provider_.services_[service_default->GetStorageIdentifier()] =
544 service_default;
545 EXPECT_CALL(manager_, DeregisterService(_)).Times(0);
546 EXPECT_FALSE(provider_.OnServiceUnloaded(service_default));
547 EXPECT_EQ(2, provider_.services_.size());
548 EXPECT_TRUE(provider_.OnServiceUnloaded(service));
549 EXPECT_EQ(1, provider_.services_.size());
550 EXPECT_EQ(service_default.get(), provider_.services_.begin()->second.get());
551}
552
Darin Petkovb72b62e2012-05-15 16:55:36 +0200553} // namespace shill