blob: c2fd2062c32fb71ae66f2c1fa071376163b8d761 [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 Glasgowaf583282012-04-18 15:18:22 -0400291TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
292 // Set up mock modem properties
293 DBusPropertiesMap modem_properties;
294 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
295 writer().append_uint32(kAccessTechnologies);
296 modem_properties[MM_MODEM_PROPERTY_SIM].
297 writer().append_path(kSimPath);
298
299 // Set up mock modem 3gpp properties
300 DBusPropertiesMap modem3gpp_properties;
301 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
302 writer().append_uint32(0);
303 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
304 writer().append_string(kImei);
305
306 // Set up mock modem sim properties
307 DBusPropertiesMap sim_properties;
308
309 // After setup we lose pointers to the proxies, so it is hard to set
310 // expectations.
311 EXPECT_CALL(*properties_proxy_,
312 GetAll(MM_DBUS_INTERFACE_SIM))
313 .WillOnce(Return(sim_properties));
314
315 SetUp();
316
317 EXPECT_EQ("", capability_->imei_);
318 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
319 capability_->access_technologies_);
320 EXPECT_FALSE(capability_->sim_proxy_.get());
321 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
322 modem_properties, vector<string>());
323 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
324 EXPECT_EQ(kSimPath, capability_->sim_path_);
325 EXPECT_TRUE(capability_->sim_proxy_.get());
326
327 // Changing properties on wrong interface will not have an effect
328 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
329 modem3gpp_properties,
330 vector<string>());
331 EXPECT_EQ("", capability_->imei_);
332
333 // Changing properties on the right interface gets reflected in the
334 // capabilities object
335 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
336 modem3gpp_properties,
337 vector<string>());
338 EXPECT_EQ(kImei, capability_->imei_);
339}
340
341TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
342 // Set up mock modem properties
343 DBusPropertiesMap modem_properties;
344 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
345
346 // Set up mock modem sim properties
347 const char kImsi[] = "310100000001";
348 DBusPropertiesMap sim_properties;
349 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
350
351 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
352 .WillOnce(Return(sim_properties));
353
354 // After setup we lose pointers to the proxies, so it is hard to set
355 // expectations.
356 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400357 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400358
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400359 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
360 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
361 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400362 EXPECT_FALSE(capability_->sim_proxy_.get());
363 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
364 modem_properties, vector<string>());
365 EXPECT_EQ(kSimPath, capability_->sim_path_);
366 EXPECT_TRUE(capability_->sim_proxy_.get());
367 EXPECT_EQ(kImsi, capability_->imsi_);
368
369 // Updating the SIM
370 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400371 const char kCountry[] = "us";
372 const char kCode[] = "310160";
373 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400374 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400375 const char kOperatorIdentifier[] = "310240";
376 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400377 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
378 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
379 append_string(kSimIdentifier);
380 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
381 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400382 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
383 new_properties,
384 vector<string>());
385 EXPECT_EQ(kNewImsi, capability_->imsi_);
386 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
387 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400388 EXPECT_EQ("", capability_->spn_);
389 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
390 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
391 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
392 EXPECT_EQ(4, capability_->apn_list_.size());
393
394 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
395 append_string(kOperatorName);
396 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
397 new_properties,
398 vector<string>());
399 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400400 EXPECT_EQ(kOperatorName, capability_->spn_);
401}
402
Gary Morainceba6aa2012-05-03 10:28:26 -0700403MATCHER_P(SizeIs, value, "") {
404 return static_cast<size_t>(value) == arg.size();
405}
406
407// Validates that OnScanReply does not crash with a null callback.
408TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
409 Error error;
410 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
411 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
412 EXPECT_CALL(*device_adaptor_,
413 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
414 SizeIs(0)));
415 Set3gppProxy();
416 capability_->Scan(&error, ResultCallback());
417 EXPECT_TRUE(error.IsSuccess());
418}
419
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400420// Validates that the scanning property is updated
421TEST_F(CellularCapabilityUniversalTest, Scan) {
422 Error error;
423
424 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
425 .WillRepeatedly(SaveArg<1>(&scan_callback_));
426 EXPECT_CALL(*device_adaptor_,
427 EmitBoolChanged(flimflam::kScanningProperty, true));
428 Set3gppProxy();
429 capability_->Scan(&error, ResultCallback());
430 EXPECT_TRUE(capability_->scanning_);
431
432 // Simulate the completion of the scan with 2 networks in the results.
433 EXPECT_CALL(*device_adaptor_,
434 EmitBoolChanged(flimflam::kScanningProperty, false));
435 EXPECT_CALL(*device_adaptor_,
436 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
437 SizeIs(2)));
438 vector<DBusPropertiesMap> results;
439 const char kScanID0[] = "testID0";
440 const char kScanID1[] = "testID1";
441 results.push_back(DBusPropertiesMap());
442 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
443 writer().append_string(kScanID0);
444 results.push_back(DBusPropertiesMap());
445 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
446 writer().append_string(kScanID1);
447 scan_callback_.Run(results, error);
448 EXPECT_FALSE(capability_->scanning_);
449
450 // Simulate the completion of the scan with no networks in the results.
451 EXPECT_CALL(*device_adaptor_,
452 EmitBoolChanged(flimflam::kScanningProperty, true));
453 capability_->Scan(&error, ResultCallback());
454 EXPECT_TRUE(capability_->scanning_);
455 EXPECT_CALL(*device_adaptor_,
456 EmitBoolChanged(flimflam::kScanningProperty, false));
457 EXPECT_CALL(*device_adaptor_,
458 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
459 SizeIs(0)));
460 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
461 EXPECT_FALSE(capability_->scanning_);
462}
463
464// Validates expected property updates when scan fails
465TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
466 Error error;
467
468 // Test immediate error
469 {
470 InSequence seq;
471 EXPECT_CALL(*modem_3gpp_proxy_,
472 Scan(_, _, CellularCapability::kTimeoutScan))
473 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
474 EXPECT_CALL(*modem_3gpp_proxy_,
475 Scan(_, _, CellularCapability::kTimeoutScan))
476 .WillOnce(SaveArg<1>(&scan_callback_));
477 }
478 Set3gppProxy();
479 capability_->Scan(&error, ResultCallback());
480 EXPECT_FALSE(capability_->scanning_);
481 EXPECT_TRUE(error.IsFailure());
482
483 // Initiate a scan
484 error.Populate(Error::kSuccess);
485 EXPECT_CALL(*device_adaptor_,
486 EmitBoolChanged(flimflam::kScanningProperty, true));
487 capability_->Scan(&error, ResultCallback());
488 EXPECT_TRUE(capability_->scanning_);
489 EXPECT_TRUE(error.IsSuccess());
490
491 // Validate that error is returned if Scan is called while already scanning.
492 capability_->Scan(&error, ResultCallback());
493 EXPECT_TRUE(capability_->scanning_);
494 EXPECT_TRUE(error.IsFailure());
495
496 // Validate that signals are emitted even if an error is reported.
497 capability_->found_networks_.clear();
498 capability_->found_networks_.push_back(Stringmap());
499 EXPECT_CALL(*device_adaptor_,
500 EmitBoolChanged(flimflam::kScanningProperty, false));
501 EXPECT_CALL(*device_adaptor_,
502 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
503 SizeIs(0)));
504 vector<DBusPropertiesMap> results;
505 scan_callback_.Run(results, Error(Error::kOperationFailed));
506 EXPECT_FALSE(capability_->scanning_);
507}
508
Jason Glasgow14521872012-05-07 19:12:15 -0400509// Validates expected behavior of Connect function
510TEST_F(CellularCapabilityUniversalTest, Connect) {
511 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
512 SetSimpleProxy();
513 Error error;
514 DBusPropertiesMap properties;
515 capability_->apn_try_list_.clear();
516 ResultCallback callback =
517 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
518 DBus::Path bearer("/foo");
519
520 // Test connect failures
521 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
522 .WillOnce(SaveArg<2>(&connect_callback_));
523 capability_->Connect(properties, &error, callback);
524 EXPECT_TRUE(error.IsSuccess());
525 EXPECT_CALL(*this, TestCallback(IsFailure()));
526 EXPECT_CALL(*service_, ClearLastGoodApn());
527 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
528
529 // Test connect success
530 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
531 .WillOnce(SaveArg<2>(&connect_callback_));
532 capability_->Connect(properties, &error, callback);
533 EXPECT_TRUE(error.IsSuccess());
534 EXPECT_CALL(*this, TestCallback(IsSuccess()));
535 connect_callback_.Run(bearer, Error(Error::kSuccess));
536}
537
538// Validates Connect iterates over APNs
539TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
540 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
541 SetSimpleProxy();
542 Error error;
543 DBusPropertiesMap properties;
544 capability_->apn_try_list_.clear();
545 ResultCallback callback =
546 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
547 DBus::Path bearer("/bearer0");
548
549 const char apn_name_foo[] = "foo";
550 const char apn_name_bar[] = "bar";
551 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
552 .WillOnce(SaveArg<2>(&connect_callback_));
553 Stringmap apn1;
554 apn1[flimflam::kApnProperty] = apn_name_foo;
555 capability_->apn_try_list_.push_back(apn1);
556 Stringmap apn2;
557 apn2[flimflam::kApnProperty] = apn_name_bar;
558 capability_->apn_try_list_.push_back(apn2);
559 capability_->FillConnectPropertyMap(&properties);
560 capability_->Connect(properties, &error, callback);
561 EXPECT_TRUE(error.IsSuccess());
562
563 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
564 .WillOnce(SaveArg<2>(&connect_callback_));
565 EXPECT_CALL(*service_, ClearLastGoodApn());
566 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
567
568 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
569 EXPECT_CALL(*this, TestCallback(IsSuccess()));
570 connect_callback_.Run(bearer, Error(Error::kSuccess));
571}
572
Jason Glasgowef965562012-04-10 16:12:35 -0400573} // namespace shill