blob: e81bdb931275620d9805ab8dfa6583224208dd0b [file] [log] [blame]
Arman Ugurayf4c61812013-01-10 18:58:39 -08001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
Jason Glasgowef965562012-04-10 16:12:35 -04002// 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>
Arman Ugurayc9533572013-01-22 17:34:20 -080012#include <base/string_util.h>
Jason Glasgowef965562012-04-10 16:12:35 -040013#include <chromeos/dbus/service_constants.h>
Arman Uguray1361c032013-02-11 17:53:39 -080014#include <gmock/gmock.h>
Jason Glasgowef965562012-04-10 16:12:35 -040015#include <gtest/gtest.h>
16#include <mobile_provider.h>
Ben Chan5c853ef2012-10-05 00:05:37 -070017#include <ModemManager/ModemManager.h>
Jason Glasgowef965562012-04-10 16:12:35 -040018
19#include "shill/cellular.h"
20#include "shill/cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040021#include "shill/dbus_adaptor.h"
Jason Glasgowef965562012-04-10 16:12:35 -040022#include "shill/error.h"
23#include "shill/event_dispatcher.h"
24#include "shill/mock_adaptors.h"
Arman Ugurayc7b15602013-02-16 00:56:18 -080025#include "shill/mock_activating_iccid_store.h"
Ben Chan15786032012-11-04 21:28:02 -080026#include "shill/mock_cellular_operator_info.h"
Jason Glasgow14521872012-05-07 19:12:15 -040027#include "shill/mock_cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040028#include "shill/mock_dbus_properties_proxy.h"
Arman Uguray1361c032013-02-11 17:53:39 -080029#include "shill/mock_event_dispatcher.h"
Jason Glasgowef965562012-04-10 16:12:35 -040030#include "shill/mock_glib.h"
31#include "shill/mock_manager.h"
32#include "shill/mock_metrics.h"
Arman Uguray6e5639f2012-11-15 20:30:19 -080033#include "shill/mock_mm1_bearer_proxy.h"
Jason Glasgowef965562012-04-10 16:12:35 -040034#include "shill/mock_mm1_modem_modem3gpp_proxy.h"
35#include "shill/mock_mm1_modem_modemcdma_proxy.h"
36#include "shill/mock_mm1_modem_proxy.h"
37#include "shill/mock_mm1_modem_simple_proxy.h"
38#include "shill/mock_mm1_sim_proxy.h"
39#include "shill/mock_profile.h"
40#include "shill/mock_rtnl_handler.h"
41#include "shill/nice_mock_control.h"
42#include "shill/proxy_factory.h"
43
44using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020045using base::StringPrintf;
Jason Glasgowef965562012-04-10 16:12:35 -040046using base::Unretained;
47using std::string;
Nathan Williams4b7c2a82012-04-13 15:19:47 -040048using std::vector;
Jason Glasgowef965562012-04-10 16:12:35 -040049using testing::InSequence;
Ben Chan6d0d1e72012-11-06 21:19:28 -080050using testing::Invoke;
Arman Uguray1361c032013-02-11 17:53:39 -080051using testing::InvokeWithoutArgs;
Gary Moraine285a842012-08-15 08:23:57 -070052using testing::Mock;
Jason Glasgowef965562012-04-10 16:12:35 -040053using testing::NiceMock;
54using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040055using testing::SaveArg;
Jason Glasgowef965562012-04-10 16:12:35 -040056using testing::_;
57
58namespace shill {
59
60MATCHER(IsSuccess, "") {
61 return arg.IsSuccess();
62}
63MATCHER(IsFailure, "") {
64 return arg.IsFailure();
65}
Jason Glasgow14521872012-05-07 19:12:15 -040066MATCHER_P(HasApn, expected_apn, "") {
67 string apn;
68 return (DBusProperties::GetString(arg,
69 CellularCapabilityUniversal::kConnectApn,
70 &apn) &&
71 apn == expected_apn);
72}
Jason Glasgowef965562012-04-10 16:12:35 -040073
Arman Uguray1361c032013-02-11 17:53:39 -080074class CellularCapabilityUniversalTest : public testing::TestWithParam<string> {
Jason Glasgowef965562012-04-10 16:12:35 -040075 public:
Arman Uguray1361c032013-02-11 17:53:39 -080076 CellularCapabilityUniversalTest(EventDispatcher *dispatcher)
77 : event_dispatcher_(dispatcher),
78 metrics_(dispatcher),
79 manager_(&control_, dispatcher, &metrics_, &glib_),
Arman Uguray6e5639f2012-11-15 20:30:19 -080080 bearer_proxy_(new mm1::MockBearerProxy()),
Ben Chan3ecdf822012-08-06 12:29:23 -070081 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
82 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
83 modem_proxy_(new mm1::MockModemProxy()),
84 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
85 sim_proxy_(new mm1::MockSimProxy()),
86 properties_proxy_(new MockDBusPropertiesProxy()),
87 proxy_factory_(this),
88 capability_(NULL),
89 device_adaptor_(NULL),
90 provider_db_(NULL),
Jason Glasgowef965562012-04-10 16:12:35 -040091 cellular_(new Cellular(&control_,
Arman Uguray1361c032013-02-11 17:53:39 -080092 dispatcher,
Thieu Lece4483e2013-01-23 15:12:03 -080093 &metrics_,
Jason Glasgowef965562012-04-10 16:12:35 -040094 &manager_,
95 "",
Arman Ugurayc9533572013-01-22 17:34:20 -080096 kMachineAddress,
Jason Glasgowef965562012-04-10 16:12:35 -040097 0,
98 Cellular::kTypeUniversal,
99 "",
100 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -0400101 "",
Ben Chan3ecdf822012-08-06 12:29:23 -0700102 NULL,
Ben Chan62028b22012-11-05 11:20:02 -0800103 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -0700104 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -0400105 service_(new MockCellularService(&control_,
Arman Uguray1361c032013-02-11 17:53:39 -0800106 dispatcher,
Jason Glasgow14521872012-05-07 19:12:15 -0400107 &metrics_,
108 &manager_,
Thieu Lece4483e2013-01-23 15:12:03 -0800109 cellular_)) {
110 metrics_.RegisterDevice(cellular_->interface_index(),
111 Technology::kCellular);
112 }
Jason Glasgowef965562012-04-10 16:12:35 -0400113
114 virtual ~CellularCapabilityUniversalTest() {
115 cellular_->service_ = NULL;
116 capability_ = NULL;
117 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200118 if (provider_db_) {
119 mobile_provider_close_db(provider_db_);
120 provider_db_ = NULL;
121 }
Jason Glasgowef965562012-04-10 16:12:35 -0400122 }
123
124 virtual void SetUp() {
125 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
126 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400127 device_adaptor_ =
128 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400129 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400130 }
131
132 virtual void TearDown() {
133 capability_->proxy_factory_ = NULL;
134 }
135
Darin Petkova4ca3c32012-08-17 16:05:24 +0200136 void SetService() {
137 cellular_->service_ = new CellularService(
Arman Uguray1361c032013-02-11 17:53:39 -0800138 &control_, event_dispatcher_, &metrics_, NULL, cellular_);
Darin Petkova4ca3c32012-08-17 16:05:24 +0200139 }
140
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400141 void InitProviderDB() {
142 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
143
144 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
145 ASSERT_TRUE(provider_db_);
146 cellular_->provider_db_ = provider_db_;
147 }
148
Jason Glasgowef965562012-04-10 16:12:35 -0400149 void InvokeEnable(bool enable, Error *error,
150 const ResultCallback &callback, int timeout) {
151 callback.Run(Error());
152 }
153 void InvokeEnableFail(bool enable, Error *error,
154 const ResultCallback &callback, int timeout) {
155 callback.Run(Error(Error::kOperationFailed));
156 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400157 void InvokeRegister(const string &operator_id, Error *error,
158 const ResultCallback &callback, int timeout) {
159 callback.Run(Error());
160 }
161
Gary Morainceba6aa2012-05-03 10:28:26 -0700162 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
163 int timeout) {
164 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
165 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400166 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
167 int timeout) {
168 error->Populate(Error::kOperationFailed);
169 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700170
Arman Uguray1361c032013-02-11 17:53:39 -0800171 bool InvokeScanningOrSearchingTimeout() {
172 capability_->OnScanningOrSearchingTimeout();
173 return true;
174 }
175
Arman Ugurayc7b15602013-02-16 00:56:18 -0800176 void SetMockIccidStore() {
177 capability_->activating_iccid_store_ = &mock_iccid_store_;
178 }
179
Gary Morainceba6aa2012-05-03 10:28:26 -0700180 void Set3gppProxy() {
181 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
182 }
183
Jason Glasgow14521872012-05-07 19:12:15 -0400184 void SetSimpleProxy() {
185 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
186 }
187
Thieu Le3d275392012-07-20 15:32:58 -0700188 void ReleaseCapabilityProxies() {
189 capability_->ReleaseProxies();
190 }
191
Jason Glasgowef965562012-04-10 16:12:35 -0400192 MOCK_METHOD1(TestCallback, void(const Error &error));
193
194 protected:
Arman Uguray6e5639f2012-11-15 20:30:19 -0800195 static const char kActiveBearerPathPrefix[];
Jason Glasgowef965562012-04-10 16:12:35 -0400196 static const char kImei[];
Arman Uguray6e5639f2012-11-15 20:30:19 -0800197 static const char kInactiveBearerPathPrefix[];
Arman Ugurayc9533572013-01-22 17:34:20 -0800198 static const char kMachineAddress[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400199 static const char kSimPath[];
200 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400201
202 class TestProxyFactory : public ProxyFactory {
203 public:
204 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
205 test_(test) {}
206
Arman Uguray6e5639f2012-11-15 20:30:19 -0800207 virtual mm1::BearerProxyInterface *CreateBearerProxy(
208 const std::string &path,
209 const std::string &/*service*/) {
210 mm1::MockBearerProxy *bearer_proxy = test_->bearer_proxy_.release();
211 if (path.find(kActiveBearerPathPrefix) != std::string::npos)
212 ON_CALL(*bearer_proxy, Connected()).WillByDefault(Return(true));
213 else
214 ON_CALL(*bearer_proxy, Connected()).WillByDefault(Return(false));
215 test_->bearer_proxy_.reset(new mm1::MockBearerProxy());
216 return bearer_proxy;
217 }
218
Jason Glasgowef965562012-04-10 16:12:35 -0400219 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800220 const std::string &/*path*/,
221 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400222 return test_->modem_3gpp_proxy_.release();
223 }
224
225 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800226 const std::string &/*path*/,
227 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400228 return test_->modem_cdma_proxy_.release();
229 }
230
231 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800232 const std::string &/*path*/,
233 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400234 return test_->modem_proxy_.release();
235 }
236
237 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800238 const std::string &/*path*/,
239 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400240 return test_->modem_simple_proxy_.release();
241 }
242
243 virtual mm1::SimProxyInterface *CreateSimProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800244 const std::string &/*path*/,
245 const std::string &/*service*/) {
Arman Uguray6552f8c2013-02-12 15:33:18 -0800246 mm1::MockSimProxy *sim_proxy = test_->sim_proxy_.release();
247 test_->sim_proxy_.reset(new mm1::MockSimProxy());
248 return sim_proxy;
Jason Glasgowef965562012-04-10 16:12:35 -0400249 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400250 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800251 const std::string &/*path*/,
252 const std::string &/*service*/) {
Arman Uguray6552f8c2013-02-12 15:33:18 -0800253 MockDBusPropertiesProxy *properties_proxy =
254 test_->properties_proxy_.release();
255 test_->properties_proxy_.reset(new MockDBusPropertiesProxy());
256 return properties_proxy;
Jason Glasgowaf583282012-04-18 15:18:22 -0400257 }
Jason Glasgowef965562012-04-10 16:12:35 -0400258
259 private:
260 CellularCapabilityUniversalTest *test_;
261 };
262
263 NiceMockControl control_;
Arman Uguray1361c032013-02-11 17:53:39 -0800264 EventDispatcher *event_dispatcher_;
Jason Glasgowef965562012-04-10 16:12:35 -0400265 MockMetrics metrics_;
266 MockGLib glib_;
267 MockManager manager_;
Arman Uguray6e5639f2012-11-15 20:30:19 -0800268 scoped_ptr<mm1::MockBearerProxy> bearer_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400269 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
270 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
271 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
272 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
273 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400274 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Arman Ugurayc7b15602013-02-16 00:56:18 -0800275 MockActivatingIccidStore mock_iccid_store_;
Jason Glasgowef965562012-04-10 16:12:35 -0400276 TestProxyFactory proxy_factory_;
277 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
278 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Ben Chan15786032012-11-04 21:28:02 -0800279 MockCellularOperatorInfo cellular_operator_info_;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400280 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700281 CellularRefPtr cellular_;
282 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400283 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400284 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400285};
286
Arman Uguray1361c032013-02-11 17:53:39 -0800287// Most of our tests involve using a real EventDispatcher object.
288class CellularCapabilityUniversalMainTest
289 : public CellularCapabilityUniversalTest {
290 public:
291 CellularCapabilityUniversalMainTest() :
292 CellularCapabilityUniversalTest(&dispatcher_) {}
293
294 protected:
295 EventDispatcher dispatcher_;
296};
297
298// Tests that involve timers will (or may) use a mock of the event dispatcher
299// instead of a real one.
300class CellularCapabilityUniversalTimerTest
301 : public CellularCapabilityUniversalTest {
302 public:
303 CellularCapabilityUniversalTimerTest()
304 : CellularCapabilityUniversalTest(&mock_dispatcher_) {}
305
306 protected:
307 ::testing::StrictMock<MockEventDispatcher> mock_dispatcher_;
308};
309
Arman Uguray6e5639f2012-11-15 20:30:19 -0800310const char CellularCapabilityUniversalTest::kActiveBearerPathPrefix[] =
311 "/bearer/active";
Jason Glasgowef965562012-04-10 16:12:35 -0400312const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Arman Uguray6e5639f2012-11-15 20:30:19 -0800313const char CellularCapabilityUniversalTest::kInactiveBearerPathPrefix[] =
314 "/bearer/inactive";
Arman Ugurayc9533572013-01-22 17:34:20 -0800315const char CellularCapabilityUniversalTest::kMachineAddress[] =
316 "TestMachineAddress";
Jason Glasgowaf583282012-04-18 15:18:22 -0400317const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
318const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
319 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
320 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400321
Arman Uguray1361c032013-02-11 17:53:39 -0800322TEST_F(CellularCapabilityUniversalMainTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400323 // Set up mock modem properties
324 DBusPropertiesMap modem_properties;
325 string operator_name = "TestOperator";
326 string operator_code = "001400";
327
328 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
329 writer().append_uint32(kAccessTechnologies);
330
331 ::DBus::Variant v;
332 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400333 ::DBus::Struct< uint32_t, bool > quality;
334 quality._1 = 90;
335 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400336 writer << quality;
337 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
338
339 // Set up mock modem 3gpp properties
340 DBusPropertiesMap modem3gpp_properties;
341 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
342 writer().append_uint32(0);
343 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
344 writer().append_string(kImei);
345
346 EXPECT_CALL(*modem_proxy_,
347 Enable(true, _, _, CellularCapability::kTimeoutEnable))
348 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
349 EXPECT_CALL(*properties_proxy_,
350 GetAll(MM_DBUS_INTERFACE_MODEM))
351 .WillOnce(Return(modem_properties));
352 EXPECT_CALL(*properties_proxy_,
353 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
354 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400355
Gary Moraine285a842012-08-15 08:23:57 -0700356 // Let the modem report that it is initializing. StartModem() should defer
357 // enabling the modem until its state changes to disabled.
358 EXPECT_CALL(*modem_proxy_, State())
359 .WillOnce(Return(Cellular::kModemStateInitializing));
360
Jason Glasgowef965562012-04-10 16:12:35 -0400361 // After setup we lose pointers to the proxies, so it is hard to set
362 // expectations.
363 SetUp();
364
365 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700366 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400367 ResultCallback callback =
368 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
369 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700370
Arman Uguray6e5639f2012-11-15 20:30:19 -0800371 // Verify that the modem has not been enabled.
Gary Moraine285a842012-08-15 08:23:57 -0700372 EXPECT_TRUE(capability_->imei_.empty());
373 EXPECT_EQ(0, capability_->access_technologies_);
374 Mock::VerifyAndClearExpectations(this);
375
376 // Change the state to kModemStateDisabling and verify that it still has not
Arman Uguray6e5639f2012-11-15 20:30:19 -0800377 // been enabled.
Gary Moraine285a842012-08-15 08:23:57 -0700378 EXPECT_CALL(*this, TestCallback(_)).Times(0);
379 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
380 Cellular::kModemStateDisabling, 0);
381 EXPECT_TRUE(capability_->imei_.empty());
382 EXPECT_EQ(0, capability_->access_technologies_);
383 Mock::VerifyAndClearExpectations(this);
384
385 // Change the state of the modem to disabled and verify that it gets enabled.
386 EXPECT_CALL(*this, TestCallback(IsSuccess()));
387 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
388 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400389 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400390 EXPECT_EQ(kImei, capability_->imei_);
391 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400392}
393
Arman Uguray1361c032013-02-11 17:53:39 -0800394TEST_F(CellularCapabilityUniversalMainTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700395 EXPECT_CALL(*modem_proxy_, State())
396 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400397 EXPECT_CALL(*modem_proxy_,
398 Enable(true, _, _, CellularCapability::kTimeoutEnable))
399 .WillOnce(
400 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
401 EXPECT_CALL(*this, TestCallback(IsFailure()));
402 ResultCallback callback =
403 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
404 SetUp();
405
406 Error error;
407 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700408 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400409}
410
Thieu Leb9c05e02013-03-04 14:09:32 -0800411TEST_F(CellularCapabilityUniversalMainTest, StartModemAlreadyEnabled) {
412 EXPECT_CALL(*modem_proxy_, State())
413 .WillOnce(Return(Cellular::kModemStateEnabled));
414 SetUp();
415 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
416
417 // Make sure the call to StartModem() doesn't attempt to complete the
418 // request synchronously, else it will crash DBus-C++.
419 Error error(Error::kOperationInitiated);
420 capability_->StartModem(&error, ResultCallback());
421 EXPECT_TRUE(error.IsOngoing());
422}
423
Arman Uguray1361c032013-02-11 17:53:39 -0800424TEST_F(CellularCapabilityUniversalMainTest, StopModem) {
Jason Glasgow02401cc2012-05-16 10:35:37 -0400425 // Save pointers to proxies before they are lost by the call to InitProxies
426 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
427 SetUp();
428 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
429 capability_->InitProxies();
430
431 Error error;
432 ResultCallback callback =
433 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
434 capability_->StopModem(&error, callback);
435 EXPECT_TRUE(error.IsSuccess());
436
437 ResultCallback disable_callback;
438 EXPECT_CALL(*modem_proxy,
439 Enable(false, _, _, CellularCapability::kTimeoutEnable))
440 .WillOnce(SaveArg<2>(&disable_callback));
441 dispatcher_.DispatchPendingEvents();
442
Arman Ugurayee464d32013-02-13 17:14:36 -0800443 ResultCallback set_power_state_callback;
Thieu Le2cac2942013-03-05 18:41:08 -0800444 EXPECT_CALL(
445 *modem_proxy,
446 SetPowerState(
447 MM_MODEM_POWER_STATE_LOW, _, _,
448 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds))
Arman Ugurayee464d32013-02-13 17:14:36 -0800449 .WillOnce(SaveArg<2>(&set_power_state_callback));
Jason Glasgow02401cc2012-05-16 10:35:37 -0400450 disable_callback.Run(Error(Error::kSuccess));
Arman Ugurayee464d32013-02-13 17:14:36 -0800451
452 EXPECT_CALL(*this, TestCallback(IsSuccess()));
453 set_power_state_callback.Run(Error(Error::kSuccess));
454
455 // TestCallback should get called with success even if the power state
456 // callback gets called with an error
457 EXPECT_CALL(*this, TestCallback(IsSuccess()));
458 set_power_state_callback.Run(Error(Error::kOperationFailed));
Jason Glasgow02401cc2012-05-16 10:35:37 -0400459}
460
Arman Uguray1361c032013-02-11 17:53:39 -0800461TEST_F(CellularCapabilityUniversalMainTest, StopModemConnected) {
Jason Glasgow02401cc2012-05-16 10:35:37 -0400462 // Save pointers to proxies before they are lost by the call to InitProxies
463 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
464 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
465 SetUp();
466 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
467 capability_->InitProxies();
468
469 ResultCallback disconnect_callback;
470 Error error;
471 ResultCallback callback =
472 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
473 EXPECT_CALL(*modem_simple_proxy,
474 Disconnect(::DBus::Path("/"), _, _,
Thieu Le049adb52012-11-12 17:14:51 -0800475 CellularCapability::kTimeoutDisconnect))
Jason Glasgow02401cc2012-05-16 10:35:37 -0400476 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700477 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400478 capability_->StopModem(&error, callback);
479 EXPECT_TRUE(error.IsSuccess());
480
481 ResultCallback disable_callback;
482 EXPECT_CALL(*modem_proxy,
483 Enable(false, _, _, CellularCapability::kTimeoutEnable))
484 .WillOnce(SaveArg<2>(&disable_callback));
485 disconnect_callback.Run(Error(Error::kSuccess));
486
Arman Ugurayee464d32013-02-13 17:14:36 -0800487 ResultCallback set_power_state_callback;
Thieu Le2cac2942013-03-05 18:41:08 -0800488 EXPECT_CALL(
489 *modem_proxy,
490 SetPowerState(
491 MM_MODEM_POWER_STATE_LOW, _, _,
492 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds))
Arman Ugurayee464d32013-02-13 17:14:36 -0800493 .WillOnce(SaveArg<2>(&set_power_state_callback));
494
Jason Glasgow02401cc2012-05-16 10:35:37 -0400495 disable_callback.Run(Error(Error::kSuccess));
Arman Ugurayee464d32013-02-13 17:14:36 -0800496
497 EXPECT_CALL(*this, TestCallback(IsSuccess()));
498 set_power_state_callback.Run(Error(Error::kSuccess));
Jason Glasgow02401cc2012-05-16 10:35:37 -0400499}
500
Arman Uguray1361c032013-02-11 17:53:39 -0800501TEST_F(CellularCapabilityUniversalMainTest, DisconnectModemNoBearer) {
Thieu Le5d6864a2012-07-20 11:43:51 -0700502 Error error;
503 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700504 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800505 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect))
Thieu Le5d6864a2012-07-20 11:43:51 -0700506 .Times(0);
507 capability_->Disconnect(&error, disconnect_callback);
508}
509
Arman Uguray1361c032013-02-11 17:53:39 -0800510TEST_F(CellularCapabilityUniversalMainTest, DisconnectNoProxy) {
Thieu Le3d275392012-07-20 15:32:58 -0700511 Error error;
512 ResultCallback disconnect_callback;
513 capability_->bearer_path_ = "/foo";
514 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800515 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect))
Thieu Le3d275392012-07-20 15:32:58 -0700516 .Times(0);
517 ReleaseCapabilityProxies();
518 capability_->Disconnect(&error, disconnect_callback);
519}
520
Arman Uguray1361c032013-02-11 17:53:39 -0800521TEST_F(CellularCapabilityUniversalMainTest, SimLockStatusChanged) {
Arman Ugurayab9364e2012-12-19 20:45:25 -0800522 // Set up mock SIM properties
523 const char kImsi[] = "310100000001";
524 const char kSimIdentifier[] = "9999888";
525 const char kOperatorIdentifier[] = "310240";
526 const char kOperatorName[] = "Custom SPN";
527 DBusPropertiesMap sim_properties;
528 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
529 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
530 .append_string(kSimIdentifier);
531 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
532 .append_string(kOperatorIdentifier);
533 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
534 .append_string(kOperatorName);
535
536 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
537 .WillOnce(Return(sim_properties));
538
539 SetUp();
540 InitProviderDB();
541
542 EXPECT_FALSE(capability_->sim_present_);
543 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
544
545 capability_->OnSimPathChanged(kSimPath);
546 EXPECT_TRUE(capability_->sim_present_);
547 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
548 EXPECT_EQ(kSimPath, capability_->sim_path_);
549
550 capability_->imsi_ = "";
551 capability_->sim_identifier_ = "";
552 capability_->operator_id_ = "";
553 capability_->spn_ = "";
554
555 // SIM is locked.
556 capability_->sim_lock_status_.lock_type = "sim-pin";
557 capability_->OnSimLockStatusChanged();
558
559 EXPECT_EQ("", capability_->imsi_);
560 EXPECT_EQ("", capability_->sim_identifier_);
561 EXPECT_EQ("", capability_->operator_id_);
562 EXPECT_EQ("", capability_->spn_);
563
564 // SIM is unlocked.
565 properties_proxy_.reset(new MockDBusPropertiesProxy());
566 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
567 .WillOnce(Return(sim_properties));
568
569 capability_->sim_lock_status_.lock_type = "";
570 capability_->OnSimLockStatusChanged();
571
572 EXPECT_EQ(kImsi, capability_->imsi_);
573 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
574 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
575 EXPECT_EQ(kOperatorName, capability_->spn_);
576}
577
Arman Uguray1361c032013-02-11 17:53:39 -0800578TEST_F(CellularCapabilityUniversalMainTest, PropertiesChanged) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400579 // Set up mock modem properties
580 DBusPropertiesMap modem_properties;
581 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
582 writer().append_uint32(kAccessTechnologies);
583 modem_properties[MM_MODEM_PROPERTY_SIM].
584 writer().append_path(kSimPath);
585
586 // Set up mock modem 3gpp properties
587 DBusPropertiesMap modem3gpp_properties;
588 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
589 writer().append_uint32(0);
590 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
591 writer().append_string(kImei);
592
593 // Set up mock modem sim properties
594 DBusPropertiesMap sim_properties;
595
596 // After setup we lose pointers to the proxies, so it is hard to set
597 // expectations.
598 EXPECT_CALL(*properties_proxy_,
599 GetAll(MM_DBUS_INTERFACE_SIM))
600 .WillOnce(Return(sim_properties));
601
602 SetUp();
603
604 EXPECT_EQ("", capability_->imei_);
605 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
606 capability_->access_technologies_);
607 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400608 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
609 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400610 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
611 modem_properties, vector<string>());
612 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
613 EXPECT_EQ(kSimPath, capability_->sim_path_);
614 EXPECT_TRUE(capability_->sim_proxy_.get());
615
616 // Changing properties on wrong interface will not have an effect
617 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
618 modem3gpp_properties,
619 vector<string>());
620 EXPECT_EQ("", capability_->imei_);
621
622 // Changing properties on the right interface gets reflected in the
623 // capabilities object
624 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
625 modem3gpp_properties,
626 vector<string>());
627 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400628
629 // Expect to see changes when the family changes
630 modem_properties.clear();
631 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
632 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
633 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
634 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
635 Times(1);
636 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
637 modem_properties,
638 vector<string>());
639 // Back to LTE
640 modem_properties.clear();
641 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
642 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
643 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
644 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
645 Times(1);
646 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
647 modem_properties,
648 vector<string>());
649
650 // LTE & CDMA - the device adaptor should not be called!
651 modem_properties.clear();
652 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
653 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
654 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
655 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
656 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
657 modem_properties,
658 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400659}
660
Arman Uguray1361c032013-02-11 17:53:39 -0800661TEST_F(CellularCapabilityUniversalMainTest, UpdateServiceName) {
Arman Uguray2717a102013-01-29 23:36:06 -0800662 ::DBus::Struct<uint32_t, bool> data;
663 data._1 = 100;
664 data._2 = true;
665 EXPECT_CALL(*modem_proxy_, SignalQuality()).WillRepeatedly(Return(data));
666
667 SetUp();
668 InitProviderDB();
669 capability_->InitProxies();
670 cellular_->cellular_operator_info_ = &cellular_operator_info_;
671
672 SetService();
673
674 size_t len = strlen(CellularCapabilityUniversal::kGenericServiceNamePrefix);
675 EXPECT_EQ(CellularCapabilityUniversal::kGenericServiceNamePrefix,
676 cellular_->service_->friendly_name().substr(0, len));
677
678 capability_->imsi_ = "310240123456789";
679 capability_->SetHomeProvider();
680 EXPECT_EQ("", capability_->spn_);
681 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
682 EXPECT_EQ(CellularCapabilityUniversal::kGenericServiceNamePrefix,
683 cellular_->service_->friendly_name().substr(0, len));
684
685 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
686 capability_->SetHomeProvider();
687 EXPECT_EQ("", capability_->spn_);
688 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
689 EXPECT_EQ("T-Mobile", cellular_->service_->friendly_name());
690
691 capability_->spn_ = "Test Home Provider";
692 capability_->SetHomeProvider();
693 EXPECT_EQ("Test Home Provider", cellular_->home_provider().GetName());
694 EXPECT_EQ("Test Home Provider", cellular_->service_->friendly_name());
695
696 capability_->On3GPPRegistrationChanged(
697 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, "", "OTA Name");
698 EXPECT_EQ("OTA Name", cellular_->service_->friendly_name());
699
700 capability_->On3GPPRegistrationChanged(
701 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, "123", "OTA Name 2");
702 EXPECT_EQ("OTA Name 2", cellular_->service_->friendly_name());
703
704 capability_->On3GPPRegistrationChanged(
705 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, "123", "");
706 EXPECT_EQ("Test Home Provider", cellular_->service_->friendly_name());
707}
708
Arman Uguray6552f8c2013-02-12 15:33:18 -0800709TEST_F(CellularCapabilityUniversalMainTest, IsValidSimPath) {
710 // Invalid paths
711 EXPECT_FALSE(capability_->IsValidSimPath(""));
712 EXPECT_FALSE(capability_->IsValidSimPath("/"));
713
714 // A valid path
715 EXPECT_TRUE(capability_->IsValidSimPath(
716 "/org/freedesktop/ModemManager1/SIM/0"));
717
718 // Note that any string that is not one of the above invalid paths is
719 // currently regarded as valid, since the ModemManager spec doesn't impose
720 // a strict format on the path. The validity of this is subject to change.
721 EXPECT_TRUE(capability_->IsValidSimPath("path"));
722}
723
Ben Chand7592522013-02-13 16:02:01 -0800724TEST_F(CellularCapabilityUniversalMainTest, NormalizeMdn) {
725 EXPECT_EQ("", capability_->NormalizeMdn(""));
726 EXPECT_EQ("12345678901", capability_->NormalizeMdn("12345678901"));
727 EXPECT_EQ("12345678901", capability_->NormalizeMdn("+1 234 567 8901"));
728 EXPECT_EQ("12345678901", capability_->NormalizeMdn("+1-234-567-8901"));
729 EXPECT_EQ("12345678901", capability_->NormalizeMdn("+1 (234) 567-8901"));
730 EXPECT_EQ("12345678901", capability_->NormalizeMdn("1 234 567 8901 "));
731 EXPECT_EQ("2345678901", capability_->NormalizeMdn("(234) 567-8901"));
732}
733
Arman Uguray1361c032013-02-11 17:53:39 -0800734TEST_F(CellularCapabilityUniversalMainTest, SimPathChanged) {
Ben Chanbd3aee82012-10-16 23:52:04 -0700735 // Set up mock modem SIM properties
736 const char kImsi[] = "310100000001";
737 const char kSimIdentifier[] = "9999888";
738 const char kOperatorIdentifier[] = "310240";
739 const char kOperatorName[] = "Custom SPN";
740 DBusPropertiesMap sim_properties;
741 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
742 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
743 .append_string(kSimIdentifier);
744 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
745 .append_string(kOperatorIdentifier);
746 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
747 .append_string(kOperatorName);
748
749 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
750 .Times(1).WillOnce(Return(sim_properties));
751
752 EXPECT_FALSE(capability_->sim_present_);
753 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
754 EXPECT_EQ("", capability_->sim_path_);
755 EXPECT_EQ("", capability_->imsi_);
756 EXPECT_EQ("", capability_->sim_identifier_);
757 EXPECT_EQ("", capability_->operator_id_);
758 EXPECT_EQ("", capability_->spn_);
759
760 capability_->OnSimPathChanged(kSimPath);
761 EXPECT_TRUE(capability_->sim_present_);
762 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
763 EXPECT_EQ(kSimPath, capability_->sim_path_);
764 EXPECT_EQ(kImsi, capability_->imsi_);
765 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
766 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
767 EXPECT_EQ(kOperatorName, capability_->spn_);
768
769 // Changing to the same SIM path should be a no-op.
770 capability_->OnSimPathChanged(kSimPath);
771 EXPECT_TRUE(capability_->sim_present_);
772 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
773 EXPECT_EQ(kSimPath, capability_->sim_path_);
774 EXPECT_EQ(kImsi, capability_->imsi_);
775 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
776 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
777 EXPECT_EQ(kOperatorName, capability_->spn_);
778
779 capability_->OnSimPathChanged("");
780 EXPECT_FALSE(capability_->sim_present_);
781 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
782 EXPECT_EQ("", capability_->sim_path_);
783 EXPECT_EQ("", capability_->imsi_);
784 EXPECT_EQ("", capability_->sim_identifier_);
785 EXPECT_EQ("", capability_->operator_id_);
786 EXPECT_EQ("", capability_->spn_);
Arman Uguray6552f8c2013-02-12 15:33:18 -0800787
788 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
789 .Times(1).WillOnce(Return(sim_properties));
790
791 capability_->OnSimPathChanged(kSimPath);
792 EXPECT_TRUE(capability_->sim_present_);
793 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
794 EXPECT_EQ(kSimPath, capability_->sim_path_);
795 EXPECT_EQ(kImsi, capability_->imsi_);
796 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
797 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
798 EXPECT_EQ(kOperatorName, capability_->spn_);
799
800 capability_->OnSimPathChanged("/");
801 EXPECT_FALSE(capability_->sim_present_);
802 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
803 EXPECT_EQ("/", capability_->sim_path_);
804 EXPECT_EQ("", capability_->imsi_);
805 EXPECT_EQ("", capability_->sim_identifier_);
806 EXPECT_EQ("", capability_->operator_id_);
807 EXPECT_EQ("", capability_->spn_);
Ben Chanbd3aee82012-10-16 23:52:04 -0700808}
809
Arman Uguray1361c032013-02-11 17:53:39 -0800810TEST_F(CellularCapabilityUniversalMainTest, SimPropertiesChanged) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400811 // Set up mock modem properties
812 DBusPropertiesMap modem_properties;
813 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
814
815 // Set up mock modem sim properties
816 const char kImsi[] = "310100000001";
817 DBusPropertiesMap sim_properties;
818 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
819
820 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
821 .WillOnce(Return(sim_properties));
822
823 // After setup we lose pointers to the proxies, so it is hard to set
824 // expectations.
825 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400826 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400827
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400828 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
829 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
830 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400831 EXPECT_FALSE(capability_->sim_proxy_.get());
832 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
833 modem_properties, vector<string>());
834 EXPECT_EQ(kSimPath, capability_->sim_path_);
835 EXPECT_TRUE(capability_->sim_proxy_.get());
836 EXPECT_EQ(kImsi, capability_->imsi_);
837
838 // Updating the SIM
839 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400840 const char kCountry[] = "us";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400841 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400842 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400843 const char kOperatorIdentifier[] = "310240";
844 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400845 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
846 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
847 append_string(kSimIdentifier);
848 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
849 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400850 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
851 new_properties,
852 vector<string>());
853 EXPECT_EQ(kNewImsi, capability_->imsi_);
854 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
855 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400856 EXPECT_EQ("", capability_->spn_);
857 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
858 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
Arman Ugurayd73783f2013-01-31 16:11:21 -0800859 EXPECT_EQ(kOperatorIdentifier, cellular_->home_provider().GetCode());
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400860 EXPECT_EQ(4, capability_->apn_list_.size());
861
862 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
863 append_string(kOperatorName);
864 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
865 new_properties,
866 vector<string>());
867 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400868 EXPECT_EQ(kOperatorName, capability_->spn_);
869}
870
Gary Morainceba6aa2012-05-03 10:28:26 -0700871MATCHER_P(SizeIs, value, "") {
872 return static_cast<size_t>(value) == arg.size();
873}
874
Arman Uguray1361c032013-02-11 17:53:39 -0800875TEST_F(CellularCapabilityUniversalMainTest, Reset) {
Ben Chan5d0d32c2013-01-08 02:05:29 -0800876 // Save pointers to proxies before they are lost by the call to InitProxies
877 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
878 SetUp();
879 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
880 capability_->InitProxies();
881
882 Error error;
883 ResultCallback reset_callback;
884
885 EXPECT_CALL(*modem_proxy, Reset(_, _, CellularCapability::kTimeoutReset))
886 .WillOnce(SaveArg<1>(&reset_callback));
887
888 capability_->Reset(&error, ResultCallback());
889 EXPECT_TRUE(capability_->resetting_);
890 reset_callback.Run(error);
891 EXPECT_FALSE(capability_->resetting_);
892}
893
Gary Morainceba6aa2012-05-03 10:28:26 -0700894// Validates that OnScanReply does not crash with a null callback.
Arman Uguray1361c032013-02-11 17:53:39 -0800895TEST_F(CellularCapabilityUniversalMainTest, ScanWithNullCallback) {
Gary Morainceba6aa2012-05-03 10:28:26 -0700896 Error error;
897 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
898 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
899 EXPECT_CALL(*device_adaptor_,
900 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
901 SizeIs(0)));
902 Set3gppProxy();
903 capability_->Scan(&error, ResultCallback());
904 EXPECT_TRUE(error.IsSuccess());
905}
906
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400907// Validates that the scanning property is updated
Arman Uguray1361c032013-02-11 17:53:39 -0800908TEST_F(CellularCapabilityUniversalMainTest, Scan) {
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400909 Error error;
910
911 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
912 .WillRepeatedly(SaveArg<1>(&scan_callback_));
913 EXPECT_CALL(*device_adaptor_,
914 EmitBoolChanged(flimflam::kScanningProperty, true));
915 Set3gppProxy();
916 capability_->Scan(&error, ResultCallback());
917 EXPECT_TRUE(capability_->scanning_);
918
919 // Simulate the completion of the scan with 2 networks in the results.
920 EXPECT_CALL(*device_adaptor_,
921 EmitBoolChanged(flimflam::kScanningProperty, false));
922 EXPECT_CALL(*device_adaptor_,
923 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
924 SizeIs(2)));
925 vector<DBusPropertiesMap> results;
926 const char kScanID0[] = "testID0";
927 const char kScanID1[] = "testID1";
928 results.push_back(DBusPropertiesMap());
929 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
930 writer().append_string(kScanID0);
931 results.push_back(DBusPropertiesMap());
932 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
933 writer().append_string(kScanID1);
934 scan_callback_.Run(results, error);
935 EXPECT_FALSE(capability_->scanning_);
936
937 // Simulate the completion of the scan with no networks in the results.
938 EXPECT_CALL(*device_adaptor_,
939 EmitBoolChanged(flimflam::kScanningProperty, true));
940 capability_->Scan(&error, ResultCallback());
941 EXPECT_TRUE(capability_->scanning_);
942 EXPECT_CALL(*device_adaptor_,
943 EmitBoolChanged(flimflam::kScanningProperty, false));
944 EXPECT_CALL(*device_adaptor_,
945 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
946 SizeIs(0)));
947 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
948 EXPECT_FALSE(capability_->scanning_);
949}
950
951// Validates expected property updates when scan fails
Arman Uguray1361c032013-02-11 17:53:39 -0800952TEST_F(CellularCapabilityUniversalMainTest, ScanFailure) {
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400953 Error error;
954
955 // Test immediate error
956 {
957 InSequence seq;
958 EXPECT_CALL(*modem_3gpp_proxy_,
959 Scan(_, _, CellularCapability::kTimeoutScan))
960 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
961 EXPECT_CALL(*modem_3gpp_proxy_,
962 Scan(_, _, CellularCapability::kTimeoutScan))
963 .WillOnce(SaveArg<1>(&scan_callback_));
964 }
965 Set3gppProxy();
966 capability_->Scan(&error, ResultCallback());
967 EXPECT_FALSE(capability_->scanning_);
968 EXPECT_TRUE(error.IsFailure());
969
970 // Initiate a scan
971 error.Populate(Error::kSuccess);
972 EXPECT_CALL(*device_adaptor_,
973 EmitBoolChanged(flimflam::kScanningProperty, true));
974 capability_->Scan(&error, ResultCallback());
975 EXPECT_TRUE(capability_->scanning_);
976 EXPECT_TRUE(error.IsSuccess());
977
978 // Validate that error is returned if Scan is called while already scanning.
979 capability_->Scan(&error, ResultCallback());
980 EXPECT_TRUE(capability_->scanning_);
981 EXPECT_TRUE(error.IsFailure());
982
983 // Validate that signals are emitted even if an error is reported.
984 capability_->found_networks_.clear();
985 capability_->found_networks_.push_back(Stringmap());
986 EXPECT_CALL(*device_adaptor_,
987 EmitBoolChanged(flimflam::kScanningProperty, false));
988 EXPECT_CALL(*device_adaptor_,
989 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
990 SizeIs(0)));
991 vector<DBusPropertiesMap> results;
992 scan_callback_.Run(results, Error(Error::kOperationFailed));
993 EXPECT_FALSE(capability_->scanning_);
994}
995
Arman Uguray6e5639f2012-11-15 20:30:19 -0800996// Validates expected behavior of OnListBearersReply function
Arman Uguray1361c032013-02-11 17:53:39 -0800997TEST_F(CellularCapabilityUniversalMainTest, OnListBearersReply) {
Arman Uguray6e5639f2012-11-15 20:30:19 -0800998 // Check that bearer_path_ is set correctly when an active bearer
999 // is returned.
1000 const size_t kPathCount = 3;
1001 DBus::Path active_paths[kPathCount], inactive_paths[kPathCount];
1002 for (size_t i = 0; i < kPathCount; ++i) {
1003 active_paths[i] =
1004 DBus::Path(base::StringPrintf("%s/%zu", kActiveBearerPathPrefix, i));
1005 inactive_paths[i] =
1006 DBus::Path(base::StringPrintf("%s/%zu", kInactiveBearerPathPrefix, i));
1007 }
1008
1009 std::vector<DBus::Path> paths;
1010 paths.push_back(inactive_paths[0]);
1011 paths.push_back(inactive_paths[1]);
1012 paths.push_back(active_paths[2]);
1013 paths.push_back(inactive_paths[1]);
1014 paths.push_back(inactive_paths[2]);
1015
1016 Error error;
1017 capability_->OnListBearersReply(paths, error);
1018 EXPECT_STREQ(capability_->bearer_path_.c_str(), active_paths[2].c_str());
1019
1020 paths.clear();
1021
1022 // Check that bearer_path_ is empty if no active bearers are returned.
1023 paths.push_back(inactive_paths[0]);
1024 paths.push_back(inactive_paths[1]);
1025 paths.push_back(inactive_paths[2]);
1026 paths.push_back(inactive_paths[1]);
1027
1028 capability_->OnListBearersReply(paths, error);
1029 EXPECT_TRUE(capability_->bearer_path_.empty());
1030
1031 // Check that returning multiple bearers causes death.
1032 paths.push_back(active_paths[0]);
1033 paths.push_back(inactive_paths[1]);
1034 paths.push_back(inactive_paths[2]);
1035 paths.push_back(active_paths[1]);
1036 paths.push_back(inactive_paths[1]);
1037
1038 EXPECT_DEATH(capability_->OnListBearersReply(paths, error),
1039 "Found more than one active bearer.");
1040}
1041
Jason Glasgow14521872012-05-07 19:12:15 -04001042// Validates expected behavior of Connect function
Arman Uguray1361c032013-02-11 17:53:39 -08001043TEST_F(CellularCapabilityUniversalMainTest, Connect) {
Jason Glasgow14521872012-05-07 19:12:15 -04001044 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
1045 SetSimpleProxy();
1046 Error error;
1047 DBusPropertiesMap properties;
1048 capability_->apn_try_list_.clear();
1049 ResultCallback callback =
1050 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
1051 DBus::Path bearer("/foo");
1052
1053 // Test connect failures
1054 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
1055 .WillOnce(SaveArg<2>(&connect_callback_));
1056 capability_->Connect(properties, &error, callback);
1057 EXPECT_TRUE(error.IsSuccess());
1058 EXPECT_CALL(*this, TestCallback(IsFailure()));
1059 EXPECT_CALL(*service_, ClearLastGoodApn());
1060 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
1061
1062 // Test connect success
1063 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
1064 .WillOnce(SaveArg<2>(&connect_callback_));
1065 capability_->Connect(properties, &error, callback);
1066 EXPECT_TRUE(error.IsSuccess());
1067 EXPECT_CALL(*this, TestCallback(IsSuccess()));
1068 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -04001069
1070 // Test connect failures without a service. Make sure that shill
1071 // does not crash if the connect failed and there is no
1072 // CellularService object. This can happen if the modem is enabled
1073 // and then quickly disabled.
1074 cellular_->service_ = NULL;
1075 EXPECT_FALSE(capability_->cellular()->service());
1076 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
1077 .WillOnce(SaveArg<2>(&connect_callback_));
1078 capability_->Connect(properties, &error, callback);
1079 EXPECT_TRUE(error.IsSuccess());
1080 EXPECT_CALL(*this, TestCallback(IsFailure()));
1081 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -04001082}
1083
1084// Validates Connect iterates over APNs
Arman Uguray1361c032013-02-11 17:53:39 -08001085TEST_F(CellularCapabilityUniversalMainTest, ConnectApns) {
Jason Glasgow14521872012-05-07 19:12:15 -04001086 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
1087 SetSimpleProxy();
1088 Error error;
1089 DBusPropertiesMap properties;
1090 capability_->apn_try_list_.clear();
1091 ResultCallback callback =
1092 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
1093 DBus::Path bearer("/bearer0");
1094
1095 const char apn_name_foo[] = "foo";
1096 const char apn_name_bar[] = "bar";
1097 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
1098 .WillOnce(SaveArg<2>(&connect_callback_));
1099 Stringmap apn1;
1100 apn1[flimflam::kApnProperty] = apn_name_foo;
1101 capability_->apn_try_list_.push_back(apn1);
1102 Stringmap apn2;
1103 apn2[flimflam::kApnProperty] = apn_name_bar;
1104 capability_->apn_try_list_.push_back(apn2);
1105 capability_->FillConnectPropertyMap(&properties);
1106 capability_->Connect(properties, &error, callback);
1107 EXPECT_TRUE(error.IsSuccess());
1108
1109 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
1110 .WillOnce(SaveArg<2>(&connect_callback_));
1111 EXPECT_CALL(*service_, ClearLastGoodApn());
1112 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
1113
1114 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
1115 EXPECT_CALL(*this, TestCallback(IsSuccess()));
1116 connect_callback_.Run(bearer, Error(Error::kSuccess));
1117}
1118
Jason Glasgow9f09aef2012-05-08 16:26:55 -04001119// Validates GetTypeString and AccessTechnologyToTechnologyFamily
Arman Uguray1361c032013-02-11 17:53:39 -08001120TEST_F(CellularCapabilityUniversalMainTest, GetTypeString) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -04001121 const int gsm_technologies[] = {
1122 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
1123 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
1124 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
1125 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
1126 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
1127 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
1128 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
1129 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
1130 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
1131 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
1132 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
1133 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
1134 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
1135 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
1136 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
1137 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
1138 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
1139 };
Ben Chan62028b22012-11-05 11:20:02 -08001140 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -04001141 capability_->access_technologies_ = gsm_technologies[i];
1142 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
1143 }
1144 const int cdma_technologies[] = {
1145 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
1146 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
1147 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
1148 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
1149 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
1150 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
1151 };
Ben Chan62028b22012-11-05 11:20:02 -08001152 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -04001153 capability_->access_technologies_ = cdma_technologies[i];
1154 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
1155 }
1156 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
1157 ASSERT_EQ(capability_->GetTypeString(), "");
1158}
1159
Arman Uguray1361c032013-02-11 17:53:39 -08001160TEST_F(CellularCapabilityUniversalMainTest, AllowRoaming) {
Darin Petkovf508c822012-09-21 13:43:17 +02001161 EXPECT_FALSE(cellular_->allow_roaming_);
1162 EXPECT_FALSE(capability_->provider_requires_roaming_);
1163 EXPECT_FALSE(capability_->AllowRoaming());
1164 capability_->provider_requires_roaming_ = true;
1165 EXPECT_TRUE(capability_->AllowRoaming());
1166 capability_->provider_requires_roaming_ = false;
1167 cellular_->allow_roaming_ = true;
1168 EXPECT_TRUE(capability_->AllowRoaming());
1169}
1170
Arman Uguray1361c032013-02-11 17:53:39 -08001171TEST_F(CellularCapabilityUniversalMainTest, SetHomeProvider) {
Darin Petkovb4fccd22012-08-10 11:59:26 +02001172 static const char kTestCarrier[] = "The Cellular Carrier";
1173 static const char kCountry[] = "us";
1174 static const char kCode[] = "310160";
Darin Petkovb4fccd22012-08-10 11:59:26 +02001175
Darin Petkovf508c822012-09-21 13:43:17 +02001176 EXPECT_FALSE(capability_->home_provider_);
1177 EXPECT_FALSE(capability_->provider_requires_roaming_);
1178
Arman Ugurayd73783f2013-01-31 16:11:21 -08001179 // No mobile provider DB available.
1180 capability_->SetHomeProvider();
Darin Petkovb4fccd22012-08-10 11:59:26 +02001181 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
1182 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
1183 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +02001184 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001185
1186 InitProviderDB();
Arman Ugurayd73783f2013-01-31 16:11:21 -08001187
1188 // IMSI and Operator Code not available.
1189 capability_->SetHomeProvider();
1190 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
1191 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
1192 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
1193 EXPECT_FALSE(capability_->provider_requires_roaming_);
1194
1195 // Operator Code available.
1196 capability_->operator_id_ = "310240";
1197 capability_->SetHomeProvider();
1198 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
1199 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1200 EXPECT_EQ("310240", cellular_->home_provider().GetCode());
1201 EXPECT_EQ(4, capability_->apn_list_.size());
1202 ASSERT_TRUE(capability_->home_provider_);
1203 EXPECT_FALSE(capability_->provider_requires_roaming_);
1204
1205 cellular_->home_provider_.SetName("");
1206 cellular_->home_provider_.SetCountry("");
1207 cellular_->home_provider_.SetCode("");
1208
1209 // IMSI available
1210 capability_->imsi_ = "310240123456789";
1211 capability_->operator_id_.clear();
Darin Petkovb4fccd22012-08-10 11:59:26 +02001212 capability_->SetHomeProvider();
1213 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
1214 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1215 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
1216 EXPECT_EQ(4, capability_->apn_list_.size());
1217 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001218 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001219
1220 Cellular::Operator oper;
1221 cellular_->set_home_provider(oper);
1222 capability_->spn_ = kTestCarrier;
1223 capability_->SetHomeProvider();
1224 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
1225 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1226 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +02001227 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001228
1229 static const char kCubic[] = "Cubic";
1230 capability_->spn_ = kCubic;
1231 capability_->SetHomeProvider();
1232 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
1233 EXPECT_EQ("", cellular_->home_provider().GetCode());
1234 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001235 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001236
1237 static const char kCUBIC[] = "CUBIC";
1238 capability_->spn_ = kCUBIC;
1239 capability_->home_provider_ = NULL;
1240 capability_->SetHomeProvider();
1241 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
1242 EXPECT_EQ("", cellular_->home_provider().GetCode());
1243 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001244 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001245}
1246
Arman Uguray1361c032013-02-11 17:53:39 -08001247TEST_F(CellularCapabilityUniversalMainTest, UpdateScanningProperty) {
Ben Chan8a2c01e2013-01-23 10:09:14 -08001248 // Save pointers to proxies before they are lost by the call to InitProxies
1249 // mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
1250 SetUp();
1251 //EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
1252 capability_->InitProxies();
1253
1254 EXPECT_FALSE(capability_->scanning_or_searching_);
1255 capability_->UpdateScanningProperty();
1256 EXPECT_FALSE(capability_->scanning_or_searching_);
1257
1258 capability_->scanning_ = true;
1259 capability_->UpdateScanningProperty();
1260 EXPECT_TRUE(capability_->scanning_or_searching_);
1261
1262 capability_->scanning_ = false;
1263 capability_->cellular()->modem_state_ = Cellular::kModemStateInitializing;
1264 capability_->UpdateScanningProperty();
1265 EXPECT_FALSE(capability_->scanning_or_searching_);
1266 capability_->cellular()->modem_state_ = Cellular::kModemStateLocked;
1267 capability_->UpdateScanningProperty();
1268 EXPECT_FALSE(capability_->scanning_or_searching_);
1269 capability_->cellular()->modem_state_ = Cellular::kModemStateDisabled;
1270 capability_->UpdateScanningProperty();
1271 EXPECT_FALSE(capability_->scanning_or_searching_);
1272 capability_->cellular()->modem_state_ = Cellular::kModemStateEnabling;
1273 capability_->UpdateScanningProperty();
1274 EXPECT_TRUE(capability_->scanning_or_searching_);
1275 capability_->cellular()->modem_state_ = Cellular::kModemStateEnabled;
1276 capability_->UpdateScanningProperty();
1277 EXPECT_TRUE(capability_->scanning_or_searching_);
1278 capability_->cellular()->modem_state_ = Cellular::kModemStateSearching;
1279 capability_->UpdateScanningProperty();
1280 EXPECT_TRUE(capability_->scanning_or_searching_);
1281 capability_->cellular()->modem_state_ = Cellular::kModemStateRegistered;
1282 capability_->UpdateScanningProperty();
1283 EXPECT_FALSE(capability_->scanning_or_searching_);
1284 capability_->cellular()->modem_state_ = Cellular::kModemStateConnecting;
1285 capability_->UpdateScanningProperty();
1286 EXPECT_FALSE(capability_->scanning_or_searching_);
1287 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
1288 capability_->UpdateScanningProperty();
1289 EXPECT_FALSE(capability_->scanning_or_searching_);
1290 capability_->cellular()->modem_state_ = Cellular::kModemStateDisconnecting;
1291 capability_->UpdateScanningProperty();
1292 EXPECT_FALSE(capability_->scanning_or_searching_);
Ben Chane1e1e562013-01-26 00:39:01 -08001293
Ben Chan40a2f862013-02-13 17:44:38 -08001294 // Modem with an unactivated service in the 'enabled' or 'searching' state
1295 capability_->cellular()->modem_state_ = Cellular::kModemStateEnabled;
Ben Chane1e1e562013-01-26 00:39:01 -08001296 capability_->mdn_ = "0000000000";
1297 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1298 CellularService::OLP olp;
1299 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
Ben Chan40a2f862013-02-13 17:44:38 -08001300 .WillRepeatedly(Return(&olp));
1301 capability_->UpdateScanningProperty();
1302 EXPECT_FALSE(capability_->scanning_or_searching_);
1303
1304 capability_->cellular()->modem_state_ = Cellular::kModemStateSearching;
Ben Chane1e1e562013-01-26 00:39:01 -08001305 capability_->UpdateScanningProperty();
1306 EXPECT_FALSE(capability_->scanning_or_searching_);
Ben Chan8a2c01e2013-01-23 10:09:14 -08001307}
1308
Arman Uguray1361c032013-02-11 17:53:39 -08001309TEST_F(CellularCapabilityUniversalTimerTest, UpdateScanningPropertyTimeout) {
1310 SetUp();
1311 capability_->InitProxies();
1312
1313 EXPECT_FALSE(capability_->scanning_or_searching_);
1314 EXPECT_TRUE(
1315 capability_->scanning_or_searching_timeout_callback_.IsCancelled());
1316 capability_->UpdateScanningProperty();
1317 EXPECT_FALSE(capability_->scanning_or_searching_);
1318 EXPECT_TRUE(
1319 capability_->scanning_or_searching_timeout_callback_.IsCancelled());
1320
1321 EXPECT_CALL(mock_dispatcher_,
1322 PostDelayedTask(
1323 _,
1324 CellularCapabilityUniversal::
1325 kDefaultScanningOrSearchingTimeoutMilliseconds));
1326
1327 capability_->scanning_ = true;
1328 capability_->UpdateScanningProperty();
1329 EXPECT_FALSE(
1330 capability_->scanning_or_searching_timeout_callback_.IsCancelled());
1331 EXPECT_TRUE(capability_->scanning_or_searching_);
1332
1333 EXPECT_CALL(mock_dispatcher_,
1334 PostDelayedTask(
1335 _,
1336 CellularCapabilityUniversal::
1337 kDefaultScanningOrSearchingTimeoutMilliseconds))
1338 .Times(0);
1339
1340 capability_->scanning_ = false;
1341 capability_->UpdateScanningProperty();
1342 EXPECT_TRUE(
1343 capability_->scanning_or_searching_timeout_callback_.IsCancelled());
1344 EXPECT_FALSE(capability_->scanning_or_searching_);
1345
1346 EXPECT_CALL(mock_dispatcher_,
1347 PostDelayedTask(
1348 _,
1349 CellularCapabilityUniversal::
1350 kDefaultScanningOrSearchingTimeoutMilliseconds))
1351 .WillOnce(InvokeWithoutArgs(
1352 this,
1353 &CellularCapabilityUniversalTest::InvokeScanningOrSearchingTimeout));
1354
1355 capability_->scanning_ = true;
1356 capability_->UpdateScanningProperty();
1357 // The callback has been scheduled
1358 EXPECT_FALSE(
1359 capability_->scanning_or_searching_timeout_callback_.IsCancelled());
1360 // Our mock invocation worked
1361 EXPECT_FALSE(capability_->scanning_or_searching_);
1362}
1363
1364TEST_F(CellularCapabilityUniversalMainTest, UpdateStorageIdentifier) {
Arman Ugurayc9533572013-01-22 17:34:20 -08001365 CellularOperatorInfo::CellularOperator provider;
1366 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1367
1368 SetService();
1369
1370 const string prefix = "cellular_" + string(kMachineAddress) + "_";
Arman Uguray2717a102013-01-29 23:36:06 -08001371 string default_identifier_pattern =
1372 prefix + string(CellularCapabilityUniversal::kGenericServiceNamePrefix);
1373 std::replace_if(default_identifier_pattern.begin(),
1374 default_identifier_pattern.end(),
1375 &Service::IllegalChar, '_');
1376 default_identifier_pattern += "*";
Arman Ugurayc9533572013-01-22 17:34:20 -08001377
1378 // |capability_->operator_id_| is "".
1379 capability_->UpdateStorageIdentifier();
1380 EXPECT_TRUE(::MatchPattern(cellular_->service()->storage_identifier_,
1381 default_identifier_pattern));
1382
1383 // GetCellularOperatorByMCCMNC returns NULL.
1384 capability_->operator_id_ = "1";
1385 EXPECT_CALL(cellular_operator_info_,
1386 GetCellularOperatorByMCCMNC(capability_->operator_id_))
1387 .WillOnce(
1388 Return((const CellularOperatorInfo::CellularOperator *)NULL));
1389
1390 capability_->UpdateStorageIdentifier();
1391 EXPECT_TRUE(::MatchPattern(cellular_->service()->storage_identifier_,
1392 default_identifier_pattern));
1393
1394 // |capability_->imsi_| is not ""
1395 capability_->imsi_ = "TESTIMSI";
1396 EXPECT_CALL(cellular_operator_info_,
1397 GetCellularOperatorByMCCMNC(capability_->operator_id_))
1398 .WillOnce(
1399 Return((const CellularOperatorInfo::CellularOperator *)NULL));
1400
1401 capability_->UpdateStorageIdentifier();
1402 EXPECT_EQ(prefix + "TESTIMSI", cellular_->service()->storage_identifier_);
1403
1404 EXPECT_CALL(cellular_operator_info_,
1405 GetCellularOperatorByMCCMNC(capability_->operator_id_))
1406 .Times(2)
1407 .WillRepeatedly(Return(&provider));
1408
1409 // |provider.identifier_| is "".
1410 capability_->UpdateStorageIdentifier();
1411 EXPECT_EQ(prefix + "TESTIMSI", cellular_->service()->storage_identifier_);
1412
1413 // Success.
1414 provider.identifier_ = "testidentifier";
1415 capability_->UpdateStorageIdentifier();
1416 EXPECT_EQ(prefix + "testidentifier",
1417 cellular_->service()->storage_identifier_);
1418}
1419
Arman Uguray1361c032013-02-11 17:53:39 -08001420TEST_F(CellularCapabilityUniversalMainTest, UpdateOLP) {
Ben Chan6d0d1e72012-11-06 21:19:28 -08001421 CellularService::OLP test_olp;
1422 test_olp.SetURL("http://testurl");
1423 test_olp.SetMethod("POST");
1424 test_olp.SetPostData("esn=${esn}&imei=${imei}&imsi=${imsi}&mdn=${mdn}&"
1425 "meid=${meid}&min=${min}&iccid=${iccid}");
1426
Ben Chan6d0d1e72012-11-06 21:19:28 -08001427 capability_->esn_ = "0";
1428 capability_->imei_ = "1";
1429 capability_->imsi_ = "2";
1430 capability_->mdn_ = "3";
1431 capability_->meid_= "4";
1432 capability_->min_ = "5";
1433 capability_->sim_identifier_ = "6";
1434 capability_->operator_id_ = "123456";
1435 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1436
Arman Ugurayf4c61812013-01-10 18:58:39 -08001437 EXPECT_CALL(cellular_operator_info_,
1438 GetOLPByMCCMNC(capability_->operator_id_))
1439 .WillRepeatedly(Return(&test_olp));
Ben Chan6d0d1e72012-11-06 21:19:28 -08001440
1441 SetService();
1442 capability_->UpdateOLP();
1443 const CellularService::OLP &olp = cellular_->service()->olp();
1444 EXPECT_EQ("http://testurl", olp.GetURL());
1445 EXPECT_EQ("POST", olp.GetMethod());
1446 EXPECT_EQ("esn=0&imei=1&imsi=2&mdn=3&meid=4&min=5&iccid=6",
1447 olp.GetPostData());
1448}
1449
Arman Ugurayc7b15602013-02-16 00:56:18 -08001450TEST_F(CellularCapabilityUniversalMainTest, IsMdnValid) {
1451 capability_->mdn_.clear();
1452 EXPECT_FALSE(capability_->IsMdnValid());
1453 capability_->mdn_ = "0000000";
1454 EXPECT_FALSE(capability_->IsMdnValid());
1455 capability_->mdn_ = "0000001";
1456 EXPECT_TRUE(capability_->IsMdnValid());
1457 capability_->mdn_ = "1231223";
1458 EXPECT_TRUE(capability_->IsMdnValid());
1459}
1460
Arman Ugurayefea6e02013-02-21 13:28:04 -08001461TEST_F(CellularCapabilityUniversalMainTest, CompleteActivation) {
1462 const char kIccid[] = "1234567";
1463
1464 capability_->mdn_.clear();
1465 capability_->sim_identifier_.clear();
1466 SetMockIccidStore();
1467
1468 EXPECT_CALL(mock_iccid_store_,
1469 SetActivationState(kIccid, ActivatingIccidStore::kStatePending))
1470 .Times(0);
1471 EXPECT_CALL(*service_,
1472 SetActivationState(flimflam::kActivationStateActivating))
1473 .Times(0);
1474 EXPECT_CALL(mock_iccid_store_, SetActivationState(_, _)).Times(0);
1475 Error error;
1476 capability_->CompleteActivation(&error);
1477 Mock::VerifyAndClearExpectations(this);
1478
1479 capability_->sim_identifier_ = kIccid;
1480 EXPECT_CALL(mock_iccid_store_,
1481 SetActivationState(kIccid, ActivatingIccidStore::kStatePending))
1482 .Times(1);
1483 EXPECT_CALL(*service_,
1484 SetActivationState(flimflam::kActivationStateActivating))
1485 .Times(1);
1486 capability_->CompleteActivation(&error);
1487 Mock::VerifyAndClearExpectations(this);
1488
1489 EXPECT_CALL(mock_iccid_store_,
1490 SetActivationState(kIccid, ActivatingIccidStore::kStatePending))
1491 .Times(0);
1492 EXPECT_CALL(*service_,
1493 SetActivationState(flimflam::kActivationStateActivating))
1494 .Times(0);
1495 capability_->mdn_ = "1231231212";
1496 capability_->CompleteActivation(&error);
1497}
1498
1499TEST_F(CellularCapabilityUniversalMainTest, UpdateServiceActivationState) {
1500 const char kIccid[] = "1234567";
1501 SetMockIccidStore();
1502 capability_->sim_identifier_.clear();
1503 capability_->mdn_ = "0000000000";
1504 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1505 CellularService::OLP olp;
1506 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
1507 .WillRepeatedly(Return(&olp));
1508
1509 EXPECT_CALL(*service_,
1510 SetActivationState(flimflam::kActivationStateNotActivated))
1511 .Times(1);
1512 capability_->UpdateServiceActivationState();
1513 Mock::VerifyAndClearExpectations(this);
1514
1515 capability_->mdn_ = "1231231122";
1516 EXPECT_CALL(*service_,
1517 SetActivationState(flimflam::kActivationStateActivated))
1518 .Times(1);
1519 capability_->UpdateServiceActivationState();
1520 Mock::VerifyAndClearExpectations(this);
1521
1522 capability_->mdn_ = "0000000000";
1523 capability_->sim_identifier_ = kIccid;
1524 EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
1525 .Times(2)
1526 .WillRepeatedly(Return(ActivatingIccidStore::kStatePending));
1527 EXPECT_CALL(*service_,
1528 SetActivationState(flimflam::kActivationStateActivating))
1529 .Times(1);
1530 capability_->UpdateServiceActivationState();
1531 Mock::VerifyAndClearExpectations(this);
1532
1533 EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
1534 .Times(2)
1535 .WillRepeatedly(Return(ActivatingIccidStore::kStateActivated));
1536 EXPECT_CALL(*service_,
1537 SetActivationState(flimflam::kActivationStateActivated))
1538 .Times(1);
1539 capability_->UpdateServiceActivationState();
1540}
1541
Arman Ugurayc7b15602013-02-16 00:56:18 -08001542TEST_F(CellularCapabilityUniversalMainTest, UpdateIccidActivationState) {
1543 const char kIccid[] = "1234567";
1544
1545 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
1546 SetMockIccidStore();
1547 capability_->InitProxies();
1548 capability_->registration_state_ =
1549 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
1550
1551 // No MDN, no ICCID.
1552 capability_->mdn_ = "0000000";
1553 capability_->sim_identifier_.clear();
1554 EXPECT_CALL(mock_iccid_store_, GetActivationState(_)).Times(0);
1555 capability_->UpdateIccidActivationState();
1556
1557 // ICCID known.
1558 capability_->sim_identifier_ = kIccid;
1559
1560 // After the modem has reset.
1561 capability_->reset_done_ = true;
1562 EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
1563 .Times(1).WillOnce(Return(ActivatingIccidStore::kStatePending));
1564 EXPECT_CALL(mock_iccid_store_,
1565 SetActivationState(kIccid,
1566 ActivatingIccidStore::kStateActivated))
1567 .Times(1);
1568 capability_->UpdateIccidActivationState();
1569
1570 // Before reset, not registered.
1571 capability_->reset_done_ = false;
1572 EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
1573 .Times(2).WillRepeatedly(Return(ActivatingIccidStore::kStatePending));
Arman Ugurayefea6e02013-02-21 13:28:04 -08001574 EXPECT_CALL(*service_,
1575 SetActivationState(flimflam::kActivationStateActivating))
1576 .Times(2);
Arman Ugurayc7b15602013-02-16 00:56:18 -08001577 EXPECT_CALL(*modem_proxy, Reset(_, _, _)).Times(0);
1578 capability_->UpdateIccidActivationState();
1579
1580 // Before reset, registered.
1581 capability_->registration_state_ =
1582 MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
1583 EXPECT_CALL(*modem_proxy, Reset(_, _, _)).Times(1);
1584 capability_->UpdateIccidActivationState();
1585
1586 // Not registered.
1587 capability_->registration_state_ =
1588 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
1589 EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
1590 .Times(2).WillRepeatedly(Return(ActivatingIccidStore::kStateActivated));
1591 EXPECT_CALL(*service_, AutoConnect()).Times(0);
1592 capability_->UpdateIccidActivationState();
1593
1594 // Service, registered.
1595 capability_->registration_state_ =
1596 MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
1597 EXPECT_CALL(*service_, AutoConnect()).Times(1);
1598 capability_->UpdateIccidActivationState();
1599
1600 cellular_->service_->activation_state_ =
1601 flimflam::kActivationStateNotActivated;
1602
1603 // Device is connected.
1604 cellular_->state_ = Cellular::kStateConnected;
1605 EXPECT_CALL(*service_,
1606 SetActivationState(flimflam::kActivationStateActivated))
1607 .Times(3);
1608 capability_->UpdateIccidActivationState();
1609
1610 // Device is linked.
1611 cellular_->state_ = Cellular::kStateLinked;
1612 capability_->UpdateIccidActivationState();
1613
1614 // Got valid MDN.
1615 cellular_->state_ = Cellular::kStateRegistered;
1616 capability_->mdn_ = "1231223";
1617 EXPECT_CALL(mock_iccid_store_, RemoveEntry(kIccid)).Times(1);
1618 capability_->UpdateIccidActivationState();
1619}
1620
Arman Uguray1361c032013-02-11 17:53:39 -08001621TEST_F(CellularCapabilityUniversalMainTest, UpdateOperatorInfo) {
Darin Petkova4ca3c32012-08-17 16:05:24 +02001622 static const char kOperatorName[] = "Swisscom";
1623 InitProviderDB();
1624 capability_->serving_operator_.SetCode("22801");
1625 SetService();
1626 capability_->UpdateOperatorInfo();
1627 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
1628 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1629 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
1630
1631 static const char kTestOperator[] = "Testcom";
1632 capability_->serving_operator_.SetName(kTestOperator);
1633 capability_->serving_operator_.SetCountry("");
1634 capability_->UpdateOperatorInfo();
1635 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
1636 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1637 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
1638}
1639
Arman Uguray1361c032013-02-11 17:53:39 -08001640TEST_F(CellularCapabilityUniversalMainTest, UpdateOperatorInfoViaOperatorId) {
Ben Chan092b12b2012-11-07 22:04:05 -08001641 static const char kOperatorName[] = "Swisscom";
1642 static const char kOperatorId[] = "22801";
1643 InitProviderDB();
1644 capability_->serving_operator_.SetCode("");
1645 SetService();
1646 capability_->UpdateOperatorInfo();
1647 EXPECT_EQ("", capability_->serving_operator_.GetName());
1648 EXPECT_EQ("", capability_->serving_operator_.GetCountry());
1649 EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
1650
1651 capability_->operator_id_ = kOperatorId;
1652
Ben Chan092b12b2012-11-07 22:04:05 -08001653 capability_->UpdateOperatorInfo();
1654 EXPECT_EQ(kOperatorId, capability_->serving_operator_.GetCode());
1655 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
1656 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1657 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
1658}
1659
Arman Uguray1361c032013-02-11 17:53:39 -08001660TEST_F(CellularCapabilityUniversalMainTest, CreateFriendlyServiceName) {
Darin Petkova4ca3c32012-08-17 16:05:24 +02001661 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
Arman Uguray2717a102013-01-29 23:36:06 -08001662 EXPECT_EQ("Mobile Network 0", capability_->CreateFriendlyServiceName());
1663 EXPECT_EQ("Mobile Network 1", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +02001664
Ben Chan092b12b2012-11-07 22:04:05 -08001665 capability_->operator_id_ = "0123";
Ben Chan092b12b2012-11-07 22:04:05 -08001666 EXPECT_EQ("cellular_0123", capability_->CreateFriendlyServiceName());
1667 EXPECT_EQ("0123", capability_->serving_operator_.GetCode());
1668
Darin Petkova4ca3c32012-08-17 16:05:24 +02001669 capability_->serving_operator_.SetCode("1234");
1670 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
1671
1672 static const char kHomeProvider[] = "The GSM Home Provider";
1673 cellular_->home_provider_.SetName(kHomeProvider);
1674 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
1675 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
1676 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
1677
1678 static const char kTestOperator[] = "A GSM Operator";
1679 capability_->serving_operator_.SetName(kTestOperator);
1680 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
1681
1682 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
1683 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
1684 capability_->CreateFriendlyServiceName());
1685}
1686
Arman Uguray1361c032013-02-11 17:53:39 -08001687TEST_F(CellularCapabilityUniversalMainTest, IsServiceActivationRequired) {
Ben Chan15786032012-11-04 21:28:02 -08001688 capability_->mdn_ = "0000000000";
1689 cellular_->cellular_operator_info_ = NULL;
Arman Ugurayefea6e02013-02-21 13:28:04 -08001690 SetMockIccidStore();
Ben Chan15786032012-11-04 21:28:02 -08001691 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1692
1693 cellular_->cellular_operator_info_ = &cellular_operator_info_;
Arman Ugurayf4c61812013-01-10 18:58:39 -08001694 CellularService::OLP olp;
1695 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
1696 .WillOnce(Return((const CellularService::OLP *)NULL))
1697 .WillRepeatedly(Return(&olp));
Ben Chan15786032012-11-04 21:28:02 -08001698 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1699
1700 capability_->mdn_ = "";
1701 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1702 capability_->mdn_ = "1234567890";
1703 EXPECT_FALSE(capability_->IsServiceActivationRequired());
Ben Chan15786032012-11-04 21:28:02 -08001704 capability_->mdn_ = "0000000000";
1705 EXPECT_TRUE(capability_->IsServiceActivationRequired());
Arman Ugurayefea6e02013-02-21 13:28:04 -08001706
1707 const char kIccid[] = "1234567890";
1708 capability_->sim_identifier_ = kIccid;
1709 EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
1710 .Times(1)
1711 .WillOnce(Return(ActivatingIccidStore::kStateActivated));
1712 EXPECT_FALSE(capability_->IsServiceActivationRequired());
Ben Chan15786032012-11-04 21:28:02 -08001713}
1714
Arman Uguray1361c032013-02-11 17:53:39 -08001715TEST_F(CellularCapabilityUniversalMainTest, OnModemCurrentCapabilitiesChanged) {
Ben Chanfcca27b2013-01-22 15:03:44 -08001716 EXPECT_FALSE(capability_->scanning_supported_);
1717 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_LTE);
1718 EXPECT_FALSE(capability_->scanning_supported_);
1719 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_CDMA_EVDO);
1720 EXPECT_FALSE(capability_->scanning_supported_);
1721 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_GSM_UMTS);
1722 EXPECT_TRUE(capability_->scanning_supported_);
1723 capability_->OnModemCurrentCapabilitiesChanged(
1724 MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO);
1725 EXPECT_TRUE(capability_->scanning_supported_);
1726}
1727
Jason Glasgowef965562012-04-10 16:12:35 -04001728} // namespace shill