blob: 5f0cc2e515b54f5177171444827e0b54784a463a [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 Chanf6120e92012-06-28 18:56:17 -070015#include <ModemManager/ModemManager-names.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,
92 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -040093 service_(new MockCellularService(&control_,
94 &dispatcher_,
95 &metrics_,
96 &manager_,
Ben Chan3ecdf822012-08-06 12:29:23 -070097 cellular_)) {}
Jason Glasgowef965562012-04-10 16:12:35 -040098
99 virtual ~CellularCapabilityUniversalTest() {
100 cellular_->service_ = NULL;
101 capability_ = NULL;
102 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200103 if (provider_db_) {
104 mobile_provider_close_db(provider_db_);
105 provider_db_ = NULL;
106 }
Jason Glasgowef965562012-04-10 16:12:35 -0400107 }
108
109 virtual void SetUp() {
110 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
111 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400112 device_adaptor_ =
113 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400114 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400115 }
116
117 virtual void TearDown() {
118 capability_->proxy_factory_ = NULL;
119 }
120
Darin Petkova4ca3c32012-08-17 16:05:24 +0200121 void SetService() {
122 cellular_->service_ = new CellularService(
123 &control_, &dispatcher_, &metrics_, NULL, cellular_);
124 }
125
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400126 void InitProviderDB() {
127 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
128
129 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
130 ASSERT_TRUE(provider_db_);
131 cellular_->provider_db_ = provider_db_;
132 }
133
Jason Glasgowef965562012-04-10 16:12:35 -0400134 void InvokeEnable(bool enable, Error *error,
135 const ResultCallback &callback, int timeout) {
136 callback.Run(Error());
137 }
138 void InvokeEnableFail(bool enable, Error *error,
139 const ResultCallback &callback, int timeout) {
140 callback.Run(Error(Error::kOperationFailed));
141 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400142 void InvokeRegister(const string &operator_id, Error *error,
143 const ResultCallback &callback, int timeout) {
144 callback.Run(Error());
145 }
146
Gary Morainceba6aa2012-05-03 10:28:26 -0700147 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
148 int timeout) {
149 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
150 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400151 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
152 int timeout) {
153 error->Populate(Error::kOperationFailed);
154 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700155
156 void Set3gppProxy() {
157 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
158 }
159
Jason Glasgow14521872012-05-07 19:12:15 -0400160 void SetSimpleProxy() {
161 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
162 }
163
Thieu Le3d275392012-07-20 15:32:58 -0700164 void ReleaseCapabilityProxies() {
165 capability_->ReleaseProxies();
166 }
167
Jason Glasgowef965562012-04-10 16:12:35 -0400168 MOCK_METHOD1(TestCallback, void(const Error &error));
169
170 protected:
171 static const char kImei[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400172 static const char kSimPath[];
173 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400174
175 class TestProxyFactory : public ProxyFactory {
176 public:
177 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
178 test_(test) {}
179
180 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
181 const std::string &/* path */,
182 const std::string &/* service */) {
183 return test_->modem_3gpp_proxy_.release();
184 }
185
186 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
187 const std::string &/* path */,
188 const std::string &/* service */) {
189 return test_->modem_cdma_proxy_.release();
190 }
191
192 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
193 const std::string &/* path */,
194 const std::string &/* service */) {
195 return test_->modem_proxy_.release();
196 }
197
198 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
199 const std::string &/* path */,
200 const std::string &/* service */) {
201 return test_->modem_simple_proxy_.release();
202 }
203
204 virtual mm1::SimProxyInterface *CreateSimProxy(
205 const std::string &/* path */,
206 const std::string &/* service */) {
207 return test_->sim_proxy_.release();
208 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400209 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
210 const std::string &/* path */,
211 const std::string &/* service */) {
212 return test_->properties_proxy_.release();
213 }
Jason Glasgowef965562012-04-10 16:12:35 -0400214
215 private:
216 CellularCapabilityUniversalTest *test_;
217 };
218
219 NiceMockControl control_;
220 EventDispatcher dispatcher_;
221 MockMetrics metrics_;
222 MockGLib glib_;
223 MockManager manager_;
Jason Glasgowef965562012-04-10 16:12:35 -0400224 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
225 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
226 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
227 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
228 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400229 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400230 TestProxyFactory proxy_factory_;
231 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
232 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400233 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700234 CellularRefPtr cellular_;
235 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400236 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400237 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400238};
239
240const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Jason Glasgowaf583282012-04-18 15:18:22 -0400241const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
242const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
243 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
244 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400245
246TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400247 // Set up mock modem properties
248 DBusPropertiesMap modem_properties;
249 string operator_name = "TestOperator";
250 string operator_code = "001400";
251
252 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
253 writer().append_uint32(kAccessTechnologies);
254
255 ::DBus::Variant v;
256 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400257 ::DBus::Struct< uint32_t, bool > quality;
258 quality._1 = 90;
259 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400260 writer << quality;
261 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
262
263 // Set up mock modem 3gpp properties
264 DBusPropertiesMap modem3gpp_properties;
265 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
266 writer().append_uint32(0);
267 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
268 writer().append_string(kImei);
269
270 EXPECT_CALL(*modem_proxy_,
271 Enable(true, _, _, CellularCapability::kTimeoutEnable))
272 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
273 EXPECT_CALL(*properties_proxy_,
274 GetAll(MM_DBUS_INTERFACE_MODEM))
275 .WillOnce(Return(modem_properties));
276 EXPECT_CALL(*properties_proxy_,
277 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
278 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400279
Gary Moraine285a842012-08-15 08:23:57 -0700280 // Let the modem report that it is initializing. StartModem() should defer
281 // enabling the modem until its state changes to disabled.
282 EXPECT_CALL(*modem_proxy_, State())
283 .WillOnce(Return(Cellular::kModemStateInitializing));
284
Jason Glasgowef965562012-04-10 16:12:35 -0400285 // After setup we lose pointers to the proxies, so it is hard to set
286 // expectations.
287 SetUp();
288
289 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700290 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400291 ResultCallback callback =
292 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
293 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700294
295 // Verify that the modem has not been eabled.
296 EXPECT_TRUE(capability_->imei_.empty());
297 EXPECT_EQ(0, capability_->access_technologies_);
298 Mock::VerifyAndClearExpectations(this);
299
300 // Change the state to kModemStateDisabling and verify that it still has not
301 // been eabled.
302 EXPECT_CALL(*this, TestCallback(_)).Times(0);
303 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
304 Cellular::kModemStateDisabling, 0);
305 EXPECT_TRUE(capability_->imei_.empty());
306 EXPECT_EQ(0, capability_->access_technologies_);
307 Mock::VerifyAndClearExpectations(this);
308
309 // Change the state of the modem to disabled and verify that it gets enabled.
310 EXPECT_CALL(*this, TestCallback(IsSuccess()));
311 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
312 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400313 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400314 EXPECT_EQ(kImei, capability_->imei_);
315 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400316}
317
318TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700319 EXPECT_CALL(*modem_proxy_, State())
320 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400321 EXPECT_CALL(*modem_proxy_,
322 Enable(true, _, _, CellularCapability::kTimeoutEnable))
323 .WillOnce(
324 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
325 EXPECT_CALL(*this, TestCallback(IsFailure()));
326 ResultCallback callback =
327 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
328 SetUp();
329
330 Error error;
331 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700332 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400333}
334
Jason Glasgow02401cc2012-05-16 10:35:37 -0400335TEST_F(CellularCapabilityUniversalTest, StopModem) {
336 // Save pointers to proxies before they are lost by the call to InitProxies
337 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
338 SetUp();
339 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
340 capability_->InitProxies();
341
342 Error error;
343 ResultCallback callback =
344 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
345 capability_->StopModem(&error, callback);
346 EXPECT_TRUE(error.IsSuccess());
347
348 ResultCallback disable_callback;
349 EXPECT_CALL(*modem_proxy,
350 Enable(false, _, _, CellularCapability::kTimeoutEnable))
351 .WillOnce(SaveArg<2>(&disable_callback));
352 dispatcher_.DispatchPendingEvents();
353
354 EXPECT_CALL(*this, TestCallback(IsSuccess()));
355 disable_callback.Run(Error(Error::kSuccess));
356}
357
358TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
359 // Save pointers to proxies before they are lost by the call to InitProxies
360 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
361 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
362 SetUp();
363 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
364 capability_->InitProxies();
365
366 ResultCallback disconnect_callback;
367 Error error;
368 ResultCallback callback =
369 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
370 EXPECT_CALL(*modem_simple_proxy,
371 Disconnect(::DBus::Path("/"), _, _,
372 CellularCapability::kTimeoutDefault))
373 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700374 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400375 capability_->StopModem(&error, callback);
376 EXPECT_TRUE(error.IsSuccess());
377
378 ResultCallback disable_callback;
379 EXPECT_CALL(*modem_proxy,
380 Enable(false, _, _, CellularCapability::kTimeoutEnable))
381 .WillOnce(SaveArg<2>(&disable_callback));
382 disconnect_callback.Run(Error(Error::kSuccess));
383
384 EXPECT_CALL(*this, TestCallback(IsSuccess()));
385 disable_callback.Run(Error(Error::kSuccess));
386}
387
Thieu Le5d6864a2012-07-20 11:43:51 -0700388TEST_F(CellularCapabilityUniversalTest, DisconnectModemNoBearer) {
389 Error error;
390 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700391 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le5d6864a2012-07-20 11:43:51 -0700392 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
393 .Times(0);
394 capability_->Disconnect(&error, disconnect_callback);
395}
396
Thieu Le3d275392012-07-20 15:32:58 -0700397TEST_F(CellularCapabilityUniversalTest, DisconnectNoProxy) {
398 Error error;
399 ResultCallback disconnect_callback;
400 capability_->bearer_path_ = "/foo";
401 EXPECT_CALL(*modem_simple_proxy_,
402 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
403 .Times(0);
404 ReleaseCapabilityProxies();
405 capability_->Disconnect(&error, disconnect_callback);
406}
407
Jason Glasgowaf583282012-04-18 15:18:22 -0400408TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
409 // Set up mock modem properties
410 DBusPropertiesMap modem_properties;
411 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
412 writer().append_uint32(kAccessTechnologies);
413 modem_properties[MM_MODEM_PROPERTY_SIM].
414 writer().append_path(kSimPath);
415
416 // Set up mock modem 3gpp properties
417 DBusPropertiesMap modem3gpp_properties;
418 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
419 writer().append_uint32(0);
420 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
421 writer().append_string(kImei);
422
423 // Set up mock modem sim properties
424 DBusPropertiesMap sim_properties;
425
426 // After setup we lose pointers to the proxies, so it is hard to set
427 // expectations.
428 EXPECT_CALL(*properties_proxy_,
429 GetAll(MM_DBUS_INTERFACE_SIM))
430 .WillOnce(Return(sim_properties));
431
432 SetUp();
433
434 EXPECT_EQ("", capability_->imei_);
435 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
436 capability_->access_technologies_);
437 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400438 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
439 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400440 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
441 modem_properties, vector<string>());
442 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
443 EXPECT_EQ(kSimPath, capability_->sim_path_);
444 EXPECT_TRUE(capability_->sim_proxy_.get());
445
446 // Changing properties on wrong interface will not have an effect
447 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
448 modem3gpp_properties,
449 vector<string>());
450 EXPECT_EQ("", capability_->imei_);
451
452 // Changing properties on the right interface gets reflected in the
453 // capabilities object
454 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
455 modem3gpp_properties,
456 vector<string>());
457 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400458
459 // Expect to see changes when the family changes
460 modem_properties.clear();
461 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
462 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
463 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
464 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
465 Times(1);
466 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
467 modem_properties,
468 vector<string>());
469 // Back to LTE
470 modem_properties.clear();
471 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
472 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
473 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
474 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
475 Times(1);
476 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
477 modem_properties,
478 vector<string>());
479
480 // LTE & CDMA - the device adaptor should not be called!
481 modem_properties.clear();
482 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
483 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
484 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
485 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
486 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
487 modem_properties,
488 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400489}
490
491TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
492 // Set up mock modem properties
493 DBusPropertiesMap modem_properties;
494 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
495
496 // Set up mock modem sim properties
497 const char kImsi[] = "310100000001";
498 DBusPropertiesMap sim_properties;
499 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
500
501 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
502 .WillOnce(Return(sim_properties));
503
504 // After setup we lose pointers to the proxies, so it is hard to set
505 // expectations.
506 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400507 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400508
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400509 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
510 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
511 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400512 EXPECT_FALSE(capability_->sim_proxy_.get());
513 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
514 modem_properties, vector<string>());
515 EXPECT_EQ(kSimPath, capability_->sim_path_);
516 EXPECT_TRUE(capability_->sim_proxy_.get());
517 EXPECT_EQ(kImsi, capability_->imsi_);
518
519 // Updating the SIM
520 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400521 const char kCountry[] = "us";
522 const char kCode[] = "310160";
523 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400524 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400525 const char kOperatorIdentifier[] = "310240";
526 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400527 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
528 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
529 append_string(kSimIdentifier);
530 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
531 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400532 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
533 new_properties,
534 vector<string>());
535 EXPECT_EQ(kNewImsi, capability_->imsi_);
536 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
537 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400538 EXPECT_EQ("", capability_->spn_);
539 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
540 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
541 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
542 EXPECT_EQ(4, capability_->apn_list_.size());
543
544 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
545 append_string(kOperatorName);
546 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
547 new_properties,
548 vector<string>());
549 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400550 EXPECT_EQ(kOperatorName, capability_->spn_);
551}
552
Gary Morainceba6aa2012-05-03 10:28:26 -0700553MATCHER_P(SizeIs, value, "") {
554 return static_cast<size_t>(value) == arg.size();
555}
556
557// Validates that OnScanReply does not crash with a null callback.
558TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
559 Error error;
560 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
561 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
562 EXPECT_CALL(*device_adaptor_,
563 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
564 SizeIs(0)));
565 Set3gppProxy();
566 capability_->Scan(&error, ResultCallback());
567 EXPECT_TRUE(error.IsSuccess());
568}
569
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400570// Validates that the scanning property is updated
571TEST_F(CellularCapabilityUniversalTest, Scan) {
572 Error error;
573
574 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
575 .WillRepeatedly(SaveArg<1>(&scan_callback_));
576 EXPECT_CALL(*device_adaptor_,
577 EmitBoolChanged(flimflam::kScanningProperty, true));
578 Set3gppProxy();
579 capability_->Scan(&error, ResultCallback());
580 EXPECT_TRUE(capability_->scanning_);
581
582 // Simulate the completion of the scan with 2 networks in the results.
583 EXPECT_CALL(*device_adaptor_,
584 EmitBoolChanged(flimflam::kScanningProperty, false));
585 EXPECT_CALL(*device_adaptor_,
586 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
587 SizeIs(2)));
588 vector<DBusPropertiesMap> results;
589 const char kScanID0[] = "testID0";
590 const char kScanID1[] = "testID1";
591 results.push_back(DBusPropertiesMap());
592 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
593 writer().append_string(kScanID0);
594 results.push_back(DBusPropertiesMap());
595 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
596 writer().append_string(kScanID1);
597 scan_callback_.Run(results, error);
598 EXPECT_FALSE(capability_->scanning_);
599
600 // Simulate the completion of the scan with no networks in the results.
601 EXPECT_CALL(*device_adaptor_,
602 EmitBoolChanged(flimflam::kScanningProperty, true));
603 capability_->Scan(&error, ResultCallback());
604 EXPECT_TRUE(capability_->scanning_);
605 EXPECT_CALL(*device_adaptor_,
606 EmitBoolChanged(flimflam::kScanningProperty, false));
607 EXPECT_CALL(*device_adaptor_,
608 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
609 SizeIs(0)));
610 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
611 EXPECT_FALSE(capability_->scanning_);
612}
613
614// Validates expected property updates when scan fails
615TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
616 Error error;
617
618 // Test immediate error
619 {
620 InSequence seq;
621 EXPECT_CALL(*modem_3gpp_proxy_,
622 Scan(_, _, CellularCapability::kTimeoutScan))
623 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
624 EXPECT_CALL(*modem_3gpp_proxy_,
625 Scan(_, _, CellularCapability::kTimeoutScan))
626 .WillOnce(SaveArg<1>(&scan_callback_));
627 }
628 Set3gppProxy();
629 capability_->Scan(&error, ResultCallback());
630 EXPECT_FALSE(capability_->scanning_);
631 EXPECT_TRUE(error.IsFailure());
632
633 // Initiate a scan
634 error.Populate(Error::kSuccess);
635 EXPECT_CALL(*device_adaptor_,
636 EmitBoolChanged(flimflam::kScanningProperty, true));
637 capability_->Scan(&error, ResultCallback());
638 EXPECT_TRUE(capability_->scanning_);
639 EXPECT_TRUE(error.IsSuccess());
640
641 // Validate that error is returned if Scan is called while already scanning.
642 capability_->Scan(&error, ResultCallback());
643 EXPECT_TRUE(capability_->scanning_);
644 EXPECT_TRUE(error.IsFailure());
645
646 // Validate that signals are emitted even if an error is reported.
647 capability_->found_networks_.clear();
648 capability_->found_networks_.push_back(Stringmap());
649 EXPECT_CALL(*device_adaptor_,
650 EmitBoolChanged(flimflam::kScanningProperty, false));
651 EXPECT_CALL(*device_adaptor_,
652 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
653 SizeIs(0)));
654 vector<DBusPropertiesMap> results;
655 scan_callback_.Run(results, Error(Error::kOperationFailed));
656 EXPECT_FALSE(capability_->scanning_);
657}
658
Jason Glasgow14521872012-05-07 19:12:15 -0400659// Validates expected behavior of Connect function
660TEST_F(CellularCapabilityUniversalTest, Connect) {
661 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
662 SetSimpleProxy();
663 Error error;
664 DBusPropertiesMap properties;
665 capability_->apn_try_list_.clear();
666 ResultCallback callback =
667 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
668 DBus::Path bearer("/foo");
669
670 // Test connect failures
671 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
672 .WillOnce(SaveArg<2>(&connect_callback_));
673 capability_->Connect(properties, &error, callback);
674 EXPECT_TRUE(error.IsSuccess());
675 EXPECT_CALL(*this, TestCallback(IsFailure()));
676 EXPECT_CALL(*service_, ClearLastGoodApn());
677 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
678
679 // Test connect success
680 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
681 .WillOnce(SaveArg<2>(&connect_callback_));
682 capability_->Connect(properties, &error, callback);
683 EXPECT_TRUE(error.IsSuccess());
684 EXPECT_CALL(*this, TestCallback(IsSuccess()));
685 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -0400686
687 // Test connect failures without a service. Make sure that shill
688 // does not crash if the connect failed and there is no
689 // CellularService object. This can happen if the modem is enabled
690 // and then quickly disabled.
691 cellular_->service_ = NULL;
692 EXPECT_FALSE(capability_->cellular()->service());
693 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
694 .WillOnce(SaveArg<2>(&connect_callback_));
695 capability_->Connect(properties, &error, callback);
696 EXPECT_TRUE(error.IsSuccess());
697 EXPECT_CALL(*this, TestCallback(IsFailure()));
698 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -0400699}
700
701// Validates Connect iterates over APNs
702TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
703 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
704 SetSimpleProxy();
705 Error error;
706 DBusPropertiesMap properties;
707 capability_->apn_try_list_.clear();
708 ResultCallback callback =
709 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
710 DBus::Path bearer("/bearer0");
711
712 const char apn_name_foo[] = "foo";
713 const char apn_name_bar[] = "bar";
714 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
715 .WillOnce(SaveArg<2>(&connect_callback_));
716 Stringmap apn1;
717 apn1[flimflam::kApnProperty] = apn_name_foo;
718 capability_->apn_try_list_.push_back(apn1);
719 Stringmap apn2;
720 apn2[flimflam::kApnProperty] = apn_name_bar;
721 capability_->apn_try_list_.push_back(apn2);
722 capability_->FillConnectPropertyMap(&properties);
723 capability_->Connect(properties, &error, callback);
724 EXPECT_TRUE(error.IsSuccess());
725
726 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
727 .WillOnce(SaveArg<2>(&connect_callback_));
728 EXPECT_CALL(*service_, ClearLastGoodApn());
729 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
730
731 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
732 EXPECT_CALL(*this, TestCallback(IsSuccess()));
733 connect_callback_.Run(bearer, Error(Error::kSuccess));
734}
735
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400736// Validates GetTypeString and AccessTechnologyToTechnologyFamily
737TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
738 const int gsm_technologies[] = {
739 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
740 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
741 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
742 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
743 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
744 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
745 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
746 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
747 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
748 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
749 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
750 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
751 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
752 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
753 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
754 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
755 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
756 };
757 for(size_t i = 0; i < arraysize(gsm_technologies); ++i) {
758 capability_->access_technologies_ = gsm_technologies[i];
759 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
760 }
761 const int cdma_technologies[] = {
762 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
763 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
764 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
765 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
766 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
767 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
768 };
769 for(size_t i = 0; i < arraysize(cdma_technologies); ++i) {
770 capability_->access_technologies_ = cdma_technologies[i];
771 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
772 }
773 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
774 ASSERT_EQ(capability_->GetTypeString(), "");
775}
776
Darin Petkovf508c822012-09-21 13:43:17 +0200777TEST_F(CellularCapabilityUniversalTest, AllowRoaming) {
778 EXPECT_FALSE(cellular_->allow_roaming_);
779 EXPECT_FALSE(capability_->provider_requires_roaming_);
780 EXPECT_FALSE(capability_->AllowRoaming());
781 capability_->provider_requires_roaming_ = true;
782 EXPECT_TRUE(capability_->AllowRoaming());
783 capability_->provider_requires_roaming_ = false;
784 cellular_->allow_roaming_ = true;
785 EXPECT_TRUE(capability_->AllowRoaming());
786}
787
Darin Petkovb4fccd22012-08-10 11:59:26 +0200788TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
789 static const char kTestCarrier[] = "The Cellular Carrier";
790 static const char kCountry[] = "us";
791 static const char kCode[] = "310160";
792 capability_->imsi_ = "310240123456789";
793
Darin Petkovf508c822012-09-21 13:43:17 +0200794 EXPECT_FALSE(capability_->home_provider_);
795 EXPECT_FALSE(capability_->provider_requires_roaming_);
796
Darin Petkovb4fccd22012-08-10 11:59:26 +0200797 capability_->SetHomeProvider(); // No mobile provider DB available.
798 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
799 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
800 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200801 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200802
803 InitProviderDB();
804 capability_->SetHomeProvider();
805 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
806 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
807 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
808 EXPECT_EQ(4, capability_->apn_list_.size());
809 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200810 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200811
812 Cellular::Operator oper;
813 cellular_->set_home_provider(oper);
814 capability_->spn_ = kTestCarrier;
815 capability_->SetHomeProvider();
816 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
817 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
818 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200819 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200820
821 static const char kCubic[] = "Cubic";
822 capability_->spn_ = kCubic;
823 capability_->SetHomeProvider();
824 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
825 EXPECT_EQ("", cellular_->home_provider().GetCode());
826 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200827 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200828
829 static const char kCUBIC[] = "CUBIC";
830 capability_->spn_ = kCUBIC;
831 capability_->home_provider_ = NULL;
832 capability_->SetHomeProvider();
833 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
834 EXPECT_EQ("", cellular_->home_provider().GetCode());
835 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200836 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200837}
838
Darin Petkova4ca3c32012-08-17 16:05:24 +0200839TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfo) {
840 static const char kOperatorName[] = "Swisscom";
841 InitProviderDB();
842 capability_->serving_operator_.SetCode("22801");
843 SetService();
844 capability_->UpdateOperatorInfo();
845 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
846 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
847 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
848
849 static const char kTestOperator[] = "Testcom";
850 capability_->serving_operator_.SetName(kTestOperator);
851 capability_->serving_operator_.SetCountry("");
852 capability_->UpdateOperatorInfo();
853 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
854 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
855 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
856}
857
858TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
859 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
860 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
861 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
862
863 capability_->serving_operator_.SetCode("1234");
864 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
865
866 static const char kHomeProvider[] = "The GSM Home Provider";
867 cellular_->home_provider_.SetName(kHomeProvider);
868 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
869 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
870 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
871
872 static const char kTestOperator[] = "A GSM Operator";
873 capability_->serving_operator_.SetName(kTestOperator);
874 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
875
876 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
877 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
878 capability_->CreateFriendlyServiceName());
879}
880
Jason Glasgowef965562012-04-10 16:12:35 -0400881} // namespace shill