blob: cf0b0c38cac68ed3e846c8c1511b7432a743233c [file] [log] [blame]
Jason Glasgowef965562012-04-10 16:12:35 -04001// 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/cellular_capability_universal.h"
6
Nathan Williams4b7c2a82012-04-13 15:19:47 -04007#include <string>
8#include <vector>
9
Jason Glasgowef965562012-04-10 16:12:35 -040010#include <base/bind.h>
Darin Petkova4ca3c32012-08-17 16:05:24 +020011#include <base/stringprintf.h>
Jason Glasgowef965562012-04-10 16:12:35 -040012#include <chromeos/dbus/service_constants.h>
13#include <gtest/gtest.h>
14#include <mobile_provider.h>
Ben Chan5c853ef2012-10-05 00:05:37 -070015#include <ModemManager/ModemManager.h>
Jason Glasgowef965562012-04-10 16:12:35 -040016
17#include "shill/cellular.h"
18#include "shill/cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040019#include "shill/dbus_adaptor.h"
Jason Glasgowef965562012-04-10 16:12:35 -040020#include "shill/error.h"
21#include "shill/event_dispatcher.h"
22#include "shill/mock_adaptors.h"
Jason Glasgow14521872012-05-07 19:12:15 -040023#include "shill/mock_cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040024#include "shill/mock_dbus_properties_proxy.h"
Jason Glasgowef965562012-04-10 16:12:35 -040025#include "shill/mock_glib.h"
26#include "shill/mock_manager.h"
27#include "shill/mock_metrics.h"
28#include "shill/mock_mm1_modem_modem3gpp_proxy.h"
29#include "shill/mock_mm1_modem_modemcdma_proxy.h"
30#include "shill/mock_mm1_modem_proxy.h"
31#include "shill/mock_mm1_modem_simple_proxy.h"
32#include "shill/mock_mm1_sim_proxy.h"
33#include "shill/mock_profile.h"
34#include "shill/mock_rtnl_handler.h"
35#include "shill/nice_mock_control.h"
36#include "shill/proxy_factory.h"
37
38using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020039using base::StringPrintf;
Jason Glasgowef965562012-04-10 16:12:35 -040040using base::Unretained;
41using std::string;
Nathan Williams4b7c2a82012-04-13 15:19:47 -040042using std::vector;
Jason Glasgowef965562012-04-10 16:12:35 -040043using testing::InSequence;
Gary Moraine285a842012-08-15 08:23:57 -070044using testing::Mock;
Jason Glasgowef965562012-04-10 16:12:35 -040045using testing::NiceMock;
46using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040047using testing::SaveArg;
Jason Glasgowef965562012-04-10 16:12:35 -040048using testing::_;
49
50namespace shill {
51
52MATCHER(IsSuccess, "") {
53 return arg.IsSuccess();
54}
55MATCHER(IsFailure, "") {
56 return arg.IsFailure();
57}
Jason Glasgow14521872012-05-07 19:12:15 -040058MATCHER_P(HasApn, expected_apn, "") {
59 string apn;
60 return (DBusProperties::GetString(arg,
61 CellularCapabilityUniversal::kConnectApn,
62 &apn) &&
63 apn == expected_apn);
64}
Jason Glasgowef965562012-04-10 16:12:35 -040065
66class CellularCapabilityUniversalTest : public testing::Test {
67 public:
68 CellularCapabilityUniversalTest()
69 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
Ben Chan3ecdf822012-08-06 12:29:23 -070070 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
71 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
72 modem_proxy_(new mm1::MockModemProxy()),
73 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
74 sim_proxy_(new mm1::MockSimProxy()),
75 properties_proxy_(new MockDBusPropertiesProxy()),
76 proxy_factory_(this),
77 capability_(NULL),
78 device_adaptor_(NULL),
79 provider_db_(NULL),
Jason Glasgowef965562012-04-10 16:12:35 -040080 cellular_(new Cellular(&control_,
81 &dispatcher_,
82 NULL,
83 &manager_,
84 "",
85 "",
86 0,
87 Cellular::kTypeUniversal,
88 "",
89 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040090 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070091 NULL,
Ben Chan62028b22012-11-05 11:20:02 -080092 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -070093 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -040094 service_(new MockCellularService(&control_,
95 &dispatcher_,
96 &metrics_,
97 &manager_,
Ben Chan3ecdf822012-08-06 12:29:23 -070098 cellular_)) {}
Jason Glasgowef965562012-04-10 16:12:35 -040099
100 virtual ~CellularCapabilityUniversalTest() {
101 cellular_->service_ = NULL;
102 capability_ = NULL;
103 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200104 if (provider_db_) {
105 mobile_provider_close_db(provider_db_);
106 provider_db_ = NULL;
107 }
Jason Glasgowef965562012-04-10 16:12:35 -0400108 }
109
110 virtual void SetUp() {
111 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
112 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400113 device_adaptor_ =
114 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400115 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400116 }
117
118 virtual void TearDown() {
119 capability_->proxy_factory_ = NULL;
120 }
121
Darin Petkova4ca3c32012-08-17 16:05:24 +0200122 void SetService() {
123 cellular_->service_ = new CellularService(
124 &control_, &dispatcher_, &metrics_, NULL, cellular_);
125 }
126
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400127 void InitProviderDB() {
128 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
129
130 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
131 ASSERT_TRUE(provider_db_);
132 cellular_->provider_db_ = provider_db_;
133 }
134
Jason Glasgowef965562012-04-10 16:12:35 -0400135 void InvokeEnable(bool enable, Error *error,
136 const ResultCallback &callback, int timeout) {
137 callback.Run(Error());
138 }
139 void InvokeEnableFail(bool enable, Error *error,
140 const ResultCallback &callback, int timeout) {
141 callback.Run(Error(Error::kOperationFailed));
142 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400143 void InvokeRegister(const string &operator_id, Error *error,
144 const ResultCallback &callback, int timeout) {
145 callback.Run(Error());
146 }
147
Gary Morainceba6aa2012-05-03 10:28:26 -0700148 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
149 int timeout) {
150 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
151 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400152 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
153 int timeout) {
154 error->Populate(Error::kOperationFailed);
155 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700156
157 void Set3gppProxy() {
158 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
159 }
160
Jason Glasgow14521872012-05-07 19:12:15 -0400161 void SetSimpleProxy() {
162 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
163 }
164
Thieu Le3d275392012-07-20 15:32:58 -0700165 void ReleaseCapabilityProxies() {
166 capability_->ReleaseProxies();
167 }
168
Jason Glasgowef965562012-04-10 16:12:35 -0400169 MOCK_METHOD1(TestCallback, void(const Error &error));
170
171 protected:
172 static const char kImei[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400173 static const char kSimPath[];
174 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400175
176 class TestProxyFactory : public ProxyFactory {
177 public:
178 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
179 test_(test) {}
180
181 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
182 const std::string &/* path */,
183 const std::string &/* service */) {
184 return test_->modem_3gpp_proxy_.release();
185 }
186
187 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
188 const std::string &/* path */,
189 const std::string &/* service */) {
190 return test_->modem_cdma_proxy_.release();
191 }
192
193 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
194 const std::string &/* path */,
195 const std::string &/* service */) {
196 return test_->modem_proxy_.release();
197 }
198
199 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
200 const std::string &/* path */,
201 const std::string &/* service */) {
202 return test_->modem_simple_proxy_.release();
203 }
204
205 virtual mm1::SimProxyInterface *CreateSimProxy(
206 const std::string &/* path */,
207 const std::string &/* service */) {
208 return test_->sim_proxy_.release();
209 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400210 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
211 const std::string &/* path */,
212 const std::string &/* service */) {
213 return test_->properties_proxy_.release();
214 }
Jason Glasgowef965562012-04-10 16:12:35 -0400215
216 private:
217 CellularCapabilityUniversalTest *test_;
218 };
219
220 NiceMockControl control_;
221 EventDispatcher dispatcher_;
222 MockMetrics metrics_;
223 MockGLib glib_;
224 MockManager manager_;
Jason Glasgowef965562012-04-10 16:12:35 -0400225 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
226 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
227 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
228 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
229 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400230 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400231 TestProxyFactory proxy_factory_;
232 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
233 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400234 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700235 CellularRefPtr cellular_;
236 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400237 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400238 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400239};
240
241const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Jason Glasgowaf583282012-04-18 15:18:22 -0400242const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
243const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
244 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
245 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400246
247TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400248 // Set up mock modem properties
249 DBusPropertiesMap modem_properties;
250 string operator_name = "TestOperator";
251 string operator_code = "001400";
252
253 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
254 writer().append_uint32(kAccessTechnologies);
255
256 ::DBus::Variant v;
257 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400258 ::DBus::Struct< uint32_t, bool > quality;
259 quality._1 = 90;
260 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400261 writer << quality;
262 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
263
264 // Set up mock modem 3gpp properties
265 DBusPropertiesMap modem3gpp_properties;
266 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
267 writer().append_uint32(0);
268 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
269 writer().append_string(kImei);
270
271 EXPECT_CALL(*modem_proxy_,
272 Enable(true, _, _, CellularCapability::kTimeoutEnable))
273 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
274 EXPECT_CALL(*properties_proxy_,
275 GetAll(MM_DBUS_INTERFACE_MODEM))
276 .WillOnce(Return(modem_properties));
277 EXPECT_CALL(*properties_proxy_,
278 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
279 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400280
Gary Moraine285a842012-08-15 08:23:57 -0700281 // Let the modem report that it is initializing. StartModem() should defer
282 // enabling the modem until its state changes to disabled.
283 EXPECT_CALL(*modem_proxy_, State())
284 .WillOnce(Return(Cellular::kModemStateInitializing));
285
Jason Glasgowef965562012-04-10 16:12:35 -0400286 // After setup we lose pointers to the proxies, so it is hard to set
287 // expectations.
288 SetUp();
289
290 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700291 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400292 ResultCallback callback =
293 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
294 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700295
296 // Verify that the modem has not been eabled.
297 EXPECT_TRUE(capability_->imei_.empty());
298 EXPECT_EQ(0, capability_->access_technologies_);
299 Mock::VerifyAndClearExpectations(this);
300
301 // Change the state to kModemStateDisabling and verify that it still has not
302 // been eabled.
303 EXPECT_CALL(*this, TestCallback(_)).Times(0);
304 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
305 Cellular::kModemStateDisabling, 0);
306 EXPECT_TRUE(capability_->imei_.empty());
307 EXPECT_EQ(0, capability_->access_technologies_);
308 Mock::VerifyAndClearExpectations(this);
309
310 // Change the state of the modem to disabled and verify that it gets enabled.
311 EXPECT_CALL(*this, TestCallback(IsSuccess()));
312 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
313 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400314 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400315 EXPECT_EQ(kImei, capability_->imei_);
316 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400317}
318
319TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700320 EXPECT_CALL(*modem_proxy_, State())
321 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400322 EXPECT_CALL(*modem_proxy_,
323 Enable(true, _, _, CellularCapability::kTimeoutEnable))
324 .WillOnce(
325 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
326 EXPECT_CALL(*this, TestCallback(IsFailure()));
327 ResultCallback callback =
328 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
329 SetUp();
330
331 Error error;
332 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700333 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400334}
335
Jason Glasgow02401cc2012-05-16 10:35:37 -0400336TEST_F(CellularCapabilityUniversalTest, StopModem) {
337 // Save pointers to proxies before they are lost by the call to InitProxies
338 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
339 SetUp();
340 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
341 capability_->InitProxies();
342
343 Error error;
344 ResultCallback callback =
345 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
346 capability_->StopModem(&error, callback);
347 EXPECT_TRUE(error.IsSuccess());
348
349 ResultCallback disable_callback;
350 EXPECT_CALL(*modem_proxy,
351 Enable(false, _, _, CellularCapability::kTimeoutEnable))
352 .WillOnce(SaveArg<2>(&disable_callback));
353 dispatcher_.DispatchPendingEvents();
354
355 EXPECT_CALL(*this, TestCallback(IsSuccess()));
356 disable_callback.Run(Error(Error::kSuccess));
357}
358
359TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
360 // Save pointers to proxies before they are lost by the call to InitProxies
361 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
362 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
363 SetUp();
364 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
365 capability_->InitProxies();
366
367 ResultCallback disconnect_callback;
368 Error error;
369 ResultCallback callback =
370 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
371 EXPECT_CALL(*modem_simple_proxy,
372 Disconnect(::DBus::Path("/"), _, _,
373 CellularCapability::kTimeoutDefault))
374 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700375 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400376 capability_->StopModem(&error, callback);
377 EXPECT_TRUE(error.IsSuccess());
378
379 ResultCallback disable_callback;
380 EXPECT_CALL(*modem_proxy,
381 Enable(false, _, _, CellularCapability::kTimeoutEnable))
382 .WillOnce(SaveArg<2>(&disable_callback));
383 disconnect_callback.Run(Error(Error::kSuccess));
384
385 EXPECT_CALL(*this, TestCallback(IsSuccess()));
386 disable_callback.Run(Error(Error::kSuccess));
387}
388
Thieu Le5d6864a2012-07-20 11:43:51 -0700389TEST_F(CellularCapabilityUniversalTest, DisconnectModemNoBearer) {
390 Error error;
391 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700392 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le5d6864a2012-07-20 11:43:51 -0700393 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
394 .Times(0);
395 capability_->Disconnect(&error, disconnect_callback);
396}
397
Thieu Le3d275392012-07-20 15:32:58 -0700398TEST_F(CellularCapabilityUniversalTest, DisconnectNoProxy) {
399 Error error;
400 ResultCallback disconnect_callback;
401 capability_->bearer_path_ = "/foo";
402 EXPECT_CALL(*modem_simple_proxy_,
403 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
404 .Times(0);
405 ReleaseCapabilityProxies();
406 capability_->Disconnect(&error, disconnect_callback);
407}
408
Jason Glasgowaf583282012-04-18 15:18:22 -0400409TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
410 // Set up mock modem properties
411 DBusPropertiesMap modem_properties;
412 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
413 writer().append_uint32(kAccessTechnologies);
414 modem_properties[MM_MODEM_PROPERTY_SIM].
415 writer().append_path(kSimPath);
416
417 // Set up mock modem 3gpp properties
418 DBusPropertiesMap modem3gpp_properties;
419 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
420 writer().append_uint32(0);
421 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
422 writer().append_string(kImei);
423
424 // Set up mock modem sim properties
425 DBusPropertiesMap sim_properties;
426
427 // After setup we lose pointers to the proxies, so it is hard to set
428 // expectations.
429 EXPECT_CALL(*properties_proxy_,
430 GetAll(MM_DBUS_INTERFACE_SIM))
431 .WillOnce(Return(sim_properties));
432
433 SetUp();
434
435 EXPECT_EQ("", capability_->imei_);
436 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
437 capability_->access_technologies_);
438 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400439 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
440 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400441 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
442 modem_properties, vector<string>());
443 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
444 EXPECT_EQ(kSimPath, capability_->sim_path_);
445 EXPECT_TRUE(capability_->sim_proxy_.get());
446
447 // Changing properties on wrong interface will not have an effect
448 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
449 modem3gpp_properties,
450 vector<string>());
451 EXPECT_EQ("", capability_->imei_);
452
453 // Changing properties on the right interface gets reflected in the
454 // capabilities object
455 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
456 modem3gpp_properties,
457 vector<string>());
458 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400459
460 // Expect to see changes when the family changes
461 modem_properties.clear();
462 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
463 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
464 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
465 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
466 Times(1);
467 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
468 modem_properties,
469 vector<string>());
470 // Back to LTE
471 modem_properties.clear();
472 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
473 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
474 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
475 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
476 Times(1);
477 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
478 modem_properties,
479 vector<string>());
480
481 // LTE & CDMA - the device adaptor should not be called!
482 modem_properties.clear();
483 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
484 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
485 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
486 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
487 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
488 modem_properties,
489 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400490}
491
Ben Chanbd3aee82012-10-16 23:52:04 -0700492TEST_F(CellularCapabilityUniversalTest, SimPathChanged) {
493 // Set up mock modem SIM properties
494 const char kImsi[] = "310100000001";
495 const char kSimIdentifier[] = "9999888";
496 const char kOperatorIdentifier[] = "310240";
497 const char kOperatorName[] = "Custom SPN";
498 DBusPropertiesMap sim_properties;
499 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
500 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
501 .append_string(kSimIdentifier);
502 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
503 .append_string(kOperatorIdentifier);
504 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
505 .append_string(kOperatorName);
506
507 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
508 .Times(1).WillOnce(Return(sim_properties));
509
510 EXPECT_FALSE(capability_->sim_present_);
511 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
512 EXPECT_EQ("", capability_->sim_path_);
513 EXPECT_EQ("", capability_->imsi_);
514 EXPECT_EQ("", capability_->sim_identifier_);
515 EXPECT_EQ("", capability_->operator_id_);
516 EXPECT_EQ("", capability_->spn_);
517
518 capability_->OnSimPathChanged(kSimPath);
519 EXPECT_TRUE(capability_->sim_present_);
520 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
521 EXPECT_EQ(kSimPath, capability_->sim_path_);
522 EXPECT_EQ(kImsi, capability_->imsi_);
523 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
524 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
525 EXPECT_EQ(kOperatorName, capability_->spn_);
526
527 // Changing to the same SIM path should be a no-op.
528 capability_->OnSimPathChanged(kSimPath);
529 EXPECT_TRUE(capability_->sim_present_);
530 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
531 EXPECT_EQ(kSimPath, capability_->sim_path_);
532 EXPECT_EQ(kImsi, capability_->imsi_);
533 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
534 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
535 EXPECT_EQ(kOperatorName, capability_->spn_);
536
537 capability_->OnSimPathChanged("");
538 EXPECT_FALSE(capability_->sim_present_);
539 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
540 EXPECT_EQ("", capability_->sim_path_);
541 EXPECT_EQ("", capability_->imsi_);
542 EXPECT_EQ("", capability_->sim_identifier_);
543 EXPECT_EQ("", capability_->operator_id_);
544 EXPECT_EQ("", capability_->spn_);
545}
546
Jason Glasgowaf583282012-04-18 15:18:22 -0400547TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
548 // Set up mock modem properties
549 DBusPropertiesMap modem_properties;
550 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
551
552 // Set up mock modem sim properties
553 const char kImsi[] = "310100000001";
554 DBusPropertiesMap sim_properties;
555 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
556
557 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
558 .WillOnce(Return(sim_properties));
559
560 // After setup we lose pointers to the proxies, so it is hard to set
561 // expectations.
562 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400563 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400564
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400565 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
566 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
567 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400568 EXPECT_FALSE(capability_->sim_proxy_.get());
569 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
570 modem_properties, vector<string>());
571 EXPECT_EQ(kSimPath, capability_->sim_path_);
572 EXPECT_TRUE(capability_->sim_proxy_.get());
573 EXPECT_EQ(kImsi, capability_->imsi_);
574
575 // Updating the SIM
576 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400577 const char kCountry[] = "us";
578 const char kCode[] = "310160";
579 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400580 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400581 const char kOperatorIdentifier[] = "310240";
582 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400583 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
584 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
585 append_string(kSimIdentifier);
586 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
587 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400588 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
589 new_properties,
590 vector<string>());
591 EXPECT_EQ(kNewImsi, capability_->imsi_);
592 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
593 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400594 EXPECT_EQ("", capability_->spn_);
595 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
596 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
597 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
598 EXPECT_EQ(4, capability_->apn_list_.size());
599
600 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
601 append_string(kOperatorName);
602 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
603 new_properties,
604 vector<string>());
605 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400606 EXPECT_EQ(kOperatorName, capability_->spn_);
607}
608
Gary Morainceba6aa2012-05-03 10:28:26 -0700609MATCHER_P(SizeIs, value, "") {
610 return static_cast<size_t>(value) == arg.size();
611}
612
613// Validates that OnScanReply does not crash with a null callback.
614TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
615 Error error;
616 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
617 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
618 EXPECT_CALL(*device_adaptor_,
619 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
620 SizeIs(0)));
621 Set3gppProxy();
622 capability_->Scan(&error, ResultCallback());
623 EXPECT_TRUE(error.IsSuccess());
624}
625
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400626// Validates that the scanning property is updated
627TEST_F(CellularCapabilityUniversalTest, Scan) {
628 Error error;
629
630 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
631 .WillRepeatedly(SaveArg<1>(&scan_callback_));
632 EXPECT_CALL(*device_adaptor_,
633 EmitBoolChanged(flimflam::kScanningProperty, true));
634 Set3gppProxy();
635 capability_->Scan(&error, ResultCallback());
636 EXPECT_TRUE(capability_->scanning_);
637
638 // Simulate the completion of the scan with 2 networks in the results.
639 EXPECT_CALL(*device_adaptor_,
640 EmitBoolChanged(flimflam::kScanningProperty, false));
641 EXPECT_CALL(*device_adaptor_,
642 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
643 SizeIs(2)));
644 vector<DBusPropertiesMap> results;
645 const char kScanID0[] = "testID0";
646 const char kScanID1[] = "testID1";
647 results.push_back(DBusPropertiesMap());
648 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
649 writer().append_string(kScanID0);
650 results.push_back(DBusPropertiesMap());
651 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
652 writer().append_string(kScanID1);
653 scan_callback_.Run(results, error);
654 EXPECT_FALSE(capability_->scanning_);
655
656 // Simulate the completion of the scan with no networks in the results.
657 EXPECT_CALL(*device_adaptor_,
658 EmitBoolChanged(flimflam::kScanningProperty, true));
659 capability_->Scan(&error, ResultCallback());
660 EXPECT_TRUE(capability_->scanning_);
661 EXPECT_CALL(*device_adaptor_,
662 EmitBoolChanged(flimflam::kScanningProperty, false));
663 EXPECT_CALL(*device_adaptor_,
664 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
665 SizeIs(0)));
666 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
667 EXPECT_FALSE(capability_->scanning_);
668}
669
670// Validates expected property updates when scan fails
671TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
672 Error error;
673
674 // Test immediate error
675 {
676 InSequence seq;
677 EXPECT_CALL(*modem_3gpp_proxy_,
678 Scan(_, _, CellularCapability::kTimeoutScan))
679 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
680 EXPECT_CALL(*modem_3gpp_proxy_,
681 Scan(_, _, CellularCapability::kTimeoutScan))
682 .WillOnce(SaveArg<1>(&scan_callback_));
683 }
684 Set3gppProxy();
685 capability_->Scan(&error, ResultCallback());
686 EXPECT_FALSE(capability_->scanning_);
687 EXPECT_TRUE(error.IsFailure());
688
689 // Initiate a scan
690 error.Populate(Error::kSuccess);
691 EXPECT_CALL(*device_adaptor_,
692 EmitBoolChanged(flimflam::kScanningProperty, true));
693 capability_->Scan(&error, ResultCallback());
694 EXPECT_TRUE(capability_->scanning_);
695 EXPECT_TRUE(error.IsSuccess());
696
697 // Validate that error is returned if Scan is called while already scanning.
698 capability_->Scan(&error, ResultCallback());
699 EXPECT_TRUE(capability_->scanning_);
700 EXPECT_TRUE(error.IsFailure());
701
702 // Validate that signals are emitted even if an error is reported.
703 capability_->found_networks_.clear();
704 capability_->found_networks_.push_back(Stringmap());
705 EXPECT_CALL(*device_adaptor_,
706 EmitBoolChanged(flimflam::kScanningProperty, false));
707 EXPECT_CALL(*device_adaptor_,
708 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
709 SizeIs(0)));
710 vector<DBusPropertiesMap> results;
711 scan_callback_.Run(results, Error(Error::kOperationFailed));
712 EXPECT_FALSE(capability_->scanning_);
713}
714
Jason Glasgow14521872012-05-07 19:12:15 -0400715// Validates expected behavior of Connect function
716TEST_F(CellularCapabilityUniversalTest, Connect) {
717 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
718 SetSimpleProxy();
719 Error error;
720 DBusPropertiesMap properties;
721 capability_->apn_try_list_.clear();
722 ResultCallback callback =
723 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
724 DBus::Path bearer("/foo");
725
726 // Test connect failures
727 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
728 .WillOnce(SaveArg<2>(&connect_callback_));
729 capability_->Connect(properties, &error, callback);
730 EXPECT_TRUE(error.IsSuccess());
731 EXPECT_CALL(*this, TestCallback(IsFailure()));
732 EXPECT_CALL(*service_, ClearLastGoodApn());
733 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
734
735 // Test connect success
736 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
737 .WillOnce(SaveArg<2>(&connect_callback_));
738 capability_->Connect(properties, &error, callback);
739 EXPECT_TRUE(error.IsSuccess());
740 EXPECT_CALL(*this, TestCallback(IsSuccess()));
741 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -0400742
743 // Test connect failures without a service. Make sure that shill
744 // does not crash if the connect failed and there is no
745 // CellularService object. This can happen if the modem is enabled
746 // and then quickly disabled.
747 cellular_->service_ = NULL;
748 EXPECT_FALSE(capability_->cellular()->service());
749 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
750 .WillOnce(SaveArg<2>(&connect_callback_));
751 capability_->Connect(properties, &error, callback);
752 EXPECT_TRUE(error.IsSuccess());
753 EXPECT_CALL(*this, TestCallback(IsFailure()));
754 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -0400755}
756
757// Validates Connect iterates over APNs
758TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
759 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
760 SetSimpleProxy();
761 Error error;
762 DBusPropertiesMap properties;
763 capability_->apn_try_list_.clear();
764 ResultCallback callback =
765 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
766 DBus::Path bearer("/bearer0");
767
768 const char apn_name_foo[] = "foo";
769 const char apn_name_bar[] = "bar";
770 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
771 .WillOnce(SaveArg<2>(&connect_callback_));
772 Stringmap apn1;
773 apn1[flimflam::kApnProperty] = apn_name_foo;
774 capability_->apn_try_list_.push_back(apn1);
775 Stringmap apn2;
776 apn2[flimflam::kApnProperty] = apn_name_bar;
777 capability_->apn_try_list_.push_back(apn2);
778 capability_->FillConnectPropertyMap(&properties);
779 capability_->Connect(properties, &error, callback);
780 EXPECT_TRUE(error.IsSuccess());
781
782 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
783 .WillOnce(SaveArg<2>(&connect_callback_));
784 EXPECT_CALL(*service_, ClearLastGoodApn());
785 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
786
787 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
788 EXPECT_CALL(*this, TestCallback(IsSuccess()));
789 connect_callback_.Run(bearer, Error(Error::kSuccess));
790}
791
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400792// Validates GetTypeString and AccessTechnologyToTechnologyFamily
793TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
794 const int gsm_technologies[] = {
795 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
796 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
797 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
798 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
799 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
800 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
801 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
802 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
803 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
804 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
805 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
806 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
807 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
808 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
809 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
810 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
811 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
812 };
Ben Chan62028b22012-11-05 11:20:02 -0800813 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400814 capability_->access_technologies_ = gsm_technologies[i];
815 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
816 }
817 const int cdma_technologies[] = {
818 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
819 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
820 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
821 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
822 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
823 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
824 };
Ben Chan62028b22012-11-05 11:20:02 -0800825 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400826 capability_->access_technologies_ = cdma_technologies[i];
827 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
828 }
829 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
830 ASSERT_EQ(capability_->GetTypeString(), "");
831}
832
Darin Petkovf508c822012-09-21 13:43:17 +0200833TEST_F(CellularCapabilityUniversalTest, AllowRoaming) {
834 EXPECT_FALSE(cellular_->allow_roaming_);
835 EXPECT_FALSE(capability_->provider_requires_roaming_);
836 EXPECT_FALSE(capability_->AllowRoaming());
837 capability_->provider_requires_roaming_ = true;
838 EXPECT_TRUE(capability_->AllowRoaming());
839 capability_->provider_requires_roaming_ = false;
840 cellular_->allow_roaming_ = true;
841 EXPECT_TRUE(capability_->AllowRoaming());
842}
843
Darin Petkovb4fccd22012-08-10 11:59:26 +0200844TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
845 static const char kTestCarrier[] = "The Cellular Carrier";
846 static const char kCountry[] = "us";
847 static const char kCode[] = "310160";
848 capability_->imsi_ = "310240123456789";
849
Darin Petkovf508c822012-09-21 13:43:17 +0200850 EXPECT_FALSE(capability_->home_provider_);
851 EXPECT_FALSE(capability_->provider_requires_roaming_);
852
Darin Petkovb4fccd22012-08-10 11:59:26 +0200853 capability_->SetHomeProvider(); // No mobile provider DB available.
854 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
855 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
856 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200857 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200858
859 InitProviderDB();
860 capability_->SetHomeProvider();
861 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
862 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
863 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
864 EXPECT_EQ(4, capability_->apn_list_.size());
865 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200866 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200867
868 Cellular::Operator oper;
869 cellular_->set_home_provider(oper);
870 capability_->spn_ = kTestCarrier;
871 capability_->SetHomeProvider();
872 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
873 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
874 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200875 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200876
877 static const char kCubic[] = "Cubic";
878 capability_->spn_ = kCubic;
879 capability_->SetHomeProvider();
880 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
881 EXPECT_EQ("", cellular_->home_provider().GetCode());
882 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200883 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200884
885 static const char kCUBIC[] = "CUBIC";
886 capability_->spn_ = kCUBIC;
887 capability_->home_provider_ = NULL;
888 capability_->SetHomeProvider();
889 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
890 EXPECT_EQ("", cellular_->home_provider().GetCode());
891 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200892 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200893}
894
Darin Petkova4ca3c32012-08-17 16:05:24 +0200895TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfo) {
896 static const char kOperatorName[] = "Swisscom";
897 InitProviderDB();
898 capability_->serving_operator_.SetCode("22801");
899 SetService();
900 capability_->UpdateOperatorInfo();
901 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
902 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
903 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
904
905 static const char kTestOperator[] = "Testcom";
906 capability_->serving_operator_.SetName(kTestOperator);
907 capability_->serving_operator_.SetCountry("");
908 capability_->UpdateOperatorInfo();
909 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
910 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
911 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
912}
913
914TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
915 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
916 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
917 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
918
919 capability_->serving_operator_.SetCode("1234");
920 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
921
922 static const char kHomeProvider[] = "The GSM Home Provider";
923 cellular_->home_provider_.SetName(kHomeProvider);
924 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
925 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
926 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
927
928 static const char kTestOperator[] = "A GSM Operator";
929 capability_->serving_operator_.SetName(kTestOperator);
930 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
931
932 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
933 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
934 capability_->CreateFriendlyServiceName());
935}
936
Jason Glasgowef965562012-04-10 16:12:35 -0400937} // namespace shill