blob: 5a2ad5d77e0ed0a686dc653f1d16f1aa3b7bba9f [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>
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
69class CellularCapabilityUniversalTest : public testing::Test {
70 public:
71 CellularCapabilityUniversalTest()
72 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
Arman Uguray6e5639f2012-11-15 20:30:19 -080073 bearer_proxy_(new mm1::MockBearerProxy()),
Ben Chan3ecdf822012-08-06 12:29:23 -070074 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
75 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
76 modem_proxy_(new mm1::MockModemProxy()),
77 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
78 sim_proxy_(new mm1::MockSimProxy()),
79 properties_proxy_(new MockDBusPropertiesProxy()),
80 proxy_factory_(this),
81 capability_(NULL),
82 device_adaptor_(NULL),
83 provider_db_(NULL),
Jason Glasgowef965562012-04-10 16:12:35 -040084 cellular_(new Cellular(&control_,
85 &dispatcher_,
Thieu Lece4483e2013-01-23 15:12:03 -080086 &metrics_,
Jason Glasgowef965562012-04-10 16:12:35 -040087 &manager_,
88 "",
89 "",
90 0,
91 Cellular::kTypeUniversal,
92 "",
93 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040094 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070095 NULL,
Ben Chan62028b22012-11-05 11:20:02 -080096 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -070097 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -040098 service_(new MockCellularService(&control_,
99 &dispatcher_,
100 &metrics_,
101 &manager_,
Thieu Lece4483e2013-01-23 15:12:03 -0800102 cellular_)) {
103 metrics_.RegisterDevice(cellular_->interface_index(),
104 Technology::kCellular);
105 }
Jason Glasgowef965562012-04-10 16:12:35 -0400106
107 virtual ~CellularCapabilityUniversalTest() {
108 cellular_->service_ = NULL;
109 capability_ = NULL;
110 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200111 if (provider_db_) {
112 mobile_provider_close_db(provider_db_);
113 provider_db_ = NULL;
114 }
Jason Glasgowef965562012-04-10 16:12:35 -0400115 }
116
117 virtual void SetUp() {
118 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
119 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400120 device_adaptor_ =
121 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400122 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400123 }
124
125 virtual void TearDown() {
126 capability_->proxy_factory_ = NULL;
127 }
128
Darin Petkova4ca3c32012-08-17 16:05:24 +0200129 void SetService() {
130 cellular_->service_ = new CellularService(
131 &control_, &dispatcher_, &metrics_, NULL, cellular_);
132 }
133
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400134 void InitProviderDB() {
135 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
136
137 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
138 ASSERT_TRUE(provider_db_);
139 cellular_->provider_db_ = provider_db_;
140 }
141
Jason Glasgowef965562012-04-10 16:12:35 -0400142 void InvokeEnable(bool enable, Error *error,
143 const ResultCallback &callback, int timeout) {
144 callback.Run(Error());
145 }
146 void InvokeEnableFail(bool enable, Error *error,
147 const ResultCallback &callback, int timeout) {
148 callback.Run(Error(Error::kOperationFailed));
149 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400150 void InvokeRegister(const string &operator_id, Error *error,
151 const ResultCallback &callback, int timeout) {
152 callback.Run(Error());
153 }
154
Gary Morainceba6aa2012-05-03 10:28:26 -0700155 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
156 int timeout) {
157 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
158 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400159 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
160 int timeout) {
161 error->Populate(Error::kOperationFailed);
162 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700163
164 void Set3gppProxy() {
165 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
166 }
167
Jason Glasgow14521872012-05-07 19:12:15 -0400168 void SetSimpleProxy() {
169 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
170 }
171
Thieu Le3d275392012-07-20 15:32:58 -0700172 void ReleaseCapabilityProxies() {
173 capability_->ReleaseProxies();
174 }
175
Jason Glasgowef965562012-04-10 16:12:35 -0400176 MOCK_METHOD1(TestCallback, void(const Error &error));
177
178 protected:
Arman Uguray6e5639f2012-11-15 20:30:19 -0800179 static const char kActiveBearerPathPrefix[];
Jason Glasgowef965562012-04-10 16:12:35 -0400180 static const char kImei[];
Arman Uguray6e5639f2012-11-15 20:30:19 -0800181 static const char kInactiveBearerPathPrefix[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400182 static const char kSimPath[];
183 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400184
185 class TestProxyFactory : public ProxyFactory {
186 public:
187 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
188 test_(test) {}
189
Arman Uguray6e5639f2012-11-15 20:30:19 -0800190 virtual mm1::BearerProxyInterface *CreateBearerProxy(
191 const std::string &path,
192 const std::string &/*service*/) {
193 mm1::MockBearerProxy *bearer_proxy = test_->bearer_proxy_.release();
194 if (path.find(kActiveBearerPathPrefix) != std::string::npos)
195 ON_CALL(*bearer_proxy, Connected()).WillByDefault(Return(true));
196 else
197 ON_CALL(*bearer_proxy, Connected()).WillByDefault(Return(false));
198 test_->bearer_proxy_.reset(new mm1::MockBearerProxy());
199 return bearer_proxy;
200 }
201
Jason Glasgowef965562012-04-10 16:12:35 -0400202 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800203 const std::string &/*path*/,
204 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400205 return test_->modem_3gpp_proxy_.release();
206 }
207
208 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800209 const std::string &/*path*/,
210 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400211 return test_->modem_cdma_proxy_.release();
212 }
213
214 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800215 const std::string &/*path*/,
216 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400217 return test_->modem_proxy_.release();
218 }
219
220 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800221 const std::string &/*path*/,
222 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400223 return test_->modem_simple_proxy_.release();
224 }
225
226 virtual mm1::SimProxyInterface *CreateSimProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800227 const std::string &/*path*/,
228 const std::string &/*service*/) {
Jason Glasgowef965562012-04-10 16:12:35 -0400229 return test_->sim_proxy_.release();
230 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400231 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
Arman Uguray6e5639f2012-11-15 20:30:19 -0800232 const std::string &/*path*/,
233 const std::string &/*service*/) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400234 return test_->properties_proxy_.release();
235 }
Jason Glasgowef965562012-04-10 16:12:35 -0400236
237 private:
238 CellularCapabilityUniversalTest *test_;
239 };
240
241 NiceMockControl control_;
242 EventDispatcher dispatcher_;
243 MockMetrics metrics_;
244 MockGLib glib_;
245 MockManager manager_;
Arman Uguray6e5639f2012-11-15 20:30:19 -0800246 scoped_ptr<mm1::MockBearerProxy> bearer_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400247 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
248 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
249 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
250 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
251 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400252 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400253 TestProxyFactory proxy_factory_;
254 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
255 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Ben Chan15786032012-11-04 21:28:02 -0800256 MockCellularOperatorInfo cellular_operator_info_;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400257 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700258 CellularRefPtr cellular_;
259 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400260 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400261 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400262};
263
Arman Uguray6e5639f2012-11-15 20:30:19 -0800264const char CellularCapabilityUniversalTest::kActiveBearerPathPrefix[] =
265 "/bearer/active";
Jason Glasgowef965562012-04-10 16:12:35 -0400266const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Arman Uguray6e5639f2012-11-15 20:30:19 -0800267const char CellularCapabilityUniversalTest::kInactiveBearerPathPrefix[] =
268 "/bearer/inactive";
Jason Glasgowaf583282012-04-18 15:18:22 -0400269const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
270const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
271 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
272 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400273
274TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400275 // Set up mock modem properties
276 DBusPropertiesMap modem_properties;
277 string operator_name = "TestOperator";
278 string operator_code = "001400";
279
280 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
281 writer().append_uint32(kAccessTechnologies);
282
283 ::DBus::Variant v;
284 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400285 ::DBus::Struct< uint32_t, bool > quality;
286 quality._1 = 90;
287 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400288 writer << quality;
289 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
290
291 // Set up mock modem 3gpp properties
292 DBusPropertiesMap modem3gpp_properties;
293 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
294 writer().append_uint32(0);
295 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
296 writer().append_string(kImei);
297
298 EXPECT_CALL(*modem_proxy_,
299 Enable(true, _, _, CellularCapability::kTimeoutEnable))
300 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
301 EXPECT_CALL(*properties_proxy_,
302 GetAll(MM_DBUS_INTERFACE_MODEM))
303 .WillOnce(Return(modem_properties));
304 EXPECT_CALL(*properties_proxy_,
305 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
306 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400307
Gary Moraine285a842012-08-15 08:23:57 -0700308 // Let the modem report that it is initializing. StartModem() should defer
309 // enabling the modem until its state changes to disabled.
310 EXPECT_CALL(*modem_proxy_, State())
311 .WillOnce(Return(Cellular::kModemStateInitializing));
312
Jason Glasgowef965562012-04-10 16:12:35 -0400313 // After setup we lose pointers to the proxies, so it is hard to set
314 // expectations.
315 SetUp();
316
317 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700318 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400319 ResultCallback callback =
320 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
321 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700322
Arman Uguray6e5639f2012-11-15 20:30:19 -0800323 // Verify that the modem has not been enabled.
Gary Moraine285a842012-08-15 08:23:57 -0700324 EXPECT_TRUE(capability_->imei_.empty());
325 EXPECT_EQ(0, capability_->access_technologies_);
326 Mock::VerifyAndClearExpectations(this);
327
328 // Change the state to kModemStateDisabling and verify that it still has not
Arman Uguray6e5639f2012-11-15 20:30:19 -0800329 // been enabled.
Gary Moraine285a842012-08-15 08:23:57 -0700330 EXPECT_CALL(*this, TestCallback(_)).Times(0);
331 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
332 Cellular::kModemStateDisabling, 0);
333 EXPECT_TRUE(capability_->imei_.empty());
334 EXPECT_EQ(0, capability_->access_technologies_);
335 Mock::VerifyAndClearExpectations(this);
336
337 // Change the state of the modem to disabled and verify that it gets enabled.
338 EXPECT_CALL(*this, TestCallback(IsSuccess()));
339 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
340 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400341 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400342 EXPECT_EQ(kImei, capability_->imei_);
343 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400344}
345
346TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700347 EXPECT_CALL(*modem_proxy_, State())
348 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400349 EXPECT_CALL(*modem_proxy_,
350 Enable(true, _, _, CellularCapability::kTimeoutEnable))
351 .WillOnce(
352 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
353 EXPECT_CALL(*this, TestCallback(IsFailure()));
354 ResultCallback callback =
355 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
356 SetUp();
357
358 Error error;
359 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700360 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400361}
362
Jason Glasgow02401cc2012-05-16 10:35:37 -0400363TEST_F(CellularCapabilityUniversalTest, StopModem) {
364 // Save pointers to proxies before they are lost by the call to InitProxies
365 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
366 SetUp();
367 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
368 capability_->InitProxies();
369
370 Error error;
371 ResultCallback callback =
372 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
373 capability_->StopModem(&error, callback);
374 EXPECT_TRUE(error.IsSuccess());
375
376 ResultCallback disable_callback;
377 EXPECT_CALL(*modem_proxy,
378 Enable(false, _, _, CellularCapability::kTimeoutEnable))
379 .WillOnce(SaveArg<2>(&disable_callback));
380 dispatcher_.DispatchPendingEvents();
381
382 EXPECT_CALL(*this, TestCallback(IsSuccess()));
383 disable_callback.Run(Error(Error::kSuccess));
384}
385
386TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
387 // Save pointers to proxies before they are lost by the call to InitProxies
388 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
389 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
390 SetUp();
391 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
392 capability_->InitProxies();
393
394 ResultCallback disconnect_callback;
395 Error error;
396 ResultCallback callback =
397 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
398 EXPECT_CALL(*modem_simple_proxy,
399 Disconnect(::DBus::Path("/"), _, _,
Thieu Le049adb52012-11-12 17:14:51 -0800400 CellularCapability::kTimeoutDisconnect))
Jason Glasgow02401cc2012-05-16 10:35:37 -0400401 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700402 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400403 capability_->StopModem(&error, callback);
404 EXPECT_TRUE(error.IsSuccess());
405
406 ResultCallback disable_callback;
407 EXPECT_CALL(*modem_proxy,
408 Enable(false, _, _, CellularCapability::kTimeoutEnable))
409 .WillOnce(SaveArg<2>(&disable_callback));
410 disconnect_callback.Run(Error(Error::kSuccess));
411
412 EXPECT_CALL(*this, TestCallback(IsSuccess()));
413 disable_callback.Run(Error(Error::kSuccess));
414}
415
Thieu Le5d6864a2012-07-20 11:43:51 -0700416TEST_F(CellularCapabilityUniversalTest, DisconnectModemNoBearer) {
417 Error error;
418 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700419 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800420 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect))
Thieu Le5d6864a2012-07-20 11:43:51 -0700421 .Times(0);
422 capability_->Disconnect(&error, disconnect_callback);
423}
424
Thieu Le3d275392012-07-20 15:32:58 -0700425TEST_F(CellularCapabilityUniversalTest, DisconnectNoProxy) {
426 Error error;
427 ResultCallback disconnect_callback;
428 capability_->bearer_path_ = "/foo";
429 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800430 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect))
Thieu Le3d275392012-07-20 15:32:58 -0700431 .Times(0);
432 ReleaseCapabilityProxies();
433 capability_->Disconnect(&error, disconnect_callback);
434}
435
Arman Ugurayab9364e2012-12-19 20:45:25 -0800436TEST_F(CellularCapabilityUniversalTest, SimLockStatusChanged) {
437 // Set up mock SIM properties
438 const char kImsi[] = "310100000001";
439 const char kSimIdentifier[] = "9999888";
440 const char kOperatorIdentifier[] = "310240";
441 const char kOperatorName[] = "Custom SPN";
442 DBusPropertiesMap sim_properties;
443 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
444 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
445 .append_string(kSimIdentifier);
446 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
447 .append_string(kOperatorIdentifier);
448 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
449 .append_string(kOperatorName);
450
451 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
452 .WillOnce(Return(sim_properties));
453
454 SetUp();
455 InitProviderDB();
456
457 EXPECT_FALSE(capability_->sim_present_);
458 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
459
460 capability_->OnSimPathChanged(kSimPath);
461 EXPECT_TRUE(capability_->sim_present_);
462 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
463 EXPECT_EQ(kSimPath, capability_->sim_path_);
464
465 capability_->imsi_ = "";
466 capability_->sim_identifier_ = "";
467 capability_->operator_id_ = "";
468 capability_->spn_ = "";
469
470 // SIM is locked.
471 capability_->sim_lock_status_.lock_type = "sim-pin";
472 capability_->OnSimLockStatusChanged();
473
474 EXPECT_EQ("", capability_->imsi_);
475 EXPECT_EQ("", capability_->sim_identifier_);
476 EXPECT_EQ("", capability_->operator_id_);
477 EXPECT_EQ("", capability_->spn_);
478
479 // SIM is unlocked.
480 properties_proxy_.reset(new MockDBusPropertiesProxy());
481 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
482 .WillOnce(Return(sim_properties));
483
484 capability_->sim_lock_status_.lock_type = "";
485 capability_->OnSimLockStatusChanged();
486
487 EXPECT_EQ(kImsi, capability_->imsi_);
488 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
489 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
490 EXPECT_EQ(kOperatorName, capability_->spn_);
491}
492
Jason Glasgowaf583282012-04-18 15:18:22 -0400493TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
494 // Set up mock modem properties
495 DBusPropertiesMap modem_properties;
496 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
497 writer().append_uint32(kAccessTechnologies);
498 modem_properties[MM_MODEM_PROPERTY_SIM].
499 writer().append_path(kSimPath);
500
501 // Set up mock modem 3gpp properties
502 DBusPropertiesMap modem3gpp_properties;
503 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
504 writer().append_uint32(0);
505 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
506 writer().append_string(kImei);
507
508 // Set up mock modem sim properties
509 DBusPropertiesMap sim_properties;
510
511 // After setup we lose pointers to the proxies, so it is hard to set
512 // expectations.
513 EXPECT_CALL(*properties_proxy_,
514 GetAll(MM_DBUS_INTERFACE_SIM))
515 .WillOnce(Return(sim_properties));
516
517 SetUp();
518
519 EXPECT_EQ("", capability_->imei_);
520 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
521 capability_->access_technologies_);
522 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400523 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
524 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400525 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
526 modem_properties, vector<string>());
527 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
528 EXPECT_EQ(kSimPath, capability_->sim_path_);
529 EXPECT_TRUE(capability_->sim_proxy_.get());
530
531 // Changing properties on wrong interface will not have an effect
532 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
533 modem3gpp_properties,
534 vector<string>());
535 EXPECT_EQ("", capability_->imei_);
536
537 // Changing properties on the right interface gets reflected in the
538 // capabilities object
539 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
540 modem3gpp_properties,
541 vector<string>());
542 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400543
544 // Expect to see changes when the family changes
545 modem_properties.clear();
546 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
547 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
548 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
549 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
550 Times(1);
551 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
552 modem_properties,
553 vector<string>());
554 // Back to LTE
555 modem_properties.clear();
556 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
557 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
558 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
559 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
560 Times(1);
561 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
562 modem_properties,
563 vector<string>());
564
565 // LTE & CDMA - the device adaptor should not be called!
566 modem_properties.clear();
567 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
568 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
569 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
570 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
571 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
572 modem_properties,
573 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400574}
575
Ben Chanbd3aee82012-10-16 23:52:04 -0700576TEST_F(CellularCapabilityUniversalTest, SimPathChanged) {
577 // Set up mock modem SIM properties
578 const char kImsi[] = "310100000001";
579 const char kSimIdentifier[] = "9999888";
580 const char kOperatorIdentifier[] = "310240";
581 const char kOperatorName[] = "Custom SPN";
582 DBusPropertiesMap sim_properties;
583 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
584 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
585 .append_string(kSimIdentifier);
586 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
587 .append_string(kOperatorIdentifier);
588 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
589 .append_string(kOperatorName);
590
591 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
592 .Times(1).WillOnce(Return(sim_properties));
593
594 EXPECT_FALSE(capability_->sim_present_);
595 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
596 EXPECT_EQ("", capability_->sim_path_);
597 EXPECT_EQ("", capability_->imsi_);
598 EXPECT_EQ("", capability_->sim_identifier_);
599 EXPECT_EQ("", capability_->operator_id_);
600 EXPECT_EQ("", capability_->spn_);
601
602 capability_->OnSimPathChanged(kSimPath);
603 EXPECT_TRUE(capability_->sim_present_);
604 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
605 EXPECT_EQ(kSimPath, capability_->sim_path_);
606 EXPECT_EQ(kImsi, capability_->imsi_);
607 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
608 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
609 EXPECT_EQ(kOperatorName, capability_->spn_);
610
611 // Changing to the same SIM path should be a no-op.
612 capability_->OnSimPathChanged(kSimPath);
613 EXPECT_TRUE(capability_->sim_present_);
614 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
615 EXPECT_EQ(kSimPath, capability_->sim_path_);
616 EXPECT_EQ(kImsi, capability_->imsi_);
617 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
618 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
619 EXPECT_EQ(kOperatorName, capability_->spn_);
620
621 capability_->OnSimPathChanged("");
622 EXPECT_FALSE(capability_->sim_present_);
623 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
624 EXPECT_EQ("", capability_->sim_path_);
625 EXPECT_EQ("", capability_->imsi_);
626 EXPECT_EQ("", capability_->sim_identifier_);
627 EXPECT_EQ("", capability_->operator_id_);
628 EXPECT_EQ("", capability_->spn_);
629}
630
Jason Glasgowaf583282012-04-18 15:18:22 -0400631TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
632 // Set up mock modem properties
633 DBusPropertiesMap modem_properties;
634 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
635
636 // Set up mock modem sim properties
637 const char kImsi[] = "310100000001";
638 DBusPropertiesMap sim_properties;
639 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
640
641 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
642 .WillOnce(Return(sim_properties));
643
644 // After setup we lose pointers to the proxies, so it is hard to set
645 // expectations.
646 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400647 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400648
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400649 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
650 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
651 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400652 EXPECT_FALSE(capability_->sim_proxy_.get());
653 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
654 modem_properties, vector<string>());
655 EXPECT_EQ(kSimPath, capability_->sim_path_);
656 EXPECT_TRUE(capability_->sim_proxy_.get());
657 EXPECT_EQ(kImsi, capability_->imsi_);
658
659 // Updating the SIM
660 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400661 const char kCountry[] = "us";
662 const char kCode[] = "310160";
663 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400664 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400665 const char kOperatorIdentifier[] = "310240";
666 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400667 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
668 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
669 append_string(kSimIdentifier);
670 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
671 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400672 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
673 new_properties,
674 vector<string>());
675 EXPECT_EQ(kNewImsi, capability_->imsi_);
676 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
677 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400678 EXPECT_EQ("", capability_->spn_);
679 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
680 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
681 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
682 EXPECT_EQ(4, capability_->apn_list_.size());
683
684 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
685 append_string(kOperatorName);
686 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
687 new_properties,
688 vector<string>());
689 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400690 EXPECT_EQ(kOperatorName, capability_->spn_);
691}
692
Gary Morainceba6aa2012-05-03 10:28:26 -0700693MATCHER_P(SizeIs, value, "") {
694 return static_cast<size_t>(value) == arg.size();
695}
696
Ben Chan5d0d32c2013-01-08 02:05:29 -0800697TEST_F(CellularCapabilityUniversalTest, Reset) {
698 // Save pointers to proxies before they are lost by the call to InitProxies
699 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
700 SetUp();
701 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
702 capability_->InitProxies();
703
704 Error error;
705 ResultCallback reset_callback;
706
707 EXPECT_CALL(*modem_proxy, Reset(_, _, CellularCapability::kTimeoutReset))
708 .WillOnce(SaveArg<1>(&reset_callback));
709
710 capability_->Reset(&error, ResultCallback());
711 EXPECT_TRUE(capability_->resetting_);
712 reset_callback.Run(error);
713 EXPECT_FALSE(capability_->resetting_);
714}
715
Gary Morainceba6aa2012-05-03 10:28:26 -0700716// Validates that OnScanReply does not crash with a null callback.
717TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
718 Error error;
719 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
720 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
721 EXPECT_CALL(*device_adaptor_,
722 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
723 SizeIs(0)));
724 Set3gppProxy();
725 capability_->Scan(&error, ResultCallback());
726 EXPECT_TRUE(error.IsSuccess());
727}
728
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400729// Validates that the scanning property is updated
730TEST_F(CellularCapabilityUniversalTest, Scan) {
731 Error error;
732
733 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
734 .WillRepeatedly(SaveArg<1>(&scan_callback_));
735 EXPECT_CALL(*device_adaptor_,
736 EmitBoolChanged(flimflam::kScanningProperty, true));
737 Set3gppProxy();
738 capability_->Scan(&error, ResultCallback());
739 EXPECT_TRUE(capability_->scanning_);
740
741 // Simulate the completion of the scan with 2 networks in the results.
742 EXPECT_CALL(*device_adaptor_,
743 EmitBoolChanged(flimflam::kScanningProperty, false));
744 EXPECT_CALL(*device_adaptor_,
745 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
746 SizeIs(2)));
747 vector<DBusPropertiesMap> results;
748 const char kScanID0[] = "testID0";
749 const char kScanID1[] = "testID1";
750 results.push_back(DBusPropertiesMap());
751 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
752 writer().append_string(kScanID0);
753 results.push_back(DBusPropertiesMap());
754 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
755 writer().append_string(kScanID1);
756 scan_callback_.Run(results, error);
757 EXPECT_FALSE(capability_->scanning_);
758
759 // Simulate the completion of the scan with no networks in the results.
760 EXPECT_CALL(*device_adaptor_,
761 EmitBoolChanged(flimflam::kScanningProperty, true));
762 capability_->Scan(&error, ResultCallback());
763 EXPECT_TRUE(capability_->scanning_);
764 EXPECT_CALL(*device_adaptor_,
765 EmitBoolChanged(flimflam::kScanningProperty, false));
766 EXPECT_CALL(*device_adaptor_,
767 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
768 SizeIs(0)));
769 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
770 EXPECT_FALSE(capability_->scanning_);
771}
772
773// Validates expected property updates when scan fails
774TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
775 Error error;
776
777 // Test immediate error
778 {
779 InSequence seq;
780 EXPECT_CALL(*modem_3gpp_proxy_,
781 Scan(_, _, CellularCapability::kTimeoutScan))
782 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
783 EXPECT_CALL(*modem_3gpp_proxy_,
784 Scan(_, _, CellularCapability::kTimeoutScan))
785 .WillOnce(SaveArg<1>(&scan_callback_));
786 }
787 Set3gppProxy();
788 capability_->Scan(&error, ResultCallback());
789 EXPECT_FALSE(capability_->scanning_);
790 EXPECT_TRUE(error.IsFailure());
791
792 // Initiate a scan
793 error.Populate(Error::kSuccess);
794 EXPECT_CALL(*device_adaptor_,
795 EmitBoolChanged(flimflam::kScanningProperty, true));
796 capability_->Scan(&error, ResultCallback());
797 EXPECT_TRUE(capability_->scanning_);
798 EXPECT_TRUE(error.IsSuccess());
799
800 // Validate that error is returned if Scan is called while already scanning.
801 capability_->Scan(&error, ResultCallback());
802 EXPECT_TRUE(capability_->scanning_);
803 EXPECT_TRUE(error.IsFailure());
804
805 // Validate that signals are emitted even if an error is reported.
806 capability_->found_networks_.clear();
807 capability_->found_networks_.push_back(Stringmap());
808 EXPECT_CALL(*device_adaptor_,
809 EmitBoolChanged(flimflam::kScanningProperty, false));
810 EXPECT_CALL(*device_adaptor_,
811 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
812 SizeIs(0)));
813 vector<DBusPropertiesMap> results;
814 scan_callback_.Run(results, Error(Error::kOperationFailed));
815 EXPECT_FALSE(capability_->scanning_);
816}
817
Arman Uguray6e5639f2012-11-15 20:30:19 -0800818// Validates expected behavior of OnListBearersReply function
819TEST_F(CellularCapabilityUniversalTest, OnListBearersReply) {
820 // Check that bearer_path_ is set correctly when an active bearer
821 // is returned.
822 const size_t kPathCount = 3;
823 DBus::Path active_paths[kPathCount], inactive_paths[kPathCount];
824 for (size_t i = 0; i < kPathCount; ++i) {
825 active_paths[i] =
826 DBus::Path(base::StringPrintf("%s/%zu", kActiveBearerPathPrefix, i));
827 inactive_paths[i] =
828 DBus::Path(base::StringPrintf("%s/%zu", kInactiveBearerPathPrefix, i));
829 }
830
831 std::vector<DBus::Path> paths;
832 paths.push_back(inactive_paths[0]);
833 paths.push_back(inactive_paths[1]);
834 paths.push_back(active_paths[2]);
835 paths.push_back(inactive_paths[1]);
836 paths.push_back(inactive_paths[2]);
837
838 Error error;
839 capability_->OnListBearersReply(paths, error);
840 EXPECT_STREQ(capability_->bearer_path_.c_str(), active_paths[2].c_str());
841
842 paths.clear();
843
844 // Check that bearer_path_ is empty if no active bearers are returned.
845 paths.push_back(inactive_paths[0]);
846 paths.push_back(inactive_paths[1]);
847 paths.push_back(inactive_paths[2]);
848 paths.push_back(inactive_paths[1]);
849
850 capability_->OnListBearersReply(paths, error);
851 EXPECT_TRUE(capability_->bearer_path_.empty());
852
853 // Check that returning multiple bearers causes death.
854 paths.push_back(active_paths[0]);
855 paths.push_back(inactive_paths[1]);
856 paths.push_back(inactive_paths[2]);
857 paths.push_back(active_paths[1]);
858 paths.push_back(inactive_paths[1]);
859
860 EXPECT_DEATH(capability_->OnListBearersReply(paths, error),
861 "Found more than one active bearer.");
862}
863
Jason Glasgow14521872012-05-07 19:12:15 -0400864// Validates expected behavior of Connect function
865TEST_F(CellularCapabilityUniversalTest, Connect) {
866 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
867 SetSimpleProxy();
868 Error error;
869 DBusPropertiesMap properties;
870 capability_->apn_try_list_.clear();
871 ResultCallback callback =
872 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
873 DBus::Path bearer("/foo");
874
875 // Test connect failures
876 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
877 .WillOnce(SaveArg<2>(&connect_callback_));
878 capability_->Connect(properties, &error, callback);
879 EXPECT_TRUE(error.IsSuccess());
880 EXPECT_CALL(*this, TestCallback(IsFailure()));
881 EXPECT_CALL(*service_, ClearLastGoodApn());
882 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
883
884 // Test connect success
885 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
886 .WillOnce(SaveArg<2>(&connect_callback_));
887 capability_->Connect(properties, &error, callback);
888 EXPECT_TRUE(error.IsSuccess());
889 EXPECT_CALL(*this, TestCallback(IsSuccess()));
890 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -0400891
892 // Test connect failures without a service. Make sure that shill
893 // does not crash if the connect failed and there is no
894 // CellularService object. This can happen if the modem is enabled
895 // and then quickly disabled.
896 cellular_->service_ = NULL;
897 EXPECT_FALSE(capability_->cellular()->service());
898 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
899 .WillOnce(SaveArg<2>(&connect_callback_));
900 capability_->Connect(properties, &error, callback);
901 EXPECT_TRUE(error.IsSuccess());
902 EXPECT_CALL(*this, TestCallback(IsFailure()));
903 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -0400904}
905
906// Validates Connect iterates over APNs
907TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
908 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
909 SetSimpleProxy();
910 Error error;
911 DBusPropertiesMap properties;
912 capability_->apn_try_list_.clear();
913 ResultCallback callback =
914 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
915 DBus::Path bearer("/bearer0");
916
917 const char apn_name_foo[] = "foo";
918 const char apn_name_bar[] = "bar";
919 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
920 .WillOnce(SaveArg<2>(&connect_callback_));
921 Stringmap apn1;
922 apn1[flimflam::kApnProperty] = apn_name_foo;
923 capability_->apn_try_list_.push_back(apn1);
924 Stringmap apn2;
925 apn2[flimflam::kApnProperty] = apn_name_bar;
926 capability_->apn_try_list_.push_back(apn2);
927 capability_->FillConnectPropertyMap(&properties);
928 capability_->Connect(properties, &error, callback);
929 EXPECT_TRUE(error.IsSuccess());
930
931 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
932 .WillOnce(SaveArg<2>(&connect_callback_));
933 EXPECT_CALL(*service_, ClearLastGoodApn());
934 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
935
936 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
937 EXPECT_CALL(*this, TestCallback(IsSuccess()));
938 connect_callback_.Run(bearer, Error(Error::kSuccess));
939}
940
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400941// Validates GetTypeString and AccessTechnologyToTechnologyFamily
942TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
943 const int gsm_technologies[] = {
944 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
945 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
946 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
947 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
948 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
949 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
950 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
951 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
952 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
953 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
954 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
955 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
956 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
957 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
958 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
959 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
960 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
961 };
Ben Chan62028b22012-11-05 11:20:02 -0800962 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400963 capability_->access_technologies_ = gsm_technologies[i];
964 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
965 }
966 const int cdma_technologies[] = {
967 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
968 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
969 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
970 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
971 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
972 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
973 };
Ben Chan62028b22012-11-05 11:20:02 -0800974 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400975 capability_->access_technologies_ = cdma_technologies[i];
976 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
977 }
978 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
979 ASSERT_EQ(capability_->GetTypeString(), "");
980}
981
Darin Petkovf508c822012-09-21 13:43:17 +0200982TEST_F(CellularCapabilityUniversalTest, AllowRoaming) {
983 EXPECT_FALSE(cellular_->allow_roaming_);
984 EXPECT_FALSE(capability_->provider_requires_roaming_);
985 EXPECT_FALSE(capability_->AllowRoaming());
986 capability_->provider_requires_roaming_ = true;
987 EXPECT_TRUE(capability_->AllowRoaming());
988 capability_->provider_requires_roaming_ = false;
989 cellular_->allow_roaming_ = true;
990 EXPECT_TRUE(capability_->AllowRoaming());
991}
992
Darin Petkovb4fccd22012-08-10 11:59:26 +0200993TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
994 static const char kTestCarrier[] = "The Cellular Carrier";
995 static const char kCountry[] = "us";
996 static const char kCode[] = "310160";
997 capability_->imsi_ = "310240123456789";
998
Darin Petkovf508c822012-09-21 13:43:17 +0200999 EXPECT_FALSE(capability_->home_provider_);
1000 EXPECT_FALSE(capability_->provider_requires_roaming_);
1001
Darin Petkovb4fccd22012-08-10 11:59:26 +02001002 capability_->SetHomeProvider(); // No mobile provider DB available.
1003 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
1004 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
1005 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +02001006 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001007
1008 InitProviderDB();
1009 capability_->SetHomeProvider();
1010 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
1011 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1012 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
1013 EXPECT_EQ(4, capability_->apn_list_.size());
1014 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001015 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001016
1017 Cellular::Operator oper;
1018 cellular_->set_home_provider(oper);
1019 capability_->spn_ = kTestCarrier;
1020 capability_->SetHomeProvider();
1021 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
1022 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
1023 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +02001024 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001025
1026 static const char kCubic[] = "Cubic";
1027 capability_->spn_ = kCubic;
1028 capability_->SetHomeProvider();
1029 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
1030 EXPECT_EQ("", cellular_->home_provider().GetCode());
1031 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001032 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001033
1034 static const char kCUBIC[] = "CUBIC";
1035 capability_->spn_ = kCUBIC;
1036 capability_->home_provider_ = NULL;
1037 capability_->SetHomeProvider();
1038 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
1039 EXPECT_EQ("", cellular_->home_provider().GetCode());
1040 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +02001041 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +02001042}
1043
Ben Chan8a2c01e2013-01-23 10:09:14 -08001044TEST_F(CellularCapabilityUniversalTest, UpdateScanningProperty) {
1045 // Save pointers to proxies before they are lost by the call to InitProxies
1046 // mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
1047 SetUp();
1048 //EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
1049 capability_->InitProxies();
1050
1051 EXPECT_FALSE(capability_->scanning_or_searching_);
1052 capability_->UpdateScanningProperty();
1053 EXPECT_FALSE(capability_->scanning_or_searching_);
1054
1055 capability_->scanning_ = true;
1056 capability_->UpdateScanningProperty();
1057 EXPECT_TRUE(capability_->scanning_or_searching_);
1058
1059 capability_->scanning_ = false;
1060 capability_->cellular()->modem_state_ = Cellular::kModemStateInitializing;
1061 capability_->UpdateScanningProperty();
1062 EXPECT_FALSE(capability_->scanning_or_searching_);
1063 capability_->cellular()->modem_state_ = Cellular::kModemStateLocked;
1064 capability_->UpdateScanningProperty();
1065 EXPECT_FALSE(capability_->scanning_or_searching_);
1066 capability_->cellular()->modem_state_ = Cellular::kModemStateDisabled;
1067 capability_->UpdateScanningProperty();
1068 EXPECT_FALSE(capability_->scanning_or_searching_);
1069 capability_->cellular()->modem_state_ = Cellular::kModemStateEnabling;
1070 capability_->UpdateScanningProperty();
1071 EXPECT_TRUE(capability_->scanning_or_searching_);
1072 capability_->cellular()->modem_state_ = Cellular::kModemStateEnabled;
1073 capability_->UpdateScanningProperty();
1074 EXPECT_TRUE(capability_->scanning_or_searching_);
1075 capability_->cellular()->modem_state_ = Cellular::kModemStateSearching;
1076 capability_->UpdateScanningProperty();
1077 EXPECT_TRUE(capability_->scanning_or_searching_);
1078 capability_->cellular()->modem_state_ = Cellular::kModemStateRegistered;
1079 capability_->UpdateScanningProperty();
1080 EXPECT_FALSE(capability_->scanning_or_searching_);
1081 capability_->cellular()->modem_state_ = Cellular::kModemStateConnecting;
1082 capability_->UpdateScanningProperty();
1083 EXPECT_FALSE(capability_->scanning_or_searching_);
1084 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
1085 capability_->UpdateScanningProperty();
1086 EXPECT_FALSE(capability_->scanning_or_searching_);
1087 capability_->cellular()->modem_state_ = Cellular::kModemStateDisconnecting;
1088 capability_->UpdateScanningProperty();
1089 EXPECT_FALSE(capability_->scanning_or_searching_);
1090}
1091
Ben Chan6d0d1e72012-11-06 21:19:28 -08001092TEST_F(CellularCapabilityUniversalTest, UpdateOLP) {
1093 CellularService::OLP test_olp;
1094 test_olp.SetURL("http://testurl");
1095 test_olp.SetMethod("POST");
1096 test_olp.SetPostData("esn=${esn}&imei=${imei}&imsi=${imsi}&mdn=${mdn}&"
1097 "meid=${meid}&min=${min}&iccid=${iccid}");
1098
Ben Chan6d0d1e72012-11-06 21:19:28 -08001099 capability_->esn_ = "0";
1100 capability_->imei_ = "1";
1101 capability_->imsi_ = "2";
1102 capability_->mdn_ = "3";
1103 capability_->meid_= "4";
1104 capability_->min_ = "5";
1105 capability_->sim_identifier_ = "6";
1106 capability_->operator_id_ = "123456";
1107 cellular_->cellular_operator_info_ = &cellular_operator_info_;
1108
Arman Ugurayf4c61812013-01-10 18:58:39 -08001109 EXPECT_CALL(cellular_operator_info_,
1110 GetOLPByMCCMNC(capability_->operator_id_))
1111 .WillRepeatedly(Return(&test_olp));
Ben Chan6d0d1e72012-11-06 21:19:28 -08001112
1113 SetService();
1114 capability_->UpdateOLP();
1115 const CellularService::OLP &olp = cellular_->service()->olp();
1116 EXPECT_EQ("http://testurl", olp.GetURL());
1117 EXPECT_EQ("POST", olp.GetMethod());
1118 EXPECT_EQ("esn=0&imei=1&imsi=2&mdn=3&meid=4&min=5&iccid=6",
1119 olp.GetPostData());
1120}
1121
Darin Petkova4ca3c32012-08-17 16:05:24 +02001122TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfo) {
1123 static const char kOperatorName[] = "Swisscom";
1124 InitProviderDB();
1125 capability_->serving_operator_.SetCode("22801");
1126 SetService();
1127 capability_->UpdateOperatorInfo();
1128 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
1129 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1130 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
1131
1132 static const char kTestOperator[] = "Testcom";
1133 capability_->serving_operator_.SetName(kTestOperator);
1134 capability_->serving_operator_.SetCountry("");
1135 capability_->UpdateOperatorInfo();
1136 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
1137 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1138 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
1139}
1140
Ben Chan092b12b2012-11-07 22:04:05 -08001141TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfoViaOperatorId) {
1142 static const char kOperatorName[] = "Swisscom";
1143 static const char kOperatorId[] = "22801";
1144 InitProviderDB();
1145 capability_->serving_operator_.SetCode("");
1146 SetService();
1147 capability_->UpdateOperatorInfo();
1148 EXPECT_EQ("", capability_->serving_operator_.GetName());
1149 EXPECT_EQ("", capability_->serving_operator_.GetCountry());
1150 EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
1151
1152 capability_->operator_id_ = kOperatorId;
1153
1154 // Service activation is not needed
1155 cellular_->cellular_operator_info_ = &cellular_operator_info_;
Arman Ugurayf4c61812013-01-10 18:58:39 -08001156 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
1157 .WillOnce(Return((const CellularService::OLP *)NULL));
Ben Chan092b12b2012-11-07 22:04:05 -08001158 capability_->UpdateOperatorInfo();
1159 EXPECT_EQ("", capability_->serving_operator_.GetName());
1160 EXPECT_EQ("", capability_->serving_operator_.GetCountry());
1161 EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
1162
1163 // Service activation is needed
1164 capability_->mdn_ = "0000000000";
1165 cellular_->cellular_operator_info_ = &cellular_operator_info_;
Arman Ugurayf4c61812013-01-10 18:58:39 -08001166 CellularService::OLP olp;
1167 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
1168 .WillOnce(Return(&olp));
Ben Chan092b12b2012-11-07 22:04:05 -08001169
1170 capability_->UpdateOperatorInfo();
1171 EXPECT_EQ(kOperatorId, capability_->serving_operator_.GetCode());
1172 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
1173 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
1174 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
1175}
1176
Darin Petkova4ca3c32012-08-17 16:05:24 +02001177TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
1178 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
1179 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
1180 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
1181
Ben Chan092b12b2012-11-07 22:04:05 -08001182 // Service activation is not needed
1183 capability_->operator_id_ = "0123";
1184 EXPECT_EQ("GSMNetwork2", capability_->CreateFriendlyServiceName());
1185
1186 // Service activation is needed
1187 capability_->mdn_ = "0000000000";
1188 cellular_->cellular_operator_info_ = &cellular_operator_info_;
Arman Ugurayf4c61812013-01-10 18:58:39 -08001189 CellularService::OLP olp;
1190 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
1191 .WillOnce(Return(&olp));
Ben Chan092b12b2012-11-07 22:04:05 -08001192 EXPECT_EQ("cellular_0123", capability_->CreateFriendlyServiceName());
1193 EXPECT_EQ("0123", capability_->serving_operator_.GetCode());
1194
Darin Petkova4ca3c32012-08-17 16:05:24 +02001195 capability_->serving_operator_.SetCode("1234");
1196 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
1197
1198 static const char kHomeProvider[] = "The GSM Home Provider";
1199 cellular_->home_provider_.SetName(kHomeProvider);
1200 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
1201 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
1202 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
1203
1204 static const char kTestOperator[] = "A GSM Operator";
1205 capability_->serving_operator_.SetName(kTestOperator);
1206 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
1207
1208 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
1209 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
1210 capability_->CreateFriendlyServiceName());
1211}
1212
Ben Chan15786032012-11-04 21:28:02 -08001213TEST_F(CellularCapabilityUniversalTest, IsServiceActivationRequired) {
1214 capability_->mdn_ = "0000000000";
1215 cellular_->cellular_operator_info_ = NULL;
1216 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1217
1218 cellular_->cellular_operator_info_ = &cellular_operator_info_;
Arman Ugurayf4c61812013-01-10 18:58:39 -08001219 CellularService::OLP olp;
1220 EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
1221 .WillOnce(Return((const CellularService::OLP *)NULL))
1222 .WillRepeatedly(Return(&olp));
Ben Chan15786032012-11-04 21:28:02 -08001223 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1224
1225 capability_->mdn_ = "";
1226 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1227 capability_->mdn_ = "1234567890";
1228 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1229 capability_->mdn_ = "+1-234-567-890";
1230 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1231 capability_->mdn_ = "0000000000";
1232 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1233 capability_->mdn_ = "0-000-000-000";
1234 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1235 capability_->mdn_ = "+0-000-000-000";
1236 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1237}
1238
Ben Chanfcca27b2013-01-22 15:03:44 -08001239TEST_F(CellularCapabilityUniversalTest, OnModemCurrentCapabilitiesChanged) {
1240 EXPECT_FALSE(capability_->scanning_supported_);
1241 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_LTE);
1242 EXPECT_FALSE(capability_->scanning_supported_);
1243 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_CDMA_EVDO);
1244 EXPECT_FALSE(capability_->scanning_supported_);
1245 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_GSM_UMTS);
1246 EXPECT_TRUE(capability_->scanning_supported_);
1247 capability_->OnModemCurrentCapabilitiesChanged(
1248 MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO);
1249 EXPECT_TRUE(capability_->scanning_supported_);
1250}
1251
Jason Glasgowef965562012-04-10 16:12:35 -04001252} // namespace shill