blob: b504943ec33b98a8cbb43e25c086d37073fe1879 [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>
11#include <chromeos/dbus/service_constants.h>
12#include <gtest/gtest.h>
13#include <mobile_provider.h>
Jason Glasgowaf583282012-04-18 15:18:22 -040014#include <mm/ModemManager-names.h>
Jason Glasgowef965562012-04-10 16:12:35 -040015
16#include "shill/cellular.h"
17#include "shill/cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040018#include "shill/dbus_adaptor.h"
Jason Glasgowef965562012-04-10 16:12:35 -040019#include "shill/error.h"
20#include "shill/event_dispatcher.h"
21#include "shill/mock_adaptors.h"
Jason Glasgow14521872012-05-07 19:12:15 -040022#include "shill/mock_cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040023#include "shill/mock_dbus_properties_proxy.h"
Jason Glasgowef965562012-04-10 16:12:35 -040024#include "shill/mock_glib.h"
25#include "shill/mock_manager.h"
26#include "shill/mock_metrics.h"
27#include "shill/mock_mm1_modem_modem3gpp_proxy.h"
28#include "shill/mock_mm1_modem_modemcdma_proxy.h"
29#include "shill/mock_mm1_modem_proxy.h"
30#include "shill/mock_mm1_modem_simple_proxy.h"
31#include "shill/mock_mm1_sim_proxy.h"
32#include "shill/mock_profile.h"
33#include "shill/mock_rtnl_handler.h"
34#include "shill/nice_mock_control.h"
35#include "shill/proxy_factory.h"
36
37using base::Bind;
38using base::Unretained;
39using std::string;
Nathan Williams4b7c2a82012-04-13 15:19:47 -040040using std::vector;
Jason Glasgowef965562012-04-10 16:12:35 -040041using testing::InSequence;
42using testing::NiceMock;
43using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040044using testing::SaveArg;
Jason Glasgowef965562012-04-10 16:12:35 -040045using testing::_;
46
47namespace shill {
48
49MATCHER(IsSuccess, "") {
50 return arg.IsSuccess();
51}
52MATCHER(IsFailure, "") {
53 return arg.IsFailure();
54}
Jason Glasgow14521872012-05-07 19:12:15 -040055MATCHER_P(HasApn, expected_apn, "") {
56 string apn;
57 return (DBusProperties::GetString(arg,
58 CellularCapabilityUniversal::kConnectApn,
59 &apn) &&
60 apn == expected_apn);
61}
Jason Glasgowef965562012-04-10 16:12:35 -040062
63class CellularCapabilityUniversalTest : public testing::Test {
64 public:
65 CellularCapabilityUniversalTest()
66 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
67 cellular_(new Cellular(&control_,
68 &dispatcher_,
69 NULL,
70 &manager_,
71 "",
72 "",
73 0,
74 Cellular::kTypeUniversal,
75 "",
76 "",
77 NULL)),
Jason Glasgow14521872012-05-07 19:12:15 -040078 service_(new MockCellularService(&control_,
79 &dispatcher_,
80 &metrics_,
81 &manager_,
82 cellular_)),
Jason Glasgowef965562012-04-10 16:12:35 -040083 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
84 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
85 modem_proxy_(new mm1::MockModemProxy()),
86 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
87 sim_proxy_(new mm1::MockSimProxy()),
Jason Glasgowaf583282012-04-18 15:18:22 -040088 properties_proxy_(new MockDBusPropertiesProxy()),
Jason Glasgowef965562012-04-10 16:12:35 -040089 proxy_factory_(this),
90 capability_(NULL),
91 device_adaptor_(NULL) {}
92
93 virtual ~CellularCapabilityUniversalTest() {
94 cellular_->service_ = NULL;
95 capability_ = NULL;
96 device_adaptor_ = NULL;
97 }
98
99 virtual void SetUp() {
100 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
101 cellular_->capability_.get());
102 capability_->proxy_factory_ = &proxy_factory_;
103 device_adaptor_ =
104 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400105 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400106 }
107
108 virtual void TearDown() {
109 capability_->proxy_factory_ = NULL;
110 }
111
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400112 void InitProviderDB() {
113 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
114
115 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
116 ASSERT_TRUE(provider_db_);
117 cellular_->provider_db_ = provider_db_;
118 }
119
Jason Glasgowef965562012-04-10 16:12:35 -0400120 void InvokeEnable(bool enable, Error *error,
121 const ResultCallback &callback, int timeout) {
122 callback.Run(Error());
123 }
124 void InvokeEnableFail(bool enable, Error *error,
125 const ResultCallback &callback, int timeout) {
126 callback.Run(Error(Error::kOperationFailed));
127 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400128 void InvokeRegister(const string &operator_id, Error *error,
129 const ResultCallback &callback, int timeout) {
130 callback.Run(Error());
131 }
132
Gary Morainceba6aa2012-05-03 10:28:26 -0700133 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
134 int timeout) {
135 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
136 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400137 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
138 int timeout) {
139 error->Populate(Error::kOperationFailed);
140 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700141
142 void Set3gppProxy() {
143 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
144 }
145
Jason Glasgow14521872012-05-07 19:12:15 -0400146 void SetSimpleProxy() {
147 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
148 }
149
Jason Glasgowef965562012-04-10 16:12:35 -0400150 MOCK_METHOD1(TestCallback, void(const Error &error));
151
152 protected:
153 static const char kImei[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400154 static const char kSimPath[];
155 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400156
157 class TestProxyFactory : public ProxyFactory {
158 public:
159 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
160 test_(test) {}
161
162 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
163 const std::string &/* path */,
164 const std::string &/* service */) {
165 return test_->modem_3gpp_proxy_.release();
166 }
167
168 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
169 const std::string &/* path */,
170 const std::string &/* service */) {
171 return test_->modem_cdma_proxy_.release();
172 }
173
174 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
175 const std::string &/* path */,
176 const std::string &/* service */) {
177 return test_->modem_proxy_.release();
178 }
179
180 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
181 const std::string &/* path */,
182 const std::string &/* service */) {
183 return test_->modem_simple_proxy_.release();
184 }
185
186 virtual mm1::SimProxyInterface *CreateSimProxy(
187 const std::string &/* path */,
188 const std::string &/* service */) {
189 return test_->sim_proxy_.release();
190 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400191 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
192 const std::string &/* path */,
193 const std::string &/* service */) {
194 return test_->properties_proxy_.release();
195 }
Jason Glasgowef965562012-04-10 16:12:35 -0400196
197 private:
198 CellularCapabilityUniversalTest *test_;
199 };
200
201 NiceMockControl control_;
202 EventDispatcher dispatcher_;
203 MockMetrics metrics_;
204 MockGLib glib_;
205 MockManager manager_;
206 CellularRefPtr cellular_;
Jason Glasgow14521872012-05-07 19:12:15 -0400207 MockCellularService *service_; // owned by cellular_
Jason Glasgowef965562012-04-10 16:12:35 -0400208 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
209 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
210 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
211 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
212 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400213 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400214 TestProxyFactory proxy_factory_;
215 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
216 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400217 mobile_provider_db *provider_db_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400218 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400219 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400220};
221
222const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Jason Glasgowaf583282012-04-18 15:18:22 -0400223const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
224const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
225 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
226 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400227
228TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400229 // Set up mock modem properties
230 DBusPropertiesMap modem_properties;
231 string operator_name = "TestOperator";
232 string operator_code = "001400";
233
234 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
235 writer().append_uint32(kAccessTechnologies);
236
237 ::DBus::Variant v;
238 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400239 ::DBus::Struct< uint32_t, bool > quality;
240 quality._1 = 90;
241 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400242 writer << quality;
243 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
244
245 // Set up mock modem 3gpp properties
246 DBusPropertiesMap modem3gpp_properties;
247 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
248 writer().append_uint32(0);
249 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
250 writer().append_string(kImei);
251
252 EXPECT_CALL(*modem_proxy_,
253 Enable(true, _, _, CellularCapability::kTimeoutEnable))
254 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
255 EXPECT_CALL(*properties_proxy_,
256 GetAll(MM_DBUS_INTERFACE_MODEM))
257 .WillOnce(Return(modem_properties));
258 EXPECT_CALL(*properties_proxy_,
259 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
260 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400261
262 // After setup we lose pointers to the proxies, so it is hard to set
263 // expectations.
264 SetUp();
265
266 Error error;
Jason Glasgowaf583282012-04-18 15:18:22 -0400267 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Jason Glasgowef965562012-04-10 16:12:35 -0400268 ResultCallback callback =
269 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
270 capability_->StartModem(&error, callback);
271 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400272 EXPECT_EQ(kImei, capability_->imei_);
273 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400274}
275
276TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
277 EXPECT_CALL(*modem_proxy_,
278 Enable(true, _, _, CellularCapability::kTimeoutEnable))
279 .WillOnce(
280 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
281 EXPECT_CALL(*this, TestCallback(IsFailure()));
282 ResultCallback callback =
283 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
284 SetUp();
285
286 Error error;
287 capability_->StartModem(&error, callback);
288 EXPECT_TRUE(error.IsSuccess());
289}
290
Jason Glasgow02401cc2012-05-16 10:35:37 -0400291TEST_F(CellularCapabilityUniversalTest, StopModem) {
292 // Save pointers to proxies before they are lost by the call to InitProxies
293 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
294 SetUp();
295 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
296 capability_->InitProxies();
297
298 Error error;
299 ResultCallback callback =
300 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
301 capability_->StopModem(&error, callback);
302 EXPECT_TRUE(error.IsSuccess());
303
304 ResultCallback disable_callback;
305 EXPECT_CALL(*modem_proxy,
306 Enable(false, _, _, CellularCapability::kTimeoutEnable))
307 .WillOnce(SaveArg<2>(&disable_callback));
308 dispatcher_.DispatchPendingEvents();
309
310 EXPECT_CALL(*this, TestCallback(IsSuccess()));
311 disable_callback.Run(Error(Error::kSuccess));
312}
313
314TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
315 // Save pointers to proxies before they are lost by the call to InitProxies
316 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
317 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
318 SetUp();
319 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
320 capability_->InitProxies();
321
322 ResultCallback disconnect_callback;
323 Error error;
324 ResultCallback callback =
325 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
326 EXPECT_CALL(*modem_simple_proxy,
327 Disconnect(::DBus::Path("/"), _, _,
328 CellularCapability::kTimeoutDefault))
329 .WillOnce(SaveArg<2>(&disconnect_callback));
330 capability_->cellular()->state_ = Cellular::kStateConnected;
331 capability_->StopModem(&error, callback);
332 EXPECT_TRUE(error.IsSuccess());
333
334 ResultCallback disable_callback;
335 EXPECT_CALL(*modem_proxy,
336 Enable(false, _, _, CellularCapability::kTimeoutEnable))
337 .WillOnce(SaveArg<2>(&disable_callback));
338 disconnect_callback.Run(Error(Error::kSuccess));
339
340 EXPECT_CALL(*this, TestCallback(IsSuccess()));
341 disable_callback.Run(Error(Error::kSuccess));
342}
343
Jason Glasgowaf583282012-04-18 15:18:22 -0400344TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
345 // Set up mock modem properties
346 DBusPropertiesMap modem_properties;
347 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
348 writer().append_uint32(kAccessTechnologies);
349 modem_properties[MM_MODEM_PROPERTY_SIM].
350 writer().append_path(kSimPath);
351
352 // Set up mock modem 3gpp properties
353 DBusPropertiesMap modem3gpp_properties;
354 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
355 writer().append_uint32(0);
356 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
357 writer().append_string(kImei);
358
359 // Set up mock modem sim properties
360 DBusPropertiesMap sim_properties;
361
362 // After setup we lose pointers to the proxies, so it is hard to set
363 // expectations.
364 EXPECT_CALL(*properties_proxy_,
365 GetAll(MM_DBUS_INTERFACE_SIM))
366 .WillOnce(Return(sim_properties));
367
368 SetUp();
369
370 EXPECT_EQ("", capability_->imei_);
371 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
372 capability_->access_technologies_);
373 EXPECT_FALSE(capability_->sim_proxy_.get());
374 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
375 modem_properties, vector<string>());
376 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
377 EXPECT_EQ(kSimPath, capability_->sim_path_);
378 EXPECT_TRUE(capability_->sim_proxy_.get());
379
380 // Changing properties on wrong interface will not have an effect
381 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
382 modem3gpp_properties,
383 vector<string>());
384 EXPECT_EQ("", capability_->imei_);
385
386 // Changing properties on the right interface gets reflected in the
387 // capabilities object
388 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
389 modem3gpp_properties,
390 vector<string>());
391 EXPECT_EQ(kImei, capability_->imei_);
392}
393
394TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
395 // Set up mock modem properties
396 DBusPropertiesMap modem_properties;
397 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
398
399 // Set up mock modem sim properties
400 const char kImsi[] = "310100000001";
401 DBusPropertiesMap sim_properties;
402 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
403
404 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
405 .WillOnce(Return(sim_properties));
406
407 // After setup we lose pointers to the proxies, so it is hard to set
408 // expectations.
409 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400410 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400411
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400412 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
413 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
414 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400415 EXPECT_FALSE(capability_->sim_proxy_.get());
416 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
417 modem_properties, vector<string>());
418 EXPECT_EQ(kSimPath, capability_->sim_path_);
419 EXPECT_TRUE(capability_->sim_proxy_.get());
420 EXPECT_EQ(kImsi, capability_->imsi_);
421
422 // Updating the SIM
423 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400424 const char kCountry[] = "us";
425 const char kCode[] = "310160";
426 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400427 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400428 const char kOperatorIdentifier[] = "310240";
429 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400430 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
431 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
432 append_string(kSimIdentifier);
433 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
434 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400435 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
436 new_properties,
437 vector<string>());
438 EXPECT_EQ(kNewImsi, capability_->imsi_);
439 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
440 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400441 EXPECT_EQ("", capability_->spn_);
442 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
443 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
444 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
445 EXPECT_EQ(4, capability_->apn_list_.size());
446
447 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
448 append_string(kOperatorName);
449 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
450 new_properties,
451 vector<string>());
452 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400453 EXPECT_EQ(kOperatorName, capability_->spn_);
454}
455
Gary Morainceba6aa2012-05-03 10:28:26 -0700456MATCHER_P(SizeIs, value, "") {
457 return static_cast<size_t>(value) == arg.size();
458}
459
460// Validates that OnScanReply does not crash with a null callback.
461TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
462 Error error;
463 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
464 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
465 EXPECT_CALL(*device_adaptor_,
466 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
467 SizeIs(0)));
468 Set3gppProxy();
469 capability_->Scan(&error, ResultCallback());
470 EXPECT_TRUE(error.IsSuccess());
471}
472
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400473// Validates that the scanning property is updated
474TEST_F(CellularCapabilityUniversalTest, Scan) {
475 Error error;
476
477 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
478 .WillRepeatedly(SaveArg<1>(&scan_callback_));
479 EXPECT_CALL(*device_adaptor_,
480 EmitBoolChanged(flimflam::kScanningProperty, true));
481 Set3gppProxy();
482 capability_->Scan(&error, ResultCallback());
483 EXPECT_TRUE(capability_->scanning_);
484
485 // Simulate the completion of the scan with 2 networks in the results.
486 EXPECT_CALL(*device_adaptor_,
487 EmitBoolChanged(flimflam::kScanningProperty, false));
488 EXPECT_CALL(*device_adaptor_,
489 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
490 SizeIs(2)));
491 vector<DBusPropertiesMap> results;
492 const char kScanID0[] = "testID0";
493 const char kScanID1[] = "testID1";
494 results.push_back(DBusPropertiesMap());
495 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
496 writer().append_string(kScanID0);
497 results.push_back(DBusPropertiesMap());
498 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
499 writer().append_string(kScanID1);
500 scan_callback_.Run(results, error);
501 EXPECT_FALSE(capability_->scanning_);
502
503 // Simulate the completion of the scan with no networks in the results.
504 EXPECT_CALL(*device_adaptor_,
505 EmitBoolChanged(flimflam::kScanningProperty, true));
506 capability_->Scan(&error, ResultCallback());
507 EXPECT_TRUE(capability_->scanning_);
508 EXPECT_CALL(*device_adaptor_,
509 EmitBoolChanged(flimflam::kScanningProperty, false));
510 EXPECT_CALL(*device_adaptor_,
511 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
512 SizeIs(0)));
513 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
514 EXPECT_FALSE(capability_->scanning_);
515}
516
517// Validates expected property updates when scan fails
518TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
519 Error error;
520
521 // Test immediate error
522 {
523 InSequence seq;
524 EXPECT_CALL(*modem_3gpp_proxy_,
525 Scan(_, _, CellularCapability::kTimeoutScan))
526 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
527 EXPECT_CALL(*modem_3gpp_proxy_,
528 Scan(_, _, CellularCapability::kTimeoutScan))
529 .WillOnce(SaveArg<1>(&scan_callback_));
530 }
531 Set3gppProxy();
532 capability_->Scan(&error, ResultCallback());
533 EXPECT_FALSE(capability_->scanning_);
534 EXPECT_TRUE(error.IsFailure());
535
536 // Initiate a scan
537 error.Populate(Error::kSuccess);
538 EXPECT_CALL(*device_adaptor_,
539 EmitBoolChanged(flimflam::kScanningProperty, true));
540 capability_->Scan(&error, ResultCallback());
541 EXPECT_TRUE(capability_->scanning_);
542 EXPECT_TRUE(error.IsSuccess());
543
544 // Validate that error is returned if Scan is called while already scanning.
545 capability_->Scan(&error, ResultCallback());
546 EXPECT_TRUE(capability_->scanning_);
547 EXPECT_TRUE(error.IsFailure());
548
549 // Validate that signals are emitted even if an error is reported.
550 capability_->found_networks_.clear();
551 capability_->found_networks_.push_back(Stringmap());
552 EXPECT_CALL(*device_adaptor_,
553 EmitBoolChanged(flimflam::kScanningProperty, false));
554 EXPECT_CALL(*device_adaptor_,
555 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
556 SizeIs(0)));
557 vector<DBusPropertiesMap> results;
558 scan_callback_.Run(results, Error(Error::kOperationFailed));
559 EXPECT_FALSE(capability_->scanning_);
560}
561
Jason Glasgow14521872012-05-07 19:12:15 -0400562// Validates expected behavior of Connect function
563TEST_F(CellularCapabilityUniversalTest, Connect) {
564 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
565 SetSimpleProxy();
566 Error error;
567 DBusPropertiesMap properties;
568 capability_->apn_try_list_.clear();
569 ResultCallback callback =
570 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
571 DBus::Path bearer("/foo");
572
573 // Test connect failures
574 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
575 .WillOnce(SaveArg<2>(&connect_callback_));
576 capability_->Connect(properties, &error, callback);
577 EXPECT_TRUE(error.IsSuccess());
578 EXPECT_CALL(*this, TestCallback(IsFailure()));
579 EXPECT_CALL(*service_, ClearLastGoodApn());
580 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
581
582 // Test connect success
583 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
584 .WillOnce(SaveArg<2>(&connect_callback_));
585 capability_->Connect(properties, &error, callback);
586 EXPECT_TRUE(error.IsSuccess());
587 EXPECT_CALL(*this, TestCallback(IsSuccess()));
588 connect_callback_.Run(bearer, Error(Error::kSuccess));
589}
590
591// Validates Connect iterates over APNs
592TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
593 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
594 SetSimpleProxy();
595 Error error;
596 DBusPropertiesMap properties;
597 capability_->apn_try_list_.clear();
598 ResultCallback callback =
599 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
600 DBus::Path bearer("/bearer0");
601
602 const char apn_name_foo[] = "foo";
603 const char apn_name_bar[] = "bar";
604 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
605 .WillOnce(SaveArg<2>(&connect_callback_));
606 Stringmap apn1;
607 apn1[flimflam::kApnProperty] = apn_name_foo;
608 capability_->apn_try_list_.push_back(apn1);
609 Stringmap apn2;
610 apn2[flimflam::kApnProperty] = apn_name_bar;
611 capability_->apn_try_list_.push_back(apn2);
612 capability_->FillConnectPropertyMap(&properties);
613 capability_->Connect(properties, &error, callback);
614 EXPECT_TRUE(error.IsSuccess());
615
616 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
617 .WillOnce(SaveArg<2>(&connect_callback_));
618 EXPECT_CALL(*service_, ClearLastGoodApn());
619 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
620
621 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
622 EXPECT_CALL(*this, TestCallback(IsSuccess()));
623 connect_callback_.Run(bearer, Error(Error::kSuccess));
624}
625
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400626// Validates GetTypeString and AccessTechnologyToTechnologyFamily
627TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
628 const int gsm_technologies[] = {
629 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
630 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
631 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
632 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
633 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
634 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
635 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
636 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
637 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
638 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
639 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
640 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
641 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
642 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
643 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
644 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
645 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
646 };
647 for(size_t i = 0; i < arraysize(gsm_technologies); ++i) {
648 capability_->access_technologies_ = gsm_technologies[i];
649 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
650 }
651 const int cdma_technologies[] = {
652 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
653 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
654 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
655 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
656 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
657 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
658 };
659 for(size_t i = 0; i < arraysize(cdma_technologies); ++i) {
660 capability_->access_technologies_ = cdma_technologies[i];
661 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
662 }
663 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
664 ASSERT_EQ(capability_->GetTypeString(), "");
665}
666
Jason Glasgowef965562012-04-10 16:12:35 -0400667} // namespace shill