blob: 8a7ac73f175060874b25d54a9caef725ac233bd8 [file] [log] [blame]
Jason Glasgowef965562012-04-10 16:12:35 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular_capability_universal.h"
6
Nathan Williams4b7c2a82012-04-13 15:19:47 -04007#include <string>
8#include <vector>
9
Jason Glasgowef965562012-04-10 16:12:35 -040010#include <base/bind.h>
Darin Petkova4ca3c32012-08-17 16:05:24 +020011#include <base/stringprintf.h>
Jason Glasgowef965562012-04-10 16:12:35 -040012#include <chromeos/dbus/service_constants.h>
13#include <gtest/gtest.h>
14#include <mobile_provider.h>
Ben Chan5c853ef2012-10-05 00:05:37 -070015#include <ModemManager/ModemManager.h>
Jason Glasgowef965562012-04-10 16:12:35 -040016
17#include "shill/cellular.h"
18#include "shill/cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040019#include "shill/dbus_adaptor.h"
Jason Glasgowef965562012-04-10 16:12:35 -040020#include "shill/error.h"
21#include "shill/event_dispatcher.h"
22#include "shill/mock_adaptors.h"
Ben Chan15786032012-11-04 21:28:02 -080023#include "shill/mock_cellular_operator_info.h"
Jason Glasgow14521872012-05-07 19:12:15 -040024#include "shill/mock_cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040025#include "shill/mock_dbus_properties_proxy.h"
Jason Glasgowef965562012-04-10 16:12:35 -040026#include "shill/mock_glib.h"
27#include "shill/mock_manager.h"
28#include "shill/mock_metrics.h"
Arman Uguray6e5639f2012-11-15 20:30:19 -080029#include "shill/mock_mm1_bearer_proxy.h"
Jason Glasgowef965562012-04-10 16:12:35 -040030#include "shill/mock_mm1_modem_modem3gpp_proxy.h"
31#include "shill/mock_mm1_modem_modemcdma_proxy.h"
32#include "shill/mock_mm1_modem_proxy.h"
33#include "shill/mock_mm1_modem_simple_proxy.h"
34#include "shill/mock_mm1_sim_proxy.h"
35#include "shill/mock_profile.h"
36#include "shill/mock_rtnl_handler.h"
37#include "shill/nice_mock_control.h"
38#include "shill/proxy_factory.h"
39
40using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020041using base::StringPrintf;
Jason Glasgowef965562012-04-10 16:12:35 -040042using base::Unretained;
43using std::string;
Nathan Williams4b7c2a82012-04-13 15:19:47 -040044using std::vector;
Jason Glasgowef965562012-04-10 16:12:35 -040045using testing::InSequence;
Ben Chan6d0d1e72012-11-06 21:19:28 -080046using testing::Invoke;
Gary Moraine285a842012-08-15 08:23:57 -070047using testing::Mock;
Jason Glasgowef965562012-04-10 16:12:35 -040048using testing::NiceMock;
49using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040050using testing::SaveArg;
Jason Glasgowef965562012-04-10 16:12:35 -040051using testing::_;
52
53namespace shill {
54
55MATCHER(IsSuccess, "") {
56 return arg.IsSuccess();
57}
58MATCHER(IsFailure, "") {
59 return arg.IsFailure();
60}
Jason Glasgow14521872012-05-07 19:12:15 -040061MATCHER_P(HasApn, expected_apn, "") {
62 string apn;
63 return (DBusProperties::GetString(arg,
64 CellularCapabilityUniversal::kConnectApn,
65 &apn) &&
66 apn == expected_apn);
67}
Jason Glasgowef965562012-04-10 16:12:35 -040068
Ben Chan6d0d1e72012-11-06 21:19:28 -080069class MockCellularOperatorInfoGetOLPHelper {
70 public:
71 MockCellularOperatorInfoGetOLPHelper(const CellularService::OLP &olp) {
72 olp_.CopyFrom(olp);
73 }
74
75 ~MockCellularOperatorInfoGetOLPHelper() {}
76
77 bool GetOLP(const std::string &operator_id, CellularService::OLP *olp) {
78 olp->CopyFrom(olp_);
79 return true;
80 }
81
82 private:
83 CellularService::OLP olp_;
84};
85
Jason Glasgowef965562012-04-10 16:12:35 -040086class CellularCapabilityUniversalTest : public testing::Test {
87 public:
88 CellularCapabilityUniversalTest()
89 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
Arman Uguray6e5639f2012-11-15 20:30:19 -080090 bearer_proxy_(new mm1::MockBearerProxy()),
Ben Chan3ecdf822012-08-06 12:29:23 -070091 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
92 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
93 modem_proxy_(new mm1::MockModemProxy()),
94 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
95 sim_proxy_(new mm1::MockSimProxy()),
96 properties_proxy_(new MockDBusPropertiesProxy()),
97 proxy_factory_(this),
98 capability_(NULL),
99 device_adaptor_(NULL),
100 provider_db_(NULL),
Jason Glasgowef965562012-04-10 16:12:35 -0400101 cellular_(new Cellular(&control_,
102 &dispatcher_,
103 NULL,
104 &manager_,
105 "",
106 "",
107 0,
108 Cellular::kTypeUniversal,
109 "",
110 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -0400111 "",
Ben Chan3ecdf822012-08-06 12:29:23 -0700112 NULL,
Ben Chan62028b22012-11-05 11:20:02 -0800113 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -0700114 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -0400115 service_(new MockCellularService(&control_,
116 &dispatcher_,
117 &metrics_,
118 &manager_,
Ben Chan3ecdf822012-08-06 12:29:23 -0700119 cellular_)) {}
Jason Glasgowef965562012-04-10 16:12:35 -0400120
121 virtual ~CellularCapabilityUniversalTest() {
122 cellular_->service_ = NULL;
123 capability_ = NULL;
124 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200125 if (provider_db_) {
126 mobile_provider_close_db(provider_db_);
127 provider_db_ = NULL;
128 }
Jason Glasgowef965562012-04-10 16:12:35 -0400129 }
130
131 virtual void SetUp() {
132 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
133 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400134 device_adaptor_ =
135 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400136 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400137 }
138
139 virtual void TearDown() {
140 capability_->proxy_factory_ = NULL;
141 }
142
Darin Petkova4ca3c32012-08-17 16:05:24 +0200143 void SetService() {
144 cellular_->service_ = new CellularService(
145 &control_, &dispatcher_, &metrics_, NULL, cellular_);
146 }
147
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400148 void InitProviderDB() {
149 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
150
151 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
152 ASSERT_TRUE(provider_db_);
153 cellular_->provider_db_ = provider_db_;
154 }
155
Jason Glasgowef965562012-04-10 16:12:35 -0400156 void InvokeEnable(bool enable, Error *error,
157 const ResultCallback &callback, int timeout) {
158 callback.Run(Error());
159 }
160 void InvokeEnableFail(bool enable, Error *error,
161 const ResultCallback &callback, int timeout) {
162 callback.Run(Error(Error::kOperationFailed));
163 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400164 void InvokeRegister(const string &operator_id, Error *error,
165 const ResultCallback &callback, int timeout) {
166 callback.Run(Error());
167 }
168
Gary Morainceba6aa2012-05-03 10:28:26 -0700169 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
170 int timeout) {
171 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
172 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400173 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
174 int timeout) {
175 error->Populate(Error::kOperationFailed);
176 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700177
178 void Set3gppProxy() {
179 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
180 }
181
Jason Glasgow14521872012-05-07 19:12:15 -0400182 void SetSimpleProxy() {
183 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
184 }
185
Thieu Le3d275392012-07-20 15:32:58 -0700186 void ReleaseCapabilityProxies() {
187 capability_->ReleaseProxies();
188 }
189
Jason Glasgowef965562012-04-10 16:12:35 -0400190 MOCK_METHOD1(TestCallback, void(const Error &error));
191
192 protected:
Arman Uguray6e5639f2012-11-15 20:30:19 -0800193 static const char kActiveBearerPathPrefix[];
Jason Glasgowef965562012-04-10 16:12:35 -0400194 static const char kImei[];
Arman Uguray6e5639f2012-11-15 20:30:19 -0800195 static const char kInactiveBearerPathPrefix[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400196 static const char kSimPath[];
197 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400198
199 class TestProxyFactory : public ProxyFactory {
200 public:
201 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
202 test_(test) {}
203
Arman Uguray6e5639f2012-11-15 20:30:19 -0800204 virtual mm1::BearerProxyInterface *CreateBearerProxy(
205 const std::string &path,
206 const std::string &/*service*/) {
207 mm1::MockBearerProxy *bearer_proxy = test_->bearer_proxy_.release();
208 if (path.find(kActiveBearerPathPrefix) != std::string::npos)
209 ON_CALL(*bearer_proxy, Connected()).WillByDefault(Return(true));
210 else
211 ON_CALL(*bearer_proxy, Connected()).WillByDefault(Return(false));
212 test_->bearer_proxy_.reset(new mm1::MockBearerProxy());
213 return bearer_proxy;
214 }
215
Jason Glasgowef965562012-04-10 16:12:35 -0400216 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800217 const std::string &/*path*/,
218 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400219 return test_->modem_3gpp_proxy_.release();
220 }
221
222 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800223 const std::string &/*path*/,
224 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400225 return test_->modem_cdma_proxy_.release();
226 }
227
228 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800229 const std::string &/*path*/,
230 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400231 return test_->modem_proxy_.release();
232 }
233
234 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800235 const std::string &/*path*/,
236 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400237 return test_->modem_simple_proxy_.release();
238 }
239
240 virtual mm1::SimProxyInterface *CreateSimProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800241 const std::string &/*path*/,
242 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400243 return test_->sim_proxy_.release();
244 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400245 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800246 const std::string &/*path*/,
247 const std::string &/*service*/) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400248 return test_->properties_proxy_.release();
249 }
Jason Glasgowef965562012-04-10 16:12:35 -0400250
251 private:
252 CellularCapabilityUniversalTest *test_;
253 };
254
255 NiceMockControl control_;
256 EventDispatcher dispatcher_;
257 MockMetrics metrics_;
258 MockGLib glib_;
259 MockManager manager_;
Arman Uguray6e5639f2012-11-15 20:30:19 -0800260 scoped_ptr<mm1::MockBearerProxy> bearer_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400261 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
262 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
263 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
264 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
265 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400266 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400267 TestProxyFactory proxy_factory_;
268 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
269 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Ben Chan15786032012-11-04 21:28:02 -0800270 MockCellularOperatorInfo cellular_operator_info_;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400271 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700272 CellularRefPtr cellular_;
273 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400274 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400275 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400276};
277
Arman Uguray6e5639f2012-11-15 20:30:19 -0800278const char CellularCapabilityUniversalTest::kActiveBearerPathPrefix[] =
279 "/bearer/active";
Jason Glasgowef965562012-04-10 16:12:35 -0400280const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Arman Uguray6e5639f2012-11-15 20:30:19 -0800281const char CellularCapabilityUniversalTest::kInactiveBearerPathPrefix[] =
282 "/bearer/inactive";
Jason Glasgowaf583282012-04-18 15:18:22 -0400283const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
284const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
285 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
286 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400287
288TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400289 // Set up mock modem properties
290 DBusPropertiesMap modem_properties;
291 string operator_name = "TestOperator";
292 string operator_code = "001400";
293
294 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
295 writer().append_uint32(kAccessTechnologies);
296
297 ::DBus::Variant v;
298 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400299 ::DBus::Struct< uint32_t, bool > quality;
300 quality._1 = 90;
301 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400302 writer << quality;
303 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
304
305 // Set up mock modem 3gpp properties
306 DBusPropertiesMap modem3gpp_properties;
307 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
308 writer().append_uint32(0);
309 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
310 writer().append_string(kImei);
311
312 EXPECT_CALL(*modem_proxy_,
313 Enable(true, _, _, CellularCapability::kTimeoutEnable))
314 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
315 EXPECT_CALL(*properties_proxy_,
316 GetAll(MM_DBUS_INTERFACE_MODEM))
317 .WillOnce(Return(modem_properties));
318 EXPECT_CALL(*properties_proxy_,
319 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
320 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400321
Gary Moraine285a842012-08-15 08:23:57 -0700322 // Let the modem report that it is initializing. StartModem() should defer
323 // enabling the modem until its state changes to disabled.
324 EXPECT_CALL(*modem_proxy_, State())
325 .WillOnce(Return(Cellular::kModemStateInitializing));
326
Jason Glasgowef965562012-04-10 16:12:35 -0400327 // After setup we lose pointers to the proxies, so it is hard to set
328 // expectations.
329 SetUp();
330
331 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700332 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400333 ResultCallback callback =
334 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
335 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700336
Arman Uguray6e5639f2012-11-15 20:30:19 -0800337 // Verify that the modem has not been enabled.
Gary Moraine285a842012-08-15 08:23:57 -0700338 EXPECT_TRUE(capability_->imei_.empty());
339 EXPECT_EQ(0, capability_->access_technologies_);
340 Mock::VerifyAndClearExpectations(this);
341
342 // Change the state to kModemStateDisabling and verify that it still has not
Arman Uguray6e5639f2012-11-15 20:30:19 -0800343 // been enabled.
Gary Moraine285a842012-08-15 08:23:57 -0700344 EXPECT_CALL(*this, TestCallback(_)).Times(0);
345 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
346 Cellular::kModemStateDisabling, 0);
347 EXPECT_TRUE(capability_->imei_.empty());
348 EXPECT_EQ(0, capability_->access_technologies_);
349 Mock::VerifyAndClearExpectations(this);
350
351 // Change the state of the modem to disabled and verify that it gets enabled.
352 EXPECT_CALL(*this, TestCallback(IsSuccess()));
353 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
354 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400355 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400356 EXPECT_EQ(kImei, capability_->imei_);
357 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400358}
359
360TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700361 EXPECT_CALL(*modem_proxy_, State())
362 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400363 EXPECT_CALL(*modem_proxy_,
364 Enable(true, _, _, CellularCapability::kTimeoutEnable))
365 .WillOnce(
366 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
367 EXPECT_CALL(*this, TestCallback(IsFailure()));
368 ResultCallback callback =
369 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
370 SetUp();
371
372 Error error;
373 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700374 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400375}
376
Jason Glasgow02401cc2012-05-16 10:35:37 -0400377TEST_F(CellularCapabilityUniversalTest, StopModem) {
378 // Save pointers to proxies before they are lost by the call to InitProxies
379 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
380 SetUp();
381 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
382 capability_->InitProxies();
383
384 Error error;
385 ResultCallback callback =
386 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
387 capability_->StopModem(&error, callback);
388 EXPECT_TRUE(error.IsSuccess());
389
390 ResultCallback disable_callback;
391 EXPECT_CALL(*modem_proxy,
392 Enable(false, _, _, CellularCapability::kTimeoutEnable))
393 .WillOnce(SaveArg<2>(&disable_callback));
394 dispatcher_.DispatchPendingEvents();
395
396 EXPECT_CALL(*this, TestCallback(IsSuccess()));
397 disable_callback.Run(Error(Error::kSuccess));
398}
399
400TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
401 // Save pointers to proxies before they are lost by the call to InitProxies
402 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
403 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
404 SetUp();
405 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
406 capability_->InitProxies();
407
408 ResultCallback disconnect_callback;
409 Error error;
410 ResultCallback callback =
411 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
412 EXPECT_CALL(*modem_simple_proxy,
413 Disconnect(::DBus::Path("/"), _, _,
Thieu Le049adb52012-11-12 17:14:51 -0800414 CellularCapability::kTimeoutDisconnect))
Jason Glasgow02401cc2012-05-16 10:35:37 -0400415 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700416 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400417 capability_->StopModem(&error, callback);
418 EXPECT_TRUE(error.IsSuccess());
419
420 ResultCallback disable_callback;
421 EXPECT_CALL(*modem_proxy,
422 Enable(false, _, _, CellularCapability::kTimeoutEnable))
423 .WillOnce(SaveArg<2>(&disable_callback));
424 disconnect_callback.Run(Error(Error::kSuccess));
425
426 EXPECT_CALL(*this, TestCallback(IsSuccess()));
427 disable_callback.Run(Error(Error::kSuccess));
428}
429
Thieu Le5d6864a2012-07-20 11:43:51 -0700430TEST_F(CellularCapabilityUniversalTest, DisconnectModemNoBearer) {
431 Error error;
432 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700433 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800434 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect))
Thieu Le5d6864a2012-07-20 11:43:51 -0700435 .Times(0);
436 capability_->Disconnect(&error, disconnect_callback);
437}
438
Thieu Le3d275392012-07-20 15:32:58 -0700439TEST_F(CellularCapabilityUniversalTest, DisconnectNoProxy) {
440 Error error;
441 ResultCallback disconnect_callback;
442 capability_->bearer_path_ = "/foo";
443 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800444 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect))
Thieu Le3d275392012-07-20 15:32:58 -0700445 .Times(0);
446 ReleaseCapabilityProxies();
447 capability_->Disconnect(&error, disconnect_callback);
448}
449
Arman Ugurayab9364e2012-12-19 20:45:25 -0800450TEST_F(CellularCapabilityUniversalTest, SimLockStatusChanged) {
451 // Set up mock SIM properties
452 const char kImsi[] = "310100000001";
453 const char kSimIdentifier[] = "9999888";
454 const char kOperatorIdentifier[] = "310240";
455 const char kOperatorName[] = "Custom SPN";
456 DBusPropertiesMap sim_properties;
457 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
458 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
459 .append_string(kSimIdentifier);
460 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
461 .append_string(kOperatorIdentifier);
462 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
463 .append_string(kOperatorName);
464
465 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
466 .WillOnce(Return(sim_properties));
467
468 SetUp();
469 InitProviderDB();
470
471 EXPECT_FALSE(capability_->sim_present_);
472 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
473
474 capability_->OnSimPathChanged(kSimPath);
475 EXPECT_TRUE(capability_->sim_present_);
476 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
477 EXPECT_EQ(kSimPath, capability_->sim_path_);
478
479 capability_->imsi_ = "";
480 capability_->sim_identifier_ = "";
481 capability_->operator_id_ = "";
482 capability_->spn_ = "";
483
484 // SIM is locked.
485 capability_->sim_lock_status_.lock_type = "sim-pin";
486 capability_->OnSimLockStatusChanged();
487
488 EXPECT_EQ("", capability_->imsi_);
489 EXPECT_EQ("", capability_->sim_identifier_);
490 EXPECT_EQ("", capability_->operator_id_);
491 EXPECT_EQ("", capability_->spn_);
492
493 // SIM is unlocked.
494 properties_proxy_.reset(new MockDBusPropertiesProxy());
495 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
496 .WillOnce(Return(sim_properties));
497
498 capability_->sim_lock_status_.lock_type = "";
499 capability_->OnSimLockStatusChanged();
500
501 EXPECT_EQ(kImsi, capability_->imsi_);
502 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
503 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
504 EXPECT_EQ(kOperatorName, capability_->spn_);
505}
506
Jason Glasgowaf583282012-04-18 15:18:22 -0400507TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
508 // Set up mock modem properties
509 DBusPropertiesMap modem_properties;
510 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
511 writer().append_uint32(kAccessTechnologies);
512 modem_properties[MM_MODEM_PROPERTY_SIM].
513 writer().append_path(kSimPath);
514
515 // Set up mock modem 3gpp properties
516 DBusPropertiesMap modem3gpp_properties;
517 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
518 writer().append_uint32(0);
519 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
520 writer().append_string(kImei);
521
522 // Set up mock modem sim properties
523 DBusPropertiesMap sim_properties;
524
525 // After setup we lose pointers to the proxies, so it is hard to set
526 // expectations.
527 EXPECT_CALL(*properties_proxy_,
528 GetAll(MM_DBUS_INTERFACE_SIM))
529 .WillOnce(Return(sim_properties));
530
531 SetUp();
532
533 EXPECT_EQ("", capability_->imei_);
534 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
535 capability_->access_technologies_);
536 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400537 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
538 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400539 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
540 modem_properties, vector<string>());
541 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
542 EXPECT_EQ(kSimPath, capability_->sim_path_);
543 EXPECT_TRUE(capability_->sim_proxy_.get());
544
545 // Changing properties on wrong interface will not have an effect
546 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
547 modem3gpp_properties,
548 vector<string>());
549 EXPECT_EQ("", capability_->imei_);
550
551 // Changing properties on the right interface gets reflected in the
552 // capabilities object
553 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
554 modem3gpp_properties,
555 vector<string>());
556 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400557
558 // Expect to see changes when the family changes
559 modem_properties.clear();
560 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
561 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
562 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
563 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
564 Times(1);
565 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
566 modem_properties,
567 vector<string>());
568 // Back to LTE
569 modem_properties.clear();
570 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
571 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
572 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
573 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
574 Times(1);
575 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
576 modem_properties,
577 vector<string>());
578
579 // LTE & CDMA - the device adaptor should not be called!
580 modem_properties.clear();
581 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
582 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
583 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
584 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
585 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
586 modem_properties,
587 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400588}
589
Ben Chanbd3aee82012-10-16 23:52:04 -0700590TEST_F(CellularCapabilityUniversalTest, SimPathChanged) {
591 // Set up mock modem SIM properties
592 const char kImsi[] = "310100000001";
593 const char kSimIdentifier[] = "9999888";
594 const char kOperatorIdentifier[] = "310240";
595 const char kOperatorName[] = "Custom SPN";
596 DBusPropertiesMap sim_properties;
597 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
598 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
599 .append_string(kSimIdentifier);
600 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
601 .append_string(kOperatorIdentifier);
602 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
603 .append_string(kOperatorName);
604
605 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
606 .Times(1).WillOnce(Return(sim_properties));
607
608 EXPECT_FALSE(capability_->sim_present_);
609 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
610 EXPECT_EQ("", capability_->sim_path_);
611 EXPECT_EQ("", capability_->imsi_);
612 EXPECT_EQ("", capability_->sim_identifier_);
613 EXPECT_EQ("", capability_->operator_id_);
614 EXPECT_EQ("", capability_->spn_);
615
616 capability_->OnSimPathChanged(kSimPath);
617 EXPECT_TRUE(capability_->sim_present_);
618 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
619 EXPECT_EQ(kSimPath, capability_->sim_path_);
620 EXPECT_EQ(kImsi, capability_->imsi_);
621 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
622 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
623 EXPECT_EQ(kOperatorName, capability_->spn_);
624
625 // Changing to the same SIM path should be a no-op.
626 capability_->OnSimPathChanged(kSimPath);
627 EXPECT_TRUE(capability_->sim_present_);
628 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
629 EXPECT_EQ(kSimPath, capability_->sim_path_);
630 EXPECT_EQ(kImsi, capability_->imsi_);
631 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
632 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
633 EXPECT_EQ(kOperatorName, capability_->spn_);
634
635 capability_->OnSimPathChanged("");
636 EXPECT_FALSE(capability_->sim_present_);
637 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
638 EXPECT_EQ("", capability_->sim_path_);
639 EXPECT_EQ("", capability_->imsi_);
640 EXPECT_EQ("", capability_->sim_identifier_);
641 EXPECT_EQ("", capability_->operator_id_);
642 EXPECT_EQ("", capability_->spn_);
643}
644
Jason Glasgowaf583282012-04-18 15:18:22 -0400645TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
646 // Set up mock modem properties
647 DBusPropertiesMap modem_properties;
648 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
649
650 // Set up mock modem sim properties
651 const char kImsi[] = "310100000001";
652 DBusPropertiesMap sim_properties;
653 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
654
655 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
656 .WillOnce(Return(sim_properties));
657
658 // After setup we lose pointers to the proxies, so it is hard to set
659 // expectations.
660 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400661 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400662
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400663 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
664 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
665 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400666 EXPECT_FALSE(capability_->sim_proxy_.get());
667 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
668 modem_properties, vector<string>());
669 EXPECT_EQ(kSimPath, capability_->sim_path_);
670 EXPECT_TRUE(capability_->sim_proxy_.get());
671 EXPECT_EQ(kImsi, capability_->imsi_);
672
673 // Updating the SIM
674 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400675 const char kCountry[] = "us";
676 const char kCode[] = "310160";
677 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400678 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400679 const char kOperatorIdentifier[] = "310240";
680 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400681 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
682 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
683 append_string(kSimIdentifier);
684 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
685 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400686 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
687 new_properties,
688 vector<string>());
689 EXPECT_EQ(kNewImsi, capability_->imsi_);
690 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
691 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400692 EXPECT_EQ("", capability_->spn_);
693 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
694 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
695 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
696 EXPECT_EQ(4, capability_->apn_list_.size());
697
698 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
699 append_string(kOperatorName);
700 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
701 new_properties,
702 vector<string>());
703 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400704 EXPECT_EQ(kOperatorName, capability_->spn_);
705}
706
Gary Morainceba6aa2012-05-03 10:28:26 -0700707MATCHER_P(SizeIs, value, "") {
708 return static_cast<size_t>(value) == arg.size();
709}
710
Ben Chan5d0d32c2013-01-08 02:05:29 -0800711TEST_F(CellularCapabilityUniversalTest, Reset) {
712 // Save pointers to proxies before they are lost by the call to InitProxies
713 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
714 SetUp();
715 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
716 capability_->InitProxies();
717
718 Error error;
719 ResultCallback reset_callback;
720
721 EXPECT_CALL(*modem_proxy, Reset(_, _, CellularCapability::kTimeoutReset))
722 .WillOnce(SaveArg<1>(&reset_callback));
723
724 capability_->Reset(&error, ResultCallback());
725 EXPECT_TRUE(capability_->resetting_);
726 reset_callback.Run(error);
727 EXPECT_FALSE(capability_->resetting_);
728}
729
Gary Morainceba6aa2012-05-03 10:28:26 -0700730// Validates that OnScanReply does not crash with a null callback.
731TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
732 Error error;
733 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
734 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
735 EXPECT_CALL(*device_adaptor_,
736 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
737 SizeIs(0)));
738 Set3gppProxy();
739 capability_->Scan(&error, ResultCallback());
740 EXPECT_TRUE(error.IsSuccess());
741}
742
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400743// Validates that the scanning property is updated
744TEST_F(CellularCapabilityUniversalTest, Scan) {
745 Error error;
746
747 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
748 .WillRepeatedly(SaveArg<1>(&scan_callback_));
749 EXPECT_CALL(*device_adaptor_,
750 EmitBoolChanged(flimflam::kScanningProperty, true));
751 Set3gppProxy();
752 capability_->Scan(&error, ResultCallback());
753 EXPECT_TRUE(capability_->scanning_);
754
755 // Simulate the completion of the scan with 2 networks in the results.
756 EXPECT_CALL(*device_adaptor_,
757 EmitBoolChanged(flimflam::kScanningProperty, false));
758 EXPECT_CALL(*device_adaptor_,
759 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
760 SizeIs(2)));
761 vector<DBusPropertiesMap> results;
762 const char kScanID0[] = "testID0";
763 const char kScanID1[] = "testID1";
764 results.push_back(DBusPropertiesMap());
765 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
766 writer().append_string(kScanID0);
767 results.push_back(DBusPropertiesMap());
768 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
769 writer().append_string(kScanID1);
770 scan_callback_.Run(results, error);
771 EXPECT_FALSE(capability_->scanning_);
772
773 // Simulate the completion of the scan with no networks in the results.
774 EXPECT_CALL(*device_adaptor_,
775 EmitBoolChanged(flimflam::kScanningProperty, true));
776 capability_->Scan(&error, ResultCallback());
777 EXPECT_TRUE(capability_->scanning_);
778 EXPECT_CALL(*device_adaptor_,
779 EmitBoolChanged(flimflam::kScanningProperty, false));
780 EXPECT_CALL(*device_adaptor_,
781 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
782 SizeIs(0)));
783 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
784 EXPECT_FALSE(capability_->scanning_);
785}
786
787// Validates expected property updates when scan fails
788TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
789 Error error;
790
791 // Test immediate error
792 {
793 InSequence seq;
794 EXPECT_CALL(*modem_3gpp_proxy_,
795 Scan(_, _, CellularCapability::kTimeoutScan))
796 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
797 EXPECT_CALL(*modem_3gpp_proxy_,
798 Scan(_, _, CellularCapability::kTimeoutScan))
799 .WillOnce(SaveArg<1>(&scan_callback_));
800 }
801 Set3gppProxy();
802 capability_->Scan(&error, ResultCallback());
803 EXPECT_FALSE(capability_->scanning_);
804 EXPECT_TRUE(error.IsFailure());
805
806 // Initiate a scan
807 error.Populate(Error::kSuccess);
808 EXPECT_CALL(*device_adaptor_,
809 EmitBoolChanged(flimflam::kScanningProperty, true));
810 capability_->Scan(&error, ResultCallback());
811 EXPECT_TRUE(capability_->scanning_);
812 EXPECT_TRUE(error.IsSuccess());
813
814 // Validate that error is returned if Scan is called while already scanning.
815 capability_->Scan(&error, ResultCallback());
816 EXPECT_TRUE(capability_->scanning_);
817 EXPECT_TRUE(error.IsFailure());
818
819 // Validate that signals are emitted even if an error is reported.
820 capability_->found_networks_.clear();
821 capability_->found_networks_.push_back(Stringmap());
822 EXPECT_CALL(*device_adaptor_,
823 EmitBoolChanged(flimflam::kScanningProperty, false));
824 EXPECT_CALL(*device_adaptor_,
825 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
826 SizeIs(0)));
827 vector<DBusPropertiesMap> results;
828 scan_callback_.Run(results, Error(Error::kOperationFailed));
829 EXPECT_FALSE(capability_->scanning_);
830}
831
Arman Uguray6e5639f2012-11-15 20:30:19 -0800832// Validates expected behavior of OnListBearersReply function
833TEST_F(CellularCapabilityUniversalTest, OnListBearersReply) {
834 // Check that bearer_path_ is set correctly when an active bearer
835 // is returned.
836 const size_t kPathCount = 3;
837 DBus::Path active_paths[kPathCount], inactive_paths[kPathCount];
838 for (size_t i = 0; i < kPathCount; ++i) {
839 active_paths[i] =
840 DBus::Path(base::StringPrintf("%s/%zu", kActiveBearerPathPrefix, i));
841 inactive_paths[i] =
842 DBus::Path(base::StringPrintf("%s/%zu", kInactiveBearerPathPrefix, i));
843 }
844
845 std::vector<DBus::Path> paths;
846 paths.push_back(inactive_paths[0]);
847 paths.push_back(inactive_paths[1]);
848 paths.push_back(active_paths[2]);
849 paths.push_back(inactive_paths[1]);
850 paths.push_back(inactive_paths[2]);
851
852 Error error;
853 capability_->OnListBearersReply(paths, error);
854 EXPECT_STREQ(capability_->bearer_path_.c_str(), active_paths[2].c_str());
855
856 paths.clear();
857
858 // Check that bearer_path_ is empty if no active bearers are returned.
859 paths.push_back(inactive_paths[0]);
860 paths.push_back(inactive_paths[1]);
861 paths.push_back(inactive_paths[2]);
862 paths.push_back(inactive_paths[1]);
863
864 capability_->OnListBearersReply(paths, error);
865 EXPECT_TRUE(capability_->bearer_path_.empty());
866
867 // Check that returning multiple bearers causes death.
868 paths.push_back(active_paths[0]);
869 paths.push_back(inactive_paths[1]);
870 paths.push_back(inactive_paths[2]);
871 paths.push_back(active_paths[1]);
872 paths.push_back(inactive_paths[1]);
873
874 EXPECT_DEATH(capability_->OnListBearersReply(paths, error),
875 "Found more than one active bearer.");
876}
877
Jason Glasgow14521872012-05-07 19:12:15 -0400878// Validates expected behavior of Connect function
879TEST_F(CellularCapabilityUniversalTest, Connect) {
880 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
881 SetSimpleProxy();
882 Error error;
883 DBusPropertiesMap properties;
884 capability_->apn_try_list_.clear();
885 ResultCallback callback =
886 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
887 DBus::Path bearer("/foo");
888
889 // Test connect failures
890 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
891 .WillOnce(SaveArg<2>(&connect_callback_));
892 capability_->Connect(properties, &error, callback);
893 EXPECT_TRUE(error.IsSuccess());
894 EXPECT_CALL(*this, TestCallback(IsFailure()));
895 EXPECT_CALL(*service_, ClearLastGoodApn());
896 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
897
898 // Test connect success
899 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
900 .WillOnce(SaveArg<2>(&connect_callback_));
901 capability_->Connect(properties, &error, callback);
902 EXPECT_TRUE(error.IsSuccess());
903 EXPECT_CALL(*this, TestCallback(IsSuccess()));
904 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -0400905
906 // Test connect failures without a service. Make sure that shill
907 // does not crash if the connect failed and there is no
908 // CellularService object. This can happen if the modem is enabled
909 // and then quickly disabled.
910 cellular_->service_ = NULL;
911 EXPECT_FALSE(capability_->cellular()->service());
912 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
913 .WillOnce(SaveArg<2>(&connect_callback_));
914 capability_->Connect(properties, &error, callback);
915 EXPECT_TRUE(error.IsSuccess());
916 EXPECT_CALL(*this, TestCallback(IsFailure()));
917 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -0400918}
919
920// Validates Connect iterates over APNs
921TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
922 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
923 SetSimpleProxy();
924 Error error;
925 DBusPropertiesMap properties;
926 capability_->apn_try_list_.clear();
927 ResultCallback callback =
928 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
929 DBus::Path bearer("/bearer0");
930
931 const char apn_name_foo[] = "foo";
932 const char apn_name_bar[] = "bar";
933 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
934 .WillOnce(SaveArg<2>(&connect_callback_));
935 Stringmap apn1;
936 apn1[flimflam::kApnProperty] = apn_name_foo;
937 capability_->apn_try_list_.push_back(apn1);
938 Stringmap apn2;
939 apn2[flimflam::kApnProperty] = apn_name_bar;
940 capability_->apn_try_list_.push_back(apn2);
941 capability_->FillConnectPropertyMap(&properties);
942 capability_->Connect(properties, &error, callback);
943 EXPECT_TRUE(error.IsSuccess());
944
945 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
946 .WillOnce(SaveArg<2>(&connect_callback_));
947 EXPECT_CALL(*service_, ClearLastGoodApn());
948 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
949
950 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
951 EXPECT_CALL(*this, TestCallback(IsSuccess()));
952 connect_callback_.Run(bearer, Error(Error::kSuccess));
953}
954
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400955// Validates GetTypeString and AccessTechnologyToTechnologyFamily
956TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
957 const int gsm_technologies[] = {
958 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
959 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
960 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
961 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
962 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
963 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
964 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
965 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
966 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
967 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
968 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
969 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
970 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
971 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
972 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
973 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
974 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
975 };
Ben Chan62028b22012-11-05 11:20:02 -0800976 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400977 capability_->access_technologies_ = gsm_technologies[i];
978 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
979 }
980 const int cdma_technologies[] = {
981 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
982 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
983 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
984 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
985 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
986 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
987 };
Ben Chan62028b22012-11-05 11:20:02 -0800988 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400989 capability_->access_technologies_ = cdma_technologies[i];
990 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
991 }
992 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
993 ASSERT_EQ(capability_->GetTypeString(), "");
994}
995
Darin Petkovf508c822012-09-21 13:43:17 +0200996TEST_F(CellularCapabilityUniversalTest, AllowRoaming) {
997 EXPECT_FALSE(cellular_->allow_roaming_);
998 EXPECT_FALSE(capability_->provider_requires_roaming_);
999 EXPECT_FALSE(capability_->AllowRoaming());
1000 capability_->provider_requires_roaming_ = true;
1001 EXPECT_TRUE(capability_->AllowRoaming());
1002 capability_->provider_requires_roaming_ = false;
1003 cellular_->allow_roaming_ = true;
1004 EXPECT_TRUE(capability_->AllowRoaming());
1005}
1006
Darin Petkovb4fccd22012-08-10 11:59:26 +02001007TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
1008 static const char kTestCarrier[] = "The Cellular Carrier";
1009 static const char kCountry[] = "us";
1010 static const char kCode[] = "310160";
1011 capability_->imsi_ = "310240123456789";
1012
Darin Petkovf508c822012-09-21 13:43:17 +02001013 EXPECT_FALSE(capability_->home_provider_);
1014 EXPECT_FALSE(capability_->provider_requires_roaming_);
1015
Darin Petkovb4fccd22012-08-10 11:59:26 +02001016 capability_->SetHomeProvider(); // No mobile provider DB available.
1017 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
1018 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
1019 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +02001020 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001021
1022 InitProviderDB();
1023 capability_->SetHomeProvider();
1024 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
1025 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1026 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
1027 EXPECT_EQ(4, capability_->apn_list_.size());
1028 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001029 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001030
1031 Cellular::Operator oper;
1032 cellular_->set_home_provider(oper);
1033 capability_->spn_ = kTestCarrier;
1034 capability_->SetHomeProvider();
1035 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
1036 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1037 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +02001038 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001039
1040 static const char kCubic[] = "Cubic";
1041 capability_->spn_ = kCubic;
1042 capability_->SetHomeProvider();
1043 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
1044 EXPECT_EQ("", cellular_->home_provider().GetCode());
1045 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001046 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001047
1048 static const char kCUBIC[] = "CUBIC";
1049 capability_->spn_ = kCUBIC;
1050 capability_->home_provider_ = NULL;
1051 capability_->SetHomeProvider();
1052 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
1053 EXPECT_EQ("", cellular_->home_provider().GetCode());
1054 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001055 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001056}
1057
Ben Chan6d0d1e72012-11-06 21:19:28 -08001058TEST_F(CellularCapabilityUniversalTest, UpdateOLP) {
1059 CellularService::OLP test_olp;
1060 test_olp.SetURL("http://testurl");
1061 test_olp.SetMethod("POST");
1062 test_olp.SetPostData("esn=${esn}&imei=${imei}&imsi=${imsi}&mdn=${mdn}&"
1063 "meid=${meid}&min=${min}&iccid=${iccid}");
1064
1065 MockCellularOperatorInfoGetOLPHelper get_olp_helper(test_olp);
1066
1067 capability_->esn_ = "0";
1068 capability_->imei_ = "1";
1069 capability_->imsi_ = "2";
1070 capability_->mdn_ = "3";
1071 capability_->meid_= "4";
1072 capability_->min_ = "5";
1073 capability_->sim_identifier_ = "6";
1074 capability_->operator_id_ = "123456";
1075 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1076
1077 EXPECT_CALL(cellular_operator_info_, GetOLP(capability_->operator_id_, _))
Ben Chan092b12b2012-11-07 22:04:05 -08001078 .WillRepeatedly(Invoke(&get_olp_helper,
1079 &MockCellularOperatorInfoGetOLPHelper::GetOLP));
Ben Chan6d0d1e72012-11-06 21:19:28 -08001080
1081 SetService();
1082 capability_->UpdateOLP();
1083 const CellularService::OLP &olp = cellular_->service()->olp();
1084 EXPECT_EQ("http://testurl", olp.GetURL());
1085 EXPECT_EQ("POST", olp.GetMethod());
1086 EXPECT_EQ("esn=0&imei=1&imsi=2&mdn=3&meid=4&min=5&iccid=6",
1087 olp.GetPostData());
1088}
1089
Darin Petkova4ca3c32012-08-17 16:05:24 +02001090TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfo) {
1091 static const char kOperatorName[] = "Swisscom";
1092 InitProviderDB();
1093 capability_->serving_operator_.SetCode("22801");
1094 SetService();
1095 capability_->UpdateOperatorInfo();
1096 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
1097 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1098 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
1099
1100 static const char kTestOperator[] = "Testcom";
1101 capability_->serving_operator_.SetName(kTestOperator);
1102 capability_->serving_operator_.SetCountry("");
1103 capability_->UpdateOperatorInfo();
1104 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
1105 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1106 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
1107}
1108
Ben Chan092b12b2012-11-07 22:04:05 -08001109TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfoViaOperatorId) {
1110 static const char kOperatorName[] = "Swisscom";
1111 static const char kOperatorId[] = "22801";
1112 InitProviderDB();
1113 capability_->serving_operator_.SetCode("");
1114 SetService();
1115 capability_->UpdateOperatorInfo();
1116 EXPECT_EQ("", capability_->serving_operator_.GetName());
1117 EXPECT_EQ("", capability_->serving_operator_.GetCountry());
1118 EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
1119
1120 capability_->operator_id_ = kOperatorId;
1121
1122 // Service activation is not needed
1123 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1124 EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
1125 .WillOnce(Return(false));
1126 capability_->UpdateOperatorInfo();
1127 EXPECT_EQ("", capability_->serving_operator_.GetName());
1128 EXPECT_EQ("", capability_->serving_operator_.GetCountry());
1129 EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
1130
1131 // Service activation is needed
1132 capability_->mdn_ = "0000000000";
1133 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1134 EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
1135 .WillOnce(Return(true));
1136
1137 capability_->UpdateOperatorInfo();
1138 EXPECT_EQ(kOperatorId, capability_->serving_operator_.GetCode());
1139 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
1140 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1141 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
1142}
1143
Darin Petkova4ca3c32012-08-17 16:05:24 +02001144TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
1145 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
1146 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
1147 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
1148
Ben Chan092b12b2012-11-07 22:04:05 -08001149 // Service activation is not needed
1150 capability_->operator_id_ = "0123";
1151 EXPECT_EQ("GSMNetwork2", capability_->CreateFriendlyServiceName());
1152
1153 // Service activation is needed
1154 capability_->mdn_ = "0000000000";
1155 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1156 EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
1157 .WillOnce(Return(true));
1158 EXPECT_EQ("cellular_0123", capability_->CreateFriendlyServiceName());
1159 EXPECT_EQ("0123", capability_->serving_operator_.GetCode());
1160
Darin Petkova4ca3c32012-08-17 16:05:24 +02001161 capability_->serving_operator_.SetCode("1234");
1162 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
1163
1164 static const char kHomeProvider[] = "The GSM Home Provider";
1165 cellular_->home_provider_.SetName(kHomeProvider);
1166 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
1167 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
1168 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
1169
1170 static const char kTestOperator[] = "A GSM Operator";
1171 capability_->serving_operator_.SetName(kTestOperator);
1172 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
1173
1174 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
1175 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
1176 capability_->CreateFriendlyServiceName());
1177}
1178
Ben Chan15786032012-11-04 21:28:02 -08001179TEST_F(CellularCapabilityUniversalTest, IsServiceActivationRequired) {
1180 capability_->mdn_ = "0000000000";
1181 cellular_->cellular_operator_info_ = NULL;
1182 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1183
1184 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1185 EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
1186 .WillOnce(Return(false))
1187 .WillRepeatedly(Return(true));
1188 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1189
1190 capability_->mdn_ = "";
1191 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1192 capability_->mdn_ = "1234567890";
1193 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1194 capability_->mdn_ = "+1-234-567-890";
1195 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1196 capability_->mdn_ = "0000000000";
1197 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1198 capability_->mdn_ = "0-000-000-000";
1199 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1200 capability_->mdn_ = "+0-000-000-000";
1201 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1202}
1203
Jason Glasgowef965562012-04-10 16:12:35 -04001204} // namespace shill