1 // 2 // Copyright (C) 2013 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/cellular/cellular_capability_universal.h" 18 19 #include <string> 20 #include <tuple> 21 #include <vector> 22 23 #include <base/bind.h> 24 #include <base/strings/string_util.h> 25 #include <base/strings/stringprintf.h> 26 #if defined(__ANDROID__) 27 #include <dbus/service_constants.h> 28 #else 29 #include <chromeos/dbus/service_constants.h> 30 #endif // __ANDROID__ 31 #include <ModemManager/ModemManager.h> 32 33 #include "shill/cellular/cellular.h" 34 #include "shill/cellular/cellular_bearer.h" 35 #include "shill/cellular/cellular_service.h" 36 #include "shill/cellular/mock_cellular.h" 37 #include "shill/cellular/mock_cellular_service.h" 38 #include "shill/cellular/mock_mm1_modem_modem3gpp_proxy.h" 39 #include "shill/cellular/mock_mm1_modem_modemcdma_proxy.h" 40 #include "shill/cellular/mock_mm1_modem_proxy.h" 41 #include "shill/cellular/mock_mm1_modem_simple_proxy.h" 42 #include "shill/cellular/mock_mm1_sim_proxy.h" 43 #include "shill/cellular/mock_mobile_operator_info.h" 44 #include "shill/cellular/mock_modem_info.h" 45 #include "shill/error.h" 46 #include "shill/mock_adaptors.h" 47 #include "shill/mock_control.h" 48 #include "shill/mock_dbus_properties_proxy.h" 49 #include "shill/mock_event_dispatcher.h" 50 #include "shill/mock_pending_activation_store.h" 51 #include "shill/mock_profile.h" 52 #include "shill/net/mock_rtnl_handler.h" 53 #include "shill/test_event_dispatcher.h" 54 #include "shill/testing.h" 55 56 using base::Bind; 57 using base::StringPrintf; 58 using base::Unretained; 59 using std::string; 60 using std::unique_ptr; 61 using std::vector; 62 using testing::AnyNumber; 63 using testing::InSequence; 64 using testing::Invoke; 65 using testing::InvokeWithoutArgs; 66 using testing::Mock; 67 using testing::NiceMock; 68 using testing::Return; 69 using testing::ReturnRef; 70 using testing::SaveArg; 71 using testing::_; 72 73 namespace shill { 74 75 MATCHER_P(HasApn, expected_apn, "") { 76 return arg.ContainsString(CellularCapabilityUniversal::kConnectApn) && 77 expected_apn == arg.GetString(CellularCapabilityUniversal::kConnectApn); 78 } 79 80 class CellularCapabilityUniversalTest : public testing::TestWithParam<string> { 81 public: 82 explicit CellularCapabilityUniversalTest(EventDispatcher* dispatcher) 83 : dispatcher_(dispatcher), 84 control_interface_(this), 85 modem_info_(&control_interface_, dispatcher, nullptr, nullptr), 86 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()), 87 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()), 88 modem_proxy_(new mm1::MockModemProxy()), 89 modem_simple_proxy_(new mm1::MockModemSimpleProxy()), 90 sim_proxy_(new mm1::MockSimProxy()), 91 properties_proxy_(new MockDBusPropertiesProxy()), 92 capability_(nullptr), 93 device_adaptor_(nullptr), 94 cellular_(new Cellular(&modem_info_, 95 "", 96 "00:01:02:03:04:05", 97 0, 98 Cellular::kTypeUniversal, 99 "", 100 "")), 101 service_(new MockCellularService(&modem_info_, cellular_)), 102 mock_home_provider_info_(nullptr), 103 mock_serving_operator_info_(nullptr) { 104 modem_info_.metrics()->RegisterDevice(cellular_->interface_index(), 105 Technology::kCellular); 106 } 107 108 virtual ~CellularCapabilityUniversalTest() { 109 cellular_->service_ = nullptr; 110 capability_ = nullptr; 111 device_adaptor_ = nullptr; 112 } 113 114 virtual void SetUp() { 115 capability_ = static_cast<CellularCapabilityUniversal*>( 116 cellular_->capability_.get()); 117 device_adaptor_ = 118 static_cast<DeviceMockAdaptor*>(cellular_->adaptor()); 119 cellular_->service_ = service_; 120 121 // kStateUnknown leads to minimal extra work in maintaining 122 // activation state. 123 ON_CALL(*modem_info_.mock_pending_activation_store(), 124 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 125 .WillByDefault(Return(PendingActivationStore::kStateUnknown)); 126 127 SetMockMobileOperatorInfoObjects(); 128 } 129 130 virtual void TearDown() { 131 capability_->control_interface_ = nullptr; 132 } 133 134 void CreateService() { 135 // The following constants are never directly accessed by the tests. 136 const char kStorageIdentifier[] = "default_test_storage_id"; 137 const char kFriendlyServiceName[] = "default_test_service_name"; 138 const char kOperatorCode[] = "10010"; 139 const char kOperatorName[] = "default_test_operator_name"; 140 const char kOperatorCountry[] = "us"; 141 142 // Simulate all the side-effects of Cellular::CreateService 143 auto service = new CellularService(&modem_info_, cellular_); 144 service->SetStorageIdentifier(kStorageIdentifier); 145 service->SetFriendlyName(kFriendlyServiceName); 146 147 Stringmap serving_operator; 148 serving_operator[kOperatorCodeKey] = kOperatorCode; 149 serving_operator[kOperatorNameKey] = kOperatorName; 150 serving_operator[kOperatorCountryKey] = kOperatorCountry; 151 service->set_serving_operator(serving_operator); 152 cellular_->set_home_provider(serving_operator); 153 cellular_->service_ = service; 154 } 155 156 void ClearService() { 157 cellular_->service_ = nullptr; 158 } 159 160 void ExpectModemAndModem3gppProperties() { 161 // Set up mock modem properties. 162 KeyValueStore modem_properties; 163 string operator_name = "TestOperator"; 164 string operator_code = "001400"; 165 166 modem_properties.SetUint(MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES, 167 kAccessTechnologies); 168 std::tuple<uint32_t, bool> signal_signal { 90, true }; 169 modem_properties.Set(MM_MODEM_PROPERTY_SIGNALQUALITY, 170 brillo::Any(signal_signal)); 171 172 // Set up mock modem 3gpp properties. 173 KeyValueStore modem3gpp_properties; 174 modem3gpp_properties.SetUint( 175 MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS, 0); 176 modem3gpp_properties.SetString(MM_MODEM_MODEM3GPP_PROPERTY_IMEI, kImei); 177 178 EXPECT_CALL(*properties_proxy_, 179 GetAll(MM_DBUS_INTERFACE_MODEM)) 180 .WillOnce(Return(modem_properties)); 181 EXPECT_CALL(*properties_proxy_, 182 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP)) 183 .WillOnce(Return(modem3gpp_properties)); 184 } 185 186 void InvokeEnable(bool enable, Error* error, 187 const ResultCallback& callback, int timeout) { 188 callback.Run(Error()); 189 } 190 void InvokeEnableFail(bool enable, Error* error, 191 const ResultCallback& callback, int timeout) { 192 callback.Run(Error(Error::kOperationFailed)); 193 } 194 void InvokeEnableInWrongState(bool enable, Error* error, 195 const ResultCallback& callback, int timeout) { 196 callback.Run(Error(Error::kWrongState)); 197 } 198 void InvokeRegister(const string& operator_id, Error* error, 199 const ResultCallback& callback, int timeout) { 200 callback.Run(Error()); 201 } 202 void InvokeSetPowerState(const uint32_t& power_state, 203 Error* error, 204 const ResultCallback& callback, 205 int timeout) { 206 callback.Run(Error()); 207 } 208 void Set3gppProxy() { 209 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release()); 210 } 211 212 void SetSimpleProxy() { 213 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release()); 214 } 215 216 void SetMockMobileOperatorInfoObjects() { 217 CHECK(!mock_home_provider_info_); 218 CHECK(!mock_serving_operator_info_); 219 mock_home_provider_info_ = 220 new MockMobileOperatorInfo(dispatcher_, "HomeProvider"); 221 mock_serving_operator_info_ = 222 new MockMobileOperatorInfo(dispatcher_, "ServingOperator"); 223 cellular_->set_home_provider_info(mock_home_provider_info_); 224 cellular_->set_serving_operator_info(mock_serving_operator_info_); 225 } 226 227 void ReleaseCapabilityProxies() { 228 capability_->ReleaseProxies(); 229 } 230 231 void SetRegistrationDroppedUpdateTimeout(int64_t timeout_milliseconds) { 232 capability_->registration_dropped_update_timeout_milliseconds_ = 233 timeout_milliseconds; 234 } 235 236 MOCK_METHOD1(TestCallback, void(const Error& error)); 237 238 MOCK_METHOD0(DummyCallback, void(void)); 239 240 void SetMockRegistrationDroppedUpdateCallback() { 241 capability_->registration_dropped_update_callback_.Reset( 242 Bind(&CellularCapabilityUniversalTest::DummyCallback, 243 Unretained(this))); 244 } 245 246 protected: 247 static const char kActiveBearerPathPrefix[]; 248 static const char kImei[]; 249 static const char kInactiveBearerPathPrefix[]; 250 static const char kSimPath[]; 251 static const uint32_t kAccessTechnologies; 252 static const char kTestMobileProviderDBPath[]; 253 254 class TestControl : public MockControl { 255 public: 256 explicit TestControl(CellularCapabilityUniversalTest* test) 257 : test_(test) { 258 active_bearer_properties_.SetBool(MM_BEARER_PROPERTY_CONNECTED, true); 259 active_bearer_properties_.SetString(MM_BEARER_PROPERTY_INTERFACE, 260 "/dev/fake"); 261 262 KeyValueStore ip4config; 263 ip4config.SetUint("method", MM_BEARER_IP_METHOD_DHCP); 264 active_bearer_properties_.SetKeyValueStore( 265 MM_BEARER_PROPERTY_IP4CONFIG, ip4config); 266 267 inactive_bearer_properties_.SetBool(MM_BEARER_PROPERTY_CONNECTED, false); 268 } 269 270 KeyValueStore* mutable_active_bearer_properties() { 271 return &active_bearer_properties_; 272 } 273 274 KeyValueStore* mutable_inactive_bearer_properties() { 275 return &inactive_bearer_properties_; 276 } 277 278 virtual mm1::ModemModem3gppProxyInterface* CreateMM1ModemModem3gppProxy( 279 const std::string& /*path*/, 280 const std::string& /*service*/) { 281 return test_->modem_3gpp_proxy_.release(); 282 } 283 284 virtual mm1::ModemModemCdmaProxyInterface* CreateMM1ModemModemCdmaProxy( 285 const std::string& /*path*/, 286 const std::string& /*service*/) { 287 return test_->modem_cdma_proxy_.release(); 288 } 289 290 virtual mm1::ModemProxyInterface* CreateMM1ModemProxy( 291 const std::string& /*path*/, 292 const std::string& /*service*/) { 293 return test_->modem_proxy_.release(); 294 } 295 296 virtual mm1::ModemSimpleProxyInterface* CreateMM1ModemSimpleProxy( 297 const std::string& /*path*/, 298 const std::string& /*service*/) { 299 return test_->modem_simple_proxy_.release(); 300 } 301 302 virtual mm1::SimProxyInterface* CreateSimProxy( 303 const std::string& /*path*/, 304 const std::string& /*service*/) { 305 mm1::MockSimProxy* sim_proxy = test_->sim_proxy_.release(); 306 test_->sim_proxy_.reset(new mm1::MockSimProxy()); 307 return sim_proxy; 308 } 309 310 virtual DBusPropertiesProxyInterface* CreateDBusPropertiesProxy( 311 const std::string& path, 312 const std::string& /*service*/) { 313 MockDBusPropertiesProxy* properties_proxy = 314 test_->properties_proxy_.release(); 315 if (path.find(kActiveBearerPathPrefix) != std::string::npos) { 316 EXPECT_CALL(*properties_proxy, GetAll(MM_DBUS_INTERFACE_BEARER)) 317 .Times(AnyNumber()) 318 .WillRepeatedly(Return(active_bearer_properties_)); 319 } else { 320 EXPECT_CALL(*properties_proxy, GetAll(MM_DBUS_INTERFACE_BEARER)) 321 .Times(AnyNumber()) 322 .WillRepeatedly(Return(inactive_bearer_properties_)); 323 } 324 test_->properties_proxy_.reset(new MockDBusPropertiesProxy()); 325 return properties_proxy; 326 } 327 328 private: 329 CellularCapabilityUniversalTest* test_; 330 KeyValueStore active_bearer_properties_; 331 KeyValueStore inactive_bearer_properties_; 332 }; 333 334 EventDispatcher* dispatcher_; 335 TestControl control_interface_; 336 MockModemInfo modem_info_; 337 unique_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_; 338 unique_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_; 339 unique_ptr<mm1::MockModemProxy> modem_proxy_; 340 unique_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_; 341 unique_ptr<mm1::MockSimProxy> sim_proxy_; 342 unique_ptr<MockDBusPropertiesProxy> properties_proxy_; 343 CellularCapabilityUniversal* capability_; // Owned by |cellular_|. 344 DeviceMockAdaptor* device_adaptor_; // Owned by |cellular_|. 345 CellularRefPtr cellular_; 346 MockCellularService* service_; // owned by cellular_ 347 // saved for testing connect operations. 348 RpcIdentifierCallback connect_callback_; 349 350 // Set when required and passed to |cellular_|. Owned by |cellular_|. 351 MockMobileOperatorInfo* mock_home_provider_info_; 352 MockMobileOperatorInfo* mock_serving_operator_info_; 353 }; 354 355 // Most of our tests involve using a real EventDispatcher object. 356 class CellularCapabilityUniversalMainTest 357 : public CellularCapabilityUniversalTest { 358 public: 359 CellularCapabilityUniversalMainTest() : 360 CellularCapabilityUniversalTest(&dispatcher_) {} 361 362 protected: 363 EventDispatcherForTest dispatcher_; 364 }; 365 366 // Tests that involve timers will (or may) use a mock of the event dispatcher 367 // instead of a real one. 368 class CellularCapabilityUniversalTimerTest 369 : public CellularCapabilityUniversalTest { 370 public: 371 CellularCapabilityUniversalTimerTest() 372 : CellularCapabilityUniversalTest(&mock_dispatcher_) {} 373 374 protected: 375 ::testing::StrictMock<MockEventDispatcher> mock_dispatcher_; 376 }; 377 378 const char CellularCapabilityUniversalTest::kActiveBearerPathPrefix[] = 379 "/bearer/active"; 380 const char CellularCapabilityUniversalTest::kImei[] = "999911110000"; 381 const char CellularCapabilityUniversalTest::kInactiveBearerPathPrefix[] = 382 "/bearer/inactive"; 383 const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim"; 384 const uint32_t CellularCapabilityUniversalTest::kAccessTechnologies = 385 MM_MODEM_ACCESS_TECHNOLOGY_LTE | 386 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS; 387 const char CellularCapabilityUniversalTest::kTestMobileProviderDBPath[] = 388 "provider_db_unittest.bfd"; 389 390 TEST_F(CellularCapabilityUniversalMainTest, StartModem) { 391 ExpectModemAndModem3gppProperties(); 392 393 EXPECT_CALL(*modem_proxy_, 394 Enable(true, _, _, CellularCapability::kTimeoutEnable)) 395 .WillOnce(Invoke( 396 this, &CellularCapabilityUniversalTest::InvokeEnable)); 397 398 Error error; 399 EXPECT_CALL(*this, TestCallback(IsSuccess())); 400 ResultCallback callback = 401 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 402 capability_->StartModem(&error, callback); 403 404 EXPECT_TRUE(error.IsOngoing()); 405 EXPECT_EQ(kImei, cellular_->imei()); 406 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_); 407 } 408 409 TEST_F(CellularCapabilityUniversalMainTest, StartModemFailure) { 410 EXPECT_CALL(*modem_proxy_, 411 Enable(true, _, _, CellularCapability::kTimeoutEnable)) 412 .WillOnce(Invoke( 413 this, &CellularCapabilityUniversalTest::InvokeEnableFail)); 414 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_MODEM)).Times(0); 415 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP)) 416 .Times(0); 417 418 Error error; 419 EXPECT_CALL(*this, TestCallback(IsFailure())); 420 ResultCallback callback = 421 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 422 capability_->StartModem(&error, callback); 423 EXPECT_TRUE(error.IsOngoing()); 424 } 425 426 TEST_F(CellularCapabilityUniversalMainTest, StartModemInWrongState) { 427 ExpectModemAndModem3gppProperties(); 428 429 EXPECT_CALL(*modem_proxy_, 430 Enable(true, _, _, CellularCapability::kTimeoutEnable)) 431 .WillOnce(Invoke( 432 this, &CellularCapabilityUniversalTest::InvokeEnableInWrongState)) 433 .WillOnce(Invoke( 434 this, &CellularCapabilityUniversalTest::InvokeEnable)); 435 436 Error error; 437 EXPECT_CALL(*this, TestCallback(_)).Times(0); 438 ResultCallback callback = 439 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 440 capability_->StartModem(&error, callback); 441 EXPECT_TRUE(error.IsOngoing()); 442 443 // Verify that the modem has not been enabled. 444 EXPECT_TRUE(cellular_->imei().empty()); 445 EXPECT_EQ(0, capability_->access_technologies_); 446 Mock::VerifyAndClearExpectations(this); 447 448 // Change the state to kModemStateEnabling and verify that it still has not 449 // been enabled. 450 capability_->OnModemStateChanged(Cellular::kModemStateEnabling); 451 EXPECT_TRUE(cellular_->imei().empty()); 452 EXPECT_EQ(0, capability_->access_technologies_); 453 Mock::VerifyAndClearExpectations(this); 454 455 // Change the state to kModemStateDisabling and verify that it still has not 456 // been enabled. 457 EXPECT_CALL(*this, TestCallback(_)).Times(0); 458 capability_->OnModemStateChanged(Cellular::kModemStateDisabling); 459 EXPECT_TRUE(cellular_->imei().empty()); 460 EXPECT_EQ(0, capability_->access_technologies_); 461 Mock::VerifyAndClearExpectations(this); 462 463 // Change the state of the modem to disabled and verify that it gets enabled. 464 EXPECT_CALL(*this, TestCallback(IsSuccess())); 465 capability_->OnModemStateChanged(Cellular::kModemStateDisabled); 466 EXPECT_EQ(kImei, cellular_->imei()); 467 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_); 468 } 469 470 TEST_F(CellularCapabilityUniversalMainTest, 471 StartModemWithDeferredEnableFailure) { 472 EXPECT_CALL(*modem_proxy_, 473 Enable(true, _, _, CellularCapability::kTimeoutEnable)) 474 .Times(2) 475 .WillRepeatedly(Invoke( 476 this, &CellularCapabilityUniversalTest::InvokeEnableInWrongState)); 477 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_MODEM)).Times(0); 478 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP)) 479 .Times(0); 480 481 Error error; 482 EXPECT_CALL(*this, TestCallback(_)).Times(0); 483 ResultCallback callback = 484 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 485 capability_->StartModem(&error, callback); 486 EXPECT_TRUE(error.IsOngoing()); 487 Mock::VerifyAndClearExpectations(this); 488 489 // Change the state of the modem to disabled but fail the deferred enable 490 // operation with the WrongState error in order to verify that the deferred 491 // enable operation does not trigger another deferred enable operation. 492 EXPECT_CALL(*this, TestCallback(IsFailure())); 493 capability_->OnModemStateChanged(Cellular::kModemStateDisabled); 494 } 495 496 TEST_F(CellularCapabilityUniversalMainTest, StopModem) { 497 // Save pointers to proxies before they are lost by the call to InitProxies 498 mm1::MockModemProxy* modem_proxy = modem_proxy_.get(); 499 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_)); 500 capability_->InitProxies(); 501 502 Error error; 503 ResultCallback callback = 504 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 505 capability_->StopModem(&error, callback); 506 EXPECT_TRUE(error.IsSuccess()); 507 508 ResultCallback disable_callback; 509 EXPECT_CALL(*modem_proxy, 510 Enable(false, _, _, CellularCapability::kTimeoutEnable)) 511 .WillOnce(SaveArg<2>(&disable_callback)); 512 dispatcher_.DispatchPendingEvents(); 513 514 ResultCallback set_power_state_callback; 515 EXPECT_CALL( 516 *modem_proxy, 517 SetPowerState( 518 MM_MODEM_POWER_STATE_LOW, _, _, 519 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds)) 520 .WillOnce(SaveArg<2>(&set_power_state_callback)); 521 disable_callback.Run(Error(Error::kSuccess)); 522 523 EXPECT_CALL(*this, TestCallback(IsSuccess())); 524 set_power_state_callback.Run(Error(Error::kSuccess)); 525 Mock::VerifyAndClearExpectations(this); 526 527 // TestCallback should get called with success even if the power state 528 // callback gets called with an error 529 EXPECT_CALL(*this, TestCallback(IsSuccess())); 530 set_power_state_callback.Run(Error(Error::kOperationFailed)); 531 } 532 533 TEST_F(CellularCapabilityUniversalMainTest, StopModemAltair) { 534 // Save pointers to proxies before they are lost by the call to InitProxies 535 mm1::MockModemProxy* modem_proxy = modem_proxy_.get(); 536 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_)); 537 capability_->InitProxies(); 538 539 const char kBearerDBusPath[] = "/bearer/dbus/path"; 540 capability_->set_active_bearer( 541 new CellularBearer(&control_interface_, 542 kBearerDBusPath, 543 cellular_->dbus_service())); // Passes ownership. 544 545 cellular_->set_mm_plugin(CellularCapabilityUniversal::kAltairLTEMMPlugin); 546 547 Error error; 548 ResultCallback callback = 549 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 550 capability_->StopModem(&error, callback); 551 EXPECT_TRUE(error.IsSuccess()); 552 553 ResultCallback delete_bearer_callback; 554 EXPECT_CALL(*modem_proxy, 555 DeleteBearer(kBearerDBusPath, _, _, 556 CellularCapability::kTimeoutDefault)) 557 .WillOnce(SaveArg<2>(&delete_bearer_callback)); 558 dispatcher_.DispatchPendingEvents(); 559 560 ResultCallback disable_callback; 561 EXPECT_CALL(*modem_proxy, 562 Enable(false, _, _, CellularCapability::kTimeoutEnable)) 563 .WillOnce(SaveArg<2>(&disable_callback)); 564 delete_bearer_callback.Run(Error(Error::kSuccess)); 565 566 ResultCallback set_power_state_callback; 567 EXPECT_CALL( 568 *modem_proxy, 569 SetPowerState( 570 MM_MODEM_POWER_STATE_LOW, _, _, 571 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds)) 572 .WillOnce(SaveArg<2>(&set_power_state_callback)); 573 disable_callback.Run(Error(Error::kSuccess)); 574 575 EXPECT_CALL(*this, TestCallback(IsSuccess())); 576 set_power_state_callback.Run(Error(Error::kSuccess)); 577 } 578 579 TEST_F(CellularCapabilityUniversalMainTest, 580 StopModemAltairDeleteBearerFailure) { 581 // Save pointers to proxies before they are lost by the call to InitProxies 582 mm1::MockModemProxy* modem_proxy = modem_proxy_.get(); 583 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_)); 584 capability_->InitProxies(); 585 586 const char kBearerDBusPath[] = "/bearer/dbus/path"; 587 capability_->set_active_bearer( 588 new CellularBearer(&control_interface_, 589 kBearerDBusPath, 590 cellular_->dbus_service())); // Passes ownership. 591 592 cellular_->set_mm_plugin(CellularCapabilityUniversal::kAltairLTEMMPlugin); 593 594 Error error; 595 ResultCallback callback = 596 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 597 capability_->StopModem(&error, callback); 598 EXPECT_TRUE(error.IsSuccess()); 599 600 ResultCallback delete_bearer_callback; 601 EXPECT_CALL(*modem_proxy, 602 DeleteBearer(kBearerDBusPath, _, _, 603 CellularCapability::kTimeoutDefault)) 604 .WillOnce(SaveArg<2>(&delete_bearer_callback)); 605 dispatcher_.DispatchPendingEvents(); 606 607 ResultCallback disable_callback; 608 EXPECT_CALL(*modem_proxy, 609 Enable(false, _, _, CellularCapability::kTimeoutEnable)) 610 .WillOnce(SaveArg<2>(&disable_callback)); 611 delete_bearer_callback.Run(Error(Error::kOperationFailed)); 612 613 ResultCallback set_power_state_callback; 614 EXPECT_CALL( 615 *modem_proxy, 616 SetPowerState( 617 MM_MODEM_POWER_STATE_LOW, _, _, 618 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds)) 619 .WillOnce(SaveArg<2>(&set_power_state_callback)); 620 disable_callback.Run(Error(Error::kSuccess)); 621 622 EXPECT_CALL(*this, TestCallback(IsSuccess())); 623 set_power_state_callback.Run(Error(Error::kSuccess)); 624 } 625 626 TEST_F(CellularCapabilityUniversalMainTest, StopModemAltairNotConnected) { 627 // Save pointers to proxies before they are lost by the call to InitProxies 628 mm1::MockModemProxy* modem_proxy = modem_proxy_.get(); 629 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_)); 630 capability_->InitProxies(); 631 capability_->set_active_bearer(nullptr); 632 cellular_->set_mm_plugin(CellularCapabilityUniversal::kAltairLTEMMPlugin); 633 634 Error error; 635 ResultCallback callback = 636 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 637 capability_->StopModem(&error, callback); 638 EXPECT_TRUE(error.IsSuccess()); 639 640 ResultCallback disable_callback; 641 EXPECT_CALL(*modem_proxy, 642 Enable(false, _, _, CellularCapability::kTimeoutEnable)) 643 .WillOnce(SaveArg<2>(&disable_callback)); 644 dispatcher_.DispatchPendingEvents(); 645 646 ResultCallback set_power_state_callback; 647 EXPECT_CALL( 648 *modem_proxy, 649 SetPowerState( 650 MM_MODEM_POWER_STATE_LOW, _, _, 651 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds)) 652 .WillOnce(SaveArg<2>(&set_power_state_callback)); 653 disable_callback.Run(Error(Error::kSuccess)); 654 655 EXPECT_CALL(*this, TestCallback(IsSuccess())); 656 set_power_state_callback.Run(Error(Error::kSuccess)); 657 Mock::VerifyAndClearExpectations(this); 658 659 // TestCallback should get called with success even if the power state 660 // callback gets called with an error 661 EXPECT_CALL(*this, TestCallback(IsSuccess())); 662 set_power_state_callback.Run(Error(Error::kOperationFailed)); 663 } 664 665 TEST_F(CellularCapabilityUniversalMainTest, TerminationAction) { 666 ExpectModemAndModem3gppProperties(); 667 668 { 669 InSequence seq; 670 671 EXPECT_CALL(*modem_proxy_, 672 Enable(true, _, _, CellularCapability::kTimeoutEnable)) 673 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable)); 674 EXPECT_CALL(*modem_proxy_, 675 Enable(false, _, _, CellularCapability::kTimeoutEnable)) 676 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable)); 677 EXPECT_CALL( 678 *modem_proxy_, 679 SetPowerState( 680 MM_MODEM_POWER_STATE_LOW, _, _, 681 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds)) 682 .WillOnce(Invoke( 683 this, &CellularCapabilityUniversalTest::InvokeSetPowerState)); 684 } 685 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2); 686 687 EXPECT_EQ(Cellular::kStateDisabled, cellular_->state()); 688 EXPECT_EQ(Cellular::kModemStateUnknown, cellular_->modem_state()); 689 EXPECT_TRUE(modem_info_.manager()->termination_actions_.IsEmpty()); 690 691 // Here we mimic the modem state change from ModemManager. When the modem is 692 // enabled, a termination action should be added. 693 cellular_->OnModemStateChanged(Cellular::kModemStateEnabled); 694 dispatcher_.DispatchPendingEvents(); 695 EXPECT_EQ(Cellular::kStateEnabled, cellular_->state()); 696 EXPECT_EQ(Cellular::kModemStateEnabled, cellular_->modem_state()); 697 EXPECT_FALSE(modem_info_.manager()->termination_actions_.IsEmpty()); 698 699 // Running the termination action should disable the modem. 700 modem_info_.manager()->RunTerminationActions(Bind( 701 &CellularCapabilityUniversalMainTest::TestCallback, Unretained(this))); 702 dispatcher_.DispatchPendingEvents(); 703 // Here we mimic the modem state change from ModemManager. When the modem is 704 // disabled, the termination action should be removed. 705 cellular_->OnModemStateChanged(Cellular::kModemStateDisabled); 706 dispatcher_.DispatchPendingEvents(); 707 EXPECT_EQ(Cellular::kStateDisabled, cellular_->state()); 708 EXPECT_EQ(Cellular::kModemStateDisabled, cellular_->modem_state()); 709 EXPECT_TRUE(modem_info_.manager()->termination_actions_.IsEmpty()); 710 711 // No termination action should be called here. 712 modem_info_.manager()->RunTerminationActions(Bind( 713 &CellularCapabilityUniversalMainTest::TestCallback, Unretained(this))); 714 dispatcher_.DispatchPendingEvents(); 715 } 716 717 TEST_F(CellularCapabilityUniversalMainTest, 718 TerminationActionRemovedByStopModem) { 719 ExpectModemAndModem3gppProperties(); 720 721 { 722 InSequence seq; 723 724 EXPECT_CALL(*modem_proxy_, 725 Enable(true, _, _, CellularCapability::kTimeoutEnable)) 726 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable)); 727 EXPECT_CALL(*modem_proxy_, 728 Enable(false, _, _, CellularCapability::kTimeoutEnable)) 729 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable)); 730 EXPECT_CALL( 731 *modem_proxy_, 732 SetPowerState( 733 MM_MODEM_POWER_STATE_LOW, _, _, 734 CellularCapabilityUniversal::kSetPowerStateTimeoutMilliseconds)) 735 .WillOnce(Invoke( 736 this, &CellularCapabilityUniversalTest::InvokeSetPowerState)); 737 } 738 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(1); 739 740 EXPECT_EQ(Cellular::kStateDisabled, cellular_->state()); 741 EXPECT_EQ(Cellular::kModemStateUnknown, cellular_->modem_state()); 742 EXPECT_TRUE(modem_info_.manager()->termination_actions_.IsEmpty()); 743 744 // Here we mimic the modem state change from ModemManager. When the modem is 745 // enabled, a termination action should be added. 746 cellular_->OnModemStateChanged(Cellular::kModemStateEnabled); 747 dispatcher_.DispatchPendingEvents(); 748 EXPECT_EQ(Cellular::kStateEnabled, cellular_->state()); 749 EXPECT_EQ(Cellular::kModemStateEnabled, cellular_->modem_state()); 750 EXPECT_FALSE(modem_info_.manager()->termination_actions_.IsEmpty()); 751 752 // Verify that the termination action is removed when the modem is disabled 753 // not due to a suspend request. 754 cellular_->SetEnabled(false); 755 dispatcher_.DispatchPendingEvents(); 756 EXPECT_EQ(Cellular::kStateDisabled, cellular_->state()); 757 EXPECT_TRUE(modem_info_.manager()->termination_actions_.IsEmpty()); 758 759 // No termination action should be called here. 760 modem_info_.manager()->RunTerminationActions(Bind( 761 &CellularCapabilityUniversalMainTest::TestCallback, Unretained(this))); 762 dispatcher_.DispatchPendingEvents(); 763 } 764 765 TEST_F(CellularCapabilityUniversalMainTest, DisconnectModemNoBearer) { 766 Error error; 767 ResultCallback disconnect_callback; 768 EXPECT_CALL(*modem_simple_proxy_, 769 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect)) 770 .Times(0); 771 capability_->Disconnect(&error, disconnect_callback); 772 } 773 774 TEST_F(CellularCapabilityUniversalMainTest, DisconnectNoProxy) { 775 Error error; 776 ResultCallback disconnect_callback; 777 EXPECT_CALL(*modem_simple_proxy_, 778 Disconnect(_, _, _, CellularCapability::kTimeoutDisconnect)) 779 .Times(0); 780 ReleaseCapabilityProxies(); 781 capability_->Disconnect(&error, disconnect_callback); 782 } 783 784 TEST_F(CellularCapabilityUniversalMainTest, SimLockStatusChanged) { 785 // Set up mock SIM properties 786 const char kImsi[] = "310100000001"; 787 const char kSimIdentifier[] = "9999888"; 788 const char kOperatorIdentifier[] = "310240"; 789 const char kOperatorName[] = "Custom SPN"; 790 KeyValueStore sim_properties; 791 sim_properties.SetString(MM_SIM_PROPERTY_IMSI, kImsi); 792 sim_properties.SetString(MM_SIM_PROPERTY_SIMIDENTIFIER, kSimIdentifier); 793 sim_properties.SetString(MM_SIM_PROPERTY_OPERATORIDENTIFIER, 794 kOperatorIdentifier); 795 sim_properties.SetString(MM_SIM_PROPERTY_OPERATORNAME, kOperatorName); 796 797 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM)) 798 .WillOnce(Return(sim_properties)); 799 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 800 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 801 .Times(1); 802 803 EXPECT_FALSE(cellular_->sim_present()); 804 EXPECT_EQ(nullptr, capability_->sim_proxy_);; 805 806 capability_->OnSimPathChanged(kSimPath); 807 EXPECT_TRUE(cellular_->sim_present()); 808 EXPECT_NE(nullptr, capability_->sim_proxy_);; 809 EXPECT_EQ(kSimPath, capability_->sim_path_); 810 811 cellular_->set_imsi(""); 812 cellular_->set_sim_identifier(""); 813 capability_->spn_ = ""; 814 815 // SIM is locked. 816 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PIN; 817 capability_->OnSimLockStatusChanged(); 818 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 819 820 EXPECT_EQ("", cellular_->imsi()); 821 EXPECT_EQ("", cellular_->sim_identifier()); 822 EXPECT_EQ("", capability_->spn_); 823 824 // SIM is unlocked. 825 properties_proxy_.reset(new MockDBusPropertiesProxy()); 826 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM)) 827 .WillOnce(Return(sim_properties)); 828 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 829 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 830 .Times(1); 831 832 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_NONE; 833 capability_->OnSimLockStatusChanged(); 834 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 835 836 EXPECT_EQ(kImsi, cellular_->imsi()); 837 EXPECT_EQ(kSimIdentifier, cellular_->sim_identifier()); 838 EXPECT_EQ(kOperatorName, capability_->spn_); 839 840 // SIM is missing and SIM path is "/". 841 capability_->OnSimPathChanged(CellularCapabilityUniversal::kRootPath); 842 EXPECT_FALSE(cellular_->sim_present()); 843 EXPECT_EQ(nullptr, capability_->sim_proxy_);; 844 EXPECT_EQ(CellularCapabilityUniversal::kRootPath, capability_->sim_path_); 845 846 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 847 GetActivationState(_, _)).Times(0); 848 capability_->OnSimLockStatusChanged(); 849 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 850 851 EXPECT_EQ("", cellular_->imsi()); 852 EXPECT_EQ("", cellular_->sim_identifier()); 853 EXPECT_EQ("", capability_->spn_); 854 855 // SIM is missing and SIM path is empty. 856 capability_->OnSimPathChanged(""); 857 EXPECT_FALSE(cellular_->sim_present()); 858 EXPECT_EQ(nullptr, capability_->sim_proxy_);; 859 EXPECT_EQ("", capability_->sim_path_); 860 861 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 862 GetActivationState(_, _)).Times(0); 863 capability_->OnSimLockStatusChanged(); 864 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 865 866 EXPECT_EQ("", cellular_->imsi()); 867 EXPECT_EQ("", cellular_->sim_identifier()); 868 EXPECT_EQ("", capability_->spn_); 869 } 870 871 TEST_F(CellularCapabilityUniversalMainTest, PropertiesChanged) { 872 // Set up mock modem properties 873 KeyValueStore modem_properties; 874 modem_properties.SetUint(MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES, 875 kAccessTechnologies); 876 modem_properties.SetRpcIdentifier(MM_MODEM_PROPERTY_SIM, kSimPath); 877 878 // Set up mock modem 3gpp properties 879 KeyValueStore modem3gpp_properties; 880 modem3gpp_properties.SetUint(MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS, 881 0); 882 modem3gpp_properties.SetString(MM_MODEM_MODEM3GPP_PROPERTY_IMEI, kImei); 883 884 // Set up mock modem sim properties 885 KeyValueStore sim_properties; 886 887 EXPECT_CALL(*properties_proxy_, 888 GetAll(MM_DBUS_INTERFACE_SIM)) 889 .WillOnce(Return(sim_properties)); 890 891 EXPECT_EQ("", cellular_->imei()); 892 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN, 893 capability_->access_technologies_); 894 EXPECT_FALSE(capability_->sim_proxy_.get()); 895 EXPECT_CALL(*device_adaptor_, EmitStringChanged( 896 kTechnologyFamilyProperty, kTechnologyFamilyGsm)); 897 EXPECT_CALL(*device_adaptor_, EmitStringChanged(kImeiProperty, kImei)); 898 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM, 899 modem_properties, vector<string>()); 900 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_); 901 EXPECT_EQ(kSimPath, capability_->sim_path_); 902 EXPECT_TRUE(capability_->sim_proxy_.get()); 903 904 // Changing properties on wrong interface will not have an effect 905 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM, 906 modem3gpp_properties, 907 vector<string>()); 908 EXPECT_EQ("", cellular_->imei()); 909 910 // Changing properties on the right interface gets reflected in the 911 // capabilities object 912 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP, 913 modem3gpp_properties, 914 vector<string>()); 915 EXPECT_EQ(kImei, cellular_->imei()); 916 Mock::VerifyAndClearExpectations(device_adaptor_); 917 918 // Expect to see changes when the family changes 919 modem_properties.Clear(); 920 modem_properties.SetUint(MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES, 921 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT); 922 EXPECT_CALL(*device_adaptor_, EmitStringChanged( 923 kTechnologyFamilyProperty, kTechnologyFamilyCdma)). 924 Times(1); 925 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM, 926 modem_properties, 927 vector<string>()); 928 Mock::VerifyAndClearExpectations(device_adaptor_); 929 930 // Back to LTE 931 modem_properties.Clear(); 932 modem_properties.SetUint(MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES, 933 MM_MODEM_ACCESS_TECHNOLOGY_LTE); 934 EXPECT_CALL(*device_adaptor_, EmitStringChanged( 935 kTechnologyFamilyProperty, kTechnologyFamilyGsm)). 936 Times(1); 937 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM, 938 modem_properties, 939 vector<string>()); 940 Mock::VerifyAndClearExpectations(device_adaptor_); 941 942 // LTE & CDMA - the device adaptor should not be called! 943 modem_properties.Clear(); 944 modem_properties.SetUint(MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES, 945 MM_MODEM_ACCESS_TECHNOLOGY_LTE | 946 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT); 947 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0); 948 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM, 949 modem_properties, 950 vector<string>()); 951 } 952 953 TEST_F(CellularCapabilityUniversalMainTest, UpdateRegistrationState) { 954 capability_->InitProxies(); 955 956 CreateService(); 957 cellular_->set_imsi("310240123456789"); 958 cellular_->set_modem_state(Cellular::kModemStateConnected); 959 SetRegistrationDroppedUpdateTimeout(0); 960 961 const Stringmap& home_provider_map = cellular_->home_provider(); 962 ASSERT_NE(home_provider_map.end(), home_provider_map.find(kOperatorNameKey)); 963 string home_provider = home_provider_map.find(kOperatorNameKey)->second; 964 string ota_name = cellular_->service_->friendly_name(); 965 966 // Home --> Roaming should be effective immediately. 967 capability_->On3GPPRegistrationChanged( 968 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 969 home_provider, 970 ota_name); 971 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 972 capability_->registration_state_); 973 capability_->On3GPPRegistrationChanged( 974 MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING, 975 home_provider, 976 ota_name); 977 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING, 978 capability_->registration_state_); 979 980 // Idle --> Roaming should be effective immediately. 981 capability_->On3GPPRegistrationChanged( 982 MM_MODEM_3GPP_REGISTRATION_STATE_IDLE, 983 home_provider, 984 ota_name); 985 dispatcher_.DispatchPendingEvents(); 986 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_IDLE, 987 capability_->registration_state_); 988 capability_->On3GPPRegistrationChanged( 989 MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING, 990 home_provider, 991 ota_name); 992 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING, 993 capability_->registration_state_); 994 995 // Idle --> Searching should be effective immediately. 996 capability_->On3GPPRegistrationChanged( 997 MM_MODEM_3GPP_REGISTRATION_STATE_IDLE, 998 home_provider, 999 ota_name); 1000 dispatcher_.DispatchPendingEvents(); 1001 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_IDLE, 1002 capability_->registration_state_); 1003 capability_->On3GPPRegistrationChanged( 1004 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1005 home_provider, 1006 ota_name); 1007 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1008 capability_->registration_state_); 1009 1010 // Home --> Searching --> Home should never see Searching. 1011 EXPECT_CALL(*(modem_info_.mock_metrics()), 1012 Notify3GPPRegistrationDelayedDropPosted()); 1013 EXPECT_CALL(*(modem_info_.mock_metrics()), 1014 Notify3GPPRegistrationDelayedDropCanceled()); 1015 1016 capability_->On3GPPRegistrationChanged( 1017 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1018 home_provider, 1019 ota_name); 1020 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1021 capability_->registration_state_); 1022 capability_->On3GPPRegistrationChanged( 1023 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1024 home_provider, 1025 ota_name); 1026 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1027 capability_->registration_state_); 1028 capability_->On3GPPRegistrationChanged( 1029 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1030 home_provider, 1031 ota_name); 1032 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1033 capability_->registration_state_); 1034 dispatcher_.DispatchPendingEvents(); 1035 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1036 capability_->registration_state_); 1037 Mock::VerifyAndClearExpectations(modem_info_.mock_metrics()); 1038 1039 // Home --> Searching --> wait till dispatch should see Searching 1040 EXPECT_CALL(*(modem_info_.mock_metrics()), 1041 Notify3GPPRegistrationDelayedDropPosted()); 1042 capability_->On3GPPRegistrationChanged( 1043 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1044 home_provider, 1045 ota_name); 1046 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1047 capability_->registration_state_); 1048 capability_->On3GPPRegistrationChanged( 1049 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1050 home_provider, 1051 ota_name); 1052 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1053 capability_->registration_state_); 1054 dispatcher_.DispatchPendingEvents(); 1055 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1056 capability_->registration_state_); 1057 Mock::VerifyAndClearExpectations(modem_info_.mock_metrics()); 1058 1059 // Home --> Searching --> Searching --> wait till dispatch should see 1060 // Searching *and* the first callback should be cancelled. 1061 EXPECT_CALL(*this, DummyCallback()).Times(0); 1062 EXPECT_CALL(*(modem_info_.mock_metrics()), 1063 Notify3GPPRegistrationDelayedDropPosted()); 1064 1065 capability_->On3GPPRegistrationChanged( 1066 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1067 home_provider, 1068 ota_name); 1069 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1070 capability_->registration_state_); 1071 capability_->On3GPPRegistrationChanged( 1072 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1073 home_provider, 1074 ota_name); 1075 SetMockRegistrationDroppedUpdateCallback(); 1076 capability_->On3GPPRegistrationChanged( 1077 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1078 home_provider, 1079 ota_name); 1080 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1081 capability_->registration_state_); 1082 dispatcher_.DispatchPendingEvents(); 1083 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1084 capability_->registration_state_); 1085 } 1086 1087 TEST_F(CellularCapabilityUniversalMainTest, IsRegistered) { 1088 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; 1089 EXPECT_FALSE(capability_->IsRegistered()); 1090 1091 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME; 1092 EXPECT_TRUE(capability_->IsRegistered()); 1093 1094 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING; 1095 EXPECT_FALSE(capability_->IsRegistered()); 1096 1097 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_DENIED; 1098 EXPECT_FALSE(capability_->IsRegistered()); 1099 1100 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; 1101 EXPECT_FALSE(capability_->IsRegistered()); 1102 1103 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING; 1104 EXPECT_TRUE(capability_->IsRegistered()); 1105 } 1106 1107 TEST_F(CellularCapabilityUniversalMainTest, 1108 UpdateRegistrationStateModemNotConnected) { 1109 capability_->InitProxies(); 1110 CreateService(); 1111 1112 cellular_->set_imsi("310240123456789"); 1113 cellular_->set_modem_state(Cellular::kModemStateRegistered); 1114 SetRegistrationDroppedUpdateTimeout(0); 1115 1116 const Stringmap& home_provider_map = cellular_->home_provider(); 1117 ASSERT_NE(home_provider_map.end(), home_provider_map.find(kOperatorNameKey)); 1118 string home_provider = home_provider_map.find(kOperatorNameKey)->second; 1119 string ota_name = cellular_->service_->friendly_name(); 1120 1121 // Home --> Searching should be effective immediately. 1122 capability_->On3GPPRegistrationChanged( 1123 MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1124 home_provider, 1125 ota_name); 1126 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_HOME, 1127 capability_->registration_state_); 1128 capability_->On3GPPRegistrationChanged( 1129 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1130 home_provider, 1131 ota_name); 1132 EXPECT_EQ(MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING, 1133 capability_->registration_state_); 1134 } 1135 1136 TEST_F(CellularCapabilityUniversalMainTest, IsValidSimPath) { 1137 // Invalid paths 1138 EXPECT_FALSE(capability_->IsValidSimPath("")); 1139 EXPECT_FALSE(capability_->IsValidSimPath("/")); 1140 1141 // A valid path 1142 EXPECT_TRUE(capability_->IsValidSimPath( 1143 "/org/freedesktop/ModemManager1/SIM/0")); 1144 1145 // Note that any string that is not one of the above invalid paths is 1146 // currently regarded as valid, since the ModemManager spec doesn't impose 1147 // a strict format on the path. The validity of this is subject to change. 1148 EXPECT_TRUE(capability_->IsValidSimPath("path")); 1149 } 1150 1151 TEST_F(CellularCapabilityUniversalMainTest, NormalizeMdn) { 1152 EXPECT_EQ("", capability_->NormalizeMdn("")); 1153 EXPECT_EQ("12345678901", capability_->NormalizeMdn("12345678901")); 1154 EXPECT_EQ("12345678901", capability_->NormalizeMdn("+1 234 567 8901")); 1155 EXPECT_EQ("12345678901", capability_->NormalizeMdn("+1-234-567-8901")); 1156 EXPECT_EQ("12345678901", capability_->NormalizeMdn("+1 (234) 567-8901")); 1157 EXPECT_EQ("12345678901", capability_->NormalizeMdn("1 234 567 8901 ")); 1158 EXPECT_EQ("2345678901", capability_->NormalizeMdn("(234) 567-8901")); 1159 } 1160 1161 TEST_F(CellularCapabilityUniversalMainTest, SimPathChanged) { 1162 // Set up mock modem SIM properties 1163 const char kImsi[] = "310100000001"; 1164 const char kSimIdentifier[] = "9999888"; 1165 const char kOperatorIdentifier[] = "310240"; 1166 const char kOperatorName[] = "Custom SPN"; 1167 KeyValueStore sim_properties; 1168 sim_properties.SetString(MM_SIM_PROPERTY_IMSI, kImsi); 1169 sim_properties.SetString(MM_SIM_PROPERTY_SIMIDENTIFIER, kSimIdentifier); 1170 sim_properties.SetString(MM_SIM_PROPERTY_OPERATORIDENTIFIER, 1171 kOperatorIdentifier); 1172 sim_properties.SetString(MM_SIM_PROPERTY_OPERATORNAME, kOperatorName); 1173 1174 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM)) 1175 .Times(1).WillOnce(Return(sim_properties)); 1176 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1177 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 1178 .Times(1); 1179 1180 EXPECT_FALSE(cellular_->sim_present()); 1181 EXPECT_EQ(nullptr, capability_->sim_proxy_);; 1182 EXPECT_EQ("", capability_->sim_path_); 1183 EXPECT_EQ("", cellular_->imsi()); 1184 EXPECT_EQ("", cellular_->sim_identifier()); 1185 EXPECT_EQ("", capability_->spn_); 1186 1187 capability_->OnSimPathChanged(kSimPath); 1188 EXPECT_TRUE(cellular_->sim_present()); 1189 EXPECT_NE(nullptr, capability_->sim_proxy_);; 1190 EXPECT_EQ(kSimPath, capability_->sim_path_); 1191 EXPECT_EQ(kImsi, cellular_->imsi()); 1192 EXPECT_EQ(kSimIdentifier, cellular_->sim_identifier()); 1193 EXPECT_EQ(kOperatorName, capability_->spn_); 1194 1195 // Changing to the same SIM path should be a no-op. 1196 capability_->OnSimPathChanged(kSimPath); 1197 EXPECT_TRUE(cellular_->sim_present()); 1198 EXPECT_NE(nullptr, capability_->sim_proxy_);; 1199 EXPECT_EQ(kSimPath, capability_->sim_path_); 1200 EXPECT_EQ(kImsi, cellular_->imsi()); 1201 EXPECT_EQ(kSimIdentifier, cellular_->sim_identifier()); 1202 EXPECT_EQ(kOperatorName, capability_->spn_); 1203 1204 capability_->OnSimPathChanged(""); 1205 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1206 Mock::VerifyAndClearExpectations(properties_proxy_.get()); 1207 EXPECT_FALSE(cellular_->sim_present()); 1208 EXPECT_EQ(nullptr, capability_->sim_proxy_);; 1209 EXPECT_EQ("", capability_->sim_path_); 1210 EXPECT_EQ("", cellular_->imsi()); 1211 EXPECT_EQ("", cellular_->sim_identifier()); 1212 EXPECT_EQ("", capability_->spn_); 1213 1214 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM)) 1215 .Times(1).WillOnce(Return(sim_properties)); 1216 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1217 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 1218 .Times(1); 1219 1220 capability_->OnSimPathChanged(kSimPath); 1221 EXPECT_TRUE(cellular_->sim_present()); 1222 EXPECT_NE(nullptr, capability_->sim_proxy_);; 1223 EXPECT_EQ(kSimPath, capability_->sim_path_); 1224 EXPECT_EQ(kImsi, cellular_->imsi()); 1225 EXPECT_EQ(kSimIdentifier, cellular_->sim_identifier()); 1226 EXPECT_EQ(kOperatorName, capability_->spn_); 1227 1228 capability_->OnSimPathChanged("/"); 1229 EXPECT_FALSE(cellular_->sim_present()); 1230 EXPECT_EQ(nullptr, capability_->sim_proxy_);; 1231 EXPECT_EQ("/", capability_->sim_path_); 1232 EXPECT_EQ("", cellular_->imsi()); 1233 EXPECT_EQ("", cellular_->sim_identifier()); 1234 EXPECT_EQ("", capability_->spn_); 1235 } 1236 1237 TEST_F(CellularCapabilityUniversalMainTest, SimPropertiesChanged) { 1238 // Set up mock modem properties 1239 KeyValueStore modem_properties; 1240 modem_properties.SetRpcIdentifier(MM_MODEM_PROPERTY_SIM, kSimPath); 1241 1242 // Set up mock modem sim properties 1243 const char kImsi[] = "310100000001"; 1244 KeyValueStore sim_properties; 1245 sim_properties.SetString(MM_SIM_PROPERTY_IMSI, kImsi); 1246 1247 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM)) 1248 .WillOnce(Return(sim_properties)); 1249 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1250 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 1251 .Times(0); 1252 1253 EXPECT_FALSE(capability_->sim_proxy_.get()); 1254 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_MODEM, 1255 modem_properties, vector<string>()); 1256 EXPECT_EQ(kSimPath, capability_->sim_path_); 1257 EXPECT_TRUE(capability_->sim_proxy_.get()); 1258 EXPECT_EQ(kImsi, cellular_->imsi()); 1259 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1260 1261 // Updating the SIM 1262 KeyValueStore new_properties; 1263 const char kNewImsi[] = "310240123456789"; 1264 const char kSimIdentifier[] = "9999888"; 1265 const char kOperatorIdentifier[] = "310240"; 1266 const char kOperatorName[] = "Custom SPN"; 1267 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1268 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 1269 .Times(2); 1270 EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kNewImsi)).Times(2); 1271 new_properties.SetString(MM_SIM_PROPERTY_IMSI, kNewImsi); 1272 new_properties.SetString(MM_SIM_PROPERTY_SIMIDENTIFIER, kSimIdentifier); 1273 new_properties.SetString(MM_SIM_PROPERTY_OPERATORIDENTIFIER, 1274 kOperatorIdentifier); 1275 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_SIM, 1276 new_properties, 1277 vector<string>()); 1278 EXPECT_EQ(kNewImsi, cellular_->imsi()); 1279 EXPECT_EQ(kSimIdentifier, cellular_->sim_identifier()); 1280 EXPECT_EQ("", capability_->spn_); 1281 1282 new_properties.SetString(MM_SIM_PROPERTY_OPERATORNAME, kOperatorName); 1283 capability_->OnPropertiesChanged(MM_DBUS_INTERFACE_SIM, 1284 new_properties, 1285 vector<string>()); 1286 EXPECT_EQ(kOperatorName, capability_->spn_); 1287 } 1288 1289 MATCHER_P(SizeIs, value, "") { 1290 return static_cast<size_t>(value) == arg.size(); 1291 } 1292 1293 TEST_F(CellularCapabilityUniversalMainTest, Reset) { 1294 // Save pointers to proxies before they are lost by the call to InitProxies 1295 mm1::MockModemProxy* modem_proxy = modem_proxy_.get(); 1296 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_)); 1297 capability_->InitProxies(); 1298 1299 Error error; 1300 ResultCallback reset_callback; 1301 1302 EXPECT_CALL(*modem_proxy, Reset(_, _, CellularCapability::kTimeoutReset)) 1303 .WillOnce(SaveArg<1>(&reset_callback)); 1304 1305 capability_->Reset(&error, ResultCallback()); 1306 EXPECT_TRUE(capability_->resetting_); 1307 reset_callback.Run(error); 1308 EXPECT_FALSE(capability_->resetting_); 1309 } 1310 1311 TEST_F(CellularCapabilityUniversalMainTest, UpdateActiveBearer) { 1312 // Common resources. 1313 const size_t kPathCount = 3; 1314 string active_paths[kPathCount], inactive_paths[kPathCount]; 1315 for (size_t i = 0; i < kPathCount; ++i) { 1316 active_paths[i] = base::StringPrintf("%s/%zu", kActiveBearerPathPrefix, i); 1317 inactive_paths[i] = 1318 base::StringPrintf("%s/%zu", kInactiveBearerPathPrefix, i); 1319 } 1320 1321 EXPECT_EQ(nullptr, capability_->GetActiveBearer());; 1322 1323 // Check that |active_bearer_| is set correctly when an active bearer is 1324 // returned. 1325 capability_->OnBearersChanged({inactive_paths[0], 1326 inactive_paths[1], 1327 active_paths[2], 1328 inactive_paths[1], 1329 inactive_paths[2]}); 1330 capability_->UpdateActiveBearer(); 1331 ASSERT_NE(nullptr, capability_->GetActiveBearer());; 1332 EXPECT_EQ(active_paths[2], capability_->GetActiveBearer()->dbus_path()); 1333 1334 // Check that |active_bearer_| is nullptr if no active bearers are returned. 1335 capability_->OnBearersChanged({inactive_paths[0], 1336 inactive_paths[1], 1337 inactive_paths[2], 1338 inactive_paths[1]}); 1339 capability_->UpdateActiveBearer(); 1340 EXPECT_EQ(nullptr, capability_->GetActiveBearer());; 1341 1342 // Check that returning multiple bearers causes death. 1343 capability_->OnBearersChanged({active_paths[0], 1344 inactive_paths[1], 1345 inactive_paths[2], 1346 active_paths[1], 1347 inactive_paths[1]}); 1348 EXPECT_DEATH(capability_->UpdateActiveBearer(), 1349 "Found more than one active bearer."); 1350 1351 capability_->OnBearersChanged({}); 1352 capability_->UpdateActiveBearer(); 1353 EXPECT_EQ(nullptr, capability_->GetActiveBearer());; 1354 } 1355 1356 // Validates expected behavior of Connect function 1357 TEST_F(CellularCapabilityUniversalMainTest, Connect) { 1358 mm1::MockModemSimpleProxy* modem_simple_proxy = modem_simple_proxy_.get(); 1359 SetSimpleProxy(); 1360 Error error; 1361 KeyValueStore properties; 1362 capability_->apn_try_list_.clear(); 1363 ResultCallback callback = 1364 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 1365 string bearer("/foo"); 1366 1367 // Test connect failures 1368 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _)) 1369 .WillRepeatedly(SaveArg<2>(&connect_callback_)); 1370 capability_->Connect(properties, &error, callback); 1371 EXPECT_TRUE(error.IsSuccess()); 1372 EXPECT_CALL(*this, TestCallback(IsFailure())); 1373 EXPECT_CALL(*service_, ClearLastGoodApn()); 1374 connect_callback_.Run(bearer, Error(Error::kOperationFailed)); 1375 Mock::VerifyAndClearExpectations(this); 1376 1377 // Test connect success 1378 capability_->Connect(properties, &error, callback); 1379 EXPECT_TRUE(error.IsSuccess()); 1380 EXPECT_CALL(*this, TestCallback(IsSuccess())); 1381 connect_callback_.Run(bearer, Error(Error::kSuccess)); 1382 Mock::VerifyAndClearExpectations(this); 1383 1384 // Test connect failures without a service. Make sure that shill 1385 // does not crash if the connect failed and there is no 1386 // CellularService object. This can happen if the modem is enabled 1387 // and then quickly disabled. 1388 cellular_->service_ = nullptr; 1389 EXPECT_FALSE(capability_->cellular()->service()); 1390 capability_->Connect(properties, &error, callback); 1391 EXPECT_TRUE(error.IsSuccess()); 1392 EXPECT_CALL(*this, TestCallback(IsFailure())); 1393 connect_callback_.Run(bearer, Error(Error::kOperationFailed)); 1394 } 1395 1396 // Validates Connect iterates over APNs 1397 TEST_F(CellularCapabilityUniversalMainTest, ConnectApns) { 1398 mm1::MockModemSimpleProxy* modem_simple_proxy = modem_simple_proxy_.get(); 1399 SetSimpleProxy(); 1400 Error error; 1401 KeyValueStore properties; 1402 capability_->apn_try_list_.clear(); 1403 ResultCallback callback = 1404 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this)); 1405 string bearer("/bearer0"); 1406 1407 const char apn_name_foo[] = "foo"; 1408 const char apn_name_bar[] = "bar"; 1409 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _)) 1410 .WillOnce(SaveArg<2>(&connect_callback_)); 1411 Stringmap apn1; 1412 apn1[kApnProperty] = apn_name_foo; 1413 capability_->apn_try_list_.push_back(apn1); 1414 Stringmap apn2; 1415 apn2[kApnProperty] = apn_name_bar; 1416 capability_->apn_try_list_.push_back(apn2); 1417 capability_->FillConnectPropertyMap(&properties); 1418 capability_->Connect(properties, &error, callback); 1419 EXPECT_TRUE(error.IsSuccess()); 1420 Mock::VerifyAndClearExpectations(modem_simple_proxy); 1421 1422 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _)) 1423 .WillOnce(SaveArg<2>(&connect_callback_)); 1424 EXPECT_CALL(*service_, ClearLastGoodApn()); 1425 connect_callback_.Run(bearer, Error(Error::kInvalidApn)); 1426 1427 EXPECT_CALL(*service_, SetLastGoodApn(apn2)); 1428 EXPECT_CALL(*this, TestCallback(IsSuccess())); 1429 connect_callback_.Run(bearer, Error(Error::kSuccess)); 1430 } 1431 1432 // Validates GetTypeString and AccessTechnologyToTechnologyFamily 1433 TEST_F(CellularCapabilityUniversalMainTest, GetTypeString) { 1434 const int gsm_technologies[] = { 1435 MM_MODEM_ACCESS_TECHNOLOGY_LTE, 1436 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS, 1437 MM_MODEM_ACCESS_TECHNOLOGY_HSPA, 1438 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA, 1439 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA, 1440 MM_MODEM_ACCESS_TECHNOLOGY_UMTS, 1441 MM_MODEM_ACCESS_TECHNOLOGY_EDGE, 1442 MM_MODEM_ACCESS_TECHNOLOGY_GPRS, 1443 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT, 1444 MM_MODEM_ACCESS_TECHNOLOGY_GSM, 1445 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0, 1446 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0, 1447 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA, 1448 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA, 1449 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB, 1450 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB, 1451 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT, 1452 }; 1453 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) { 1454 capability_->access_technologies_ = gsm_technologies[i]; 1455 ASSERT_EQ(capability_->GetTypeString(), kTechnologyFamilyGsm); 1456 } 1457 const int cdma_technologies[] = { 1458 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0, 1459 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA, 1460 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0, 1461 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB, 1462 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0, 1463 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT, 1464 }; 1465 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) { 1466 capability_->access_technologies_ = cdma_technologies[i]; 1467 ASSERT_EQ(capability_->GetTypeString(), kTechnologyFamilyCdma); 1468 } 1469 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; 1470 ASSERT_EQ(capability_->GetTypeString(), ""); 1471 } 1472 1473 TEST_F(CellularCapabilityUniversalMainTest, AllowRoaming) { 1474 EXPECT_FALSE(cellular_->allow_roaming_); 1475 EXPECT_FALSE(cellular_->provider_requires_roaming()); 1476 EXPECT_FALSE(capability_->AllowRoaming()); 1477 cellular_->set_provider_requires_roaming(true); 1478 EXPECT_TRUE(capability_->AllowRoaming()); 1479 cellular_->set_provider_requires_roaming(false); 1480 cellular_->allow_roaming_ = true; 1481 EXPECT_TRUE(capability_->AllowRoaming()); 1482 } 1483 1484 TEST_F(CellularCapabilityUniversalMainTest, GetMdnForOLP) { 1485 const string kVzwUUID = "c83d6597-dc91-4d48-a3a7-d86b80123751"; 1486 const string kFooUUID = "foo"; 1487 MockMobileOperatorInfo mock_operator_info(&dispatcher_, 1488 "MobileOperatorInfo"); 1489 1490 mock_operator_info.SetEmptyDefaultsForProperties(); 1491 EXPECT_CALL(mock_operator_info, IsMobileNetworkOperatorKnown()) 1492 .WillRepeatedly(Return(true)); 1493 EXPECT_CALL(mock_operator_info, uuid()).WillRepeatedly(ReturnRef(kVzwUUID)); 1494 capability_->subscription_state_ = 1495 CellularCapabilityUniversal::kSubscriptionStateUnknown; 1496 1497 cellular_->set_mdn(""); 1498 EXPECT_EQ("0000000000", capability_->GetMdnForOLP(&mock_operator_info)); 1499 cellular_->set_mdn("0123456789"); 1500 EXPECT_EQ("0123456789", capability_->GetMdnForOLP(&mock_operator_info)); 1501 cellular_->set_mdn("10123456789"); 1502 EXPECT_EQ("0123456789", capability_->GetMdnForOLP(&mock_operator_info)); 1503 1504 cellular_->set_mdn("1021232333"); 1505 capability_->subscription_state_ = 1506 CellularCapabilityUniversal::kSubscriptionStateUnprovisioned; 1507 EXPECT_EQ("0000000000", capability_->GetMdnForOLP(&mock_operator_info)); 1508 Mock::VerifyAndClearExpectations(&mock_operator_info); 1509 1510 mock_operator_info.SetEmptyDefaultsForProperties(); 1511 EXPECT_CALL(mock_operator_info, IsMobileNetworkOperatorKnown()) 1512 .WillRepeatedly(Return(true)); 1513 EXPECT_CALL(mock_operator_info, uuid()).WillRepeatedly(ReturnRef(kFooUUID)); 1514 1515 cellular_->set_mdn(""); 1516 EXPECT_EQ("", capability_->GetMdnForOLP(&mock_operator_info)); 1517 cellular_->set_mdn("0123456789"); 1518 EXPECT_EQ("0123456789", capability_->GetMdnForOLP(&mock_operator_info)); 1519 cellular_->set_mdn("10123456789"); 1520 EXPECT_EQ("10123456789", capability_->GetMdnForOLP(&mock_operator_info)); 1521 } 1522 1523 TEST_F(CellularCapabilityUniversalMainTest, UpdateServiceOLP) { 1524 const MobileOperatorInfo::OnlinePortal kOlp { 1525 "http://testurl", 1526 "POST", 1527 "imei=${imei}&imsi=${imsi}&mdn=${mdn}&min=${min}&iccid=${iccid}"}; 1528 const vector<MobileOperatorInfo::OnlinePortal> kOlpList {kOlp}; 1529 const string kUuidVzw = "c83d6597-dc91-4d48-a3a7-d86b80123751"; 1530 const string kUuidFoo = "foo"; 1531 1532 cellular_->set_imei("1"); 1533 cellular_->set_imsi("2"); 1534 cellular_->set_mdn("10123456789"); 1535 cellular_->set_min("5"); 1536 cellular_->set_sim_identifier("6"); 1537 1538 mock_home_provider_info_->SetEmptyDefaultsForProperties(); 1539 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown()) 1540 .WillRepeatedly(Return(true)); 1541 EXPECT_CALL(*mock_home_provider_info_, olp_list()) 1542 .WillRepeatedly(ReturnRef(kOlpList)); 1543 EXPECT_CALL(*mock_home_provider_info_, uuid()) 1544 .WillOnce(ReturnRef(kUuidVzw)); 1545 CreateService(); 1546 capability_->UpdateServiceOLP(); 1547 // Copy to simplify assertions below. 1548 Stringmap vzw_olp = cellular_->service()->olp(); 1549 EXPECT_EQ("http://testurl", vzw_olp[kPaymentPortalURL]); 1550 EXPECT_EQ("POST", vzw_olp[kPaymentPortalMethod]); 1551 EXPECT_EQ("imei=1&imsi=2&mdn=0123456789&min=5&iccid=6", 1552 vzw_olp[kPaymentPortalPostData]); 1553 Mock::VerifyAndClearExpectations(mock_home_provider_info_); 1554 1555 mock_home_provider_info_->SetEmptyDefaultsForProperties(); 1556 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown()) 1557 .WillRepeatedly(Return(true)); 1558 EXPECT_CALL(*mock_home_provider_info_, olp_list()) 1559 .WillRepeatedly(ReturnRef(kOlpList)); 1560 EXPECT_CALL(*mock_home_provider_info_, uuid()) 1561 .WillOnce(ReturnRef(kUuidFoo)); 1562 capability_->UpdateServiceOLP(); 1563 // Copy to simplify assertions below. 1564 Stringmap olp = cellular_->service()->olp(); 1565 EXPECT_EQ("http://testurl", olp[kPaymentPortalURL]); 1566 EXPECT_EQ("POST", olp[kPaymentPortalMethod]); 1567 EXPECT_EQ("imei=1&imsi=2&mdn=10123456789&min=5&iccid=6", 1568 olp[kPaymentPortalPostData]); 1569 } 1570 1571 TEST_F(CellularCapabilityUniversalMainTest, IsMdnValid) { 1572 cellular_->set_mdn(""); 1573 EXPECT_FALSE(capability_->IsMdnValid()); 1574 cellular_->set_mdn("0000000"); 1575 EXPECT_FALSE(capability_->IsMdnValid()); 1576 cellular_->set_mdn("0000001"); 1577 EXPECT_TRUE(capability_->IsMdnValid()); 1578 cellular_->set_mdn("1231223"); 1579 EXPECT_TRUE(capability_->IsMdnValid()); 1580 } 1581 1582 TEST_F(CellularCapabilityUniversalTimerTest, CompleteActivation) { 1583 const char kIccid[] = "1234567"; 1584 1585 cellular_->set_sim_identifier(kIccid); 1586 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1587 SetActivationState(PendingActivationStore::kIdentifierICCID, 1588 kIccid, 1589 PendingActivationStore::kStatePending)) 1590 .Times(1); 1591 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1592 GetActivationState(PendingActivationStore::kIdentifierICCID, 1593 kIccid)) 1594 .WillOnce(Return(PendingActivationStore::kStatePending)); 1595 EXPECT_CALL(*service_, SetActivationState(kActivationStateActivating)) 1596 .Times(1); 1597 EXPECT_CALL(*modem_proxy_.get(), Reset(_, _, _)).Times(1); 1598 Error error; 1599 capability_->InitProxies(); 1600 capability_->CompleteActivation(&error); 1601 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1602 Mock::VerifyAndClearExpectations(service_); 1603 Mock::VerifyAndClearExpectations(&mock_dispatcher_); 1604 } 1605 1606 TEST_F(CellularCapabilityUniversalMainTest, UpdateServiceActivationState) { 1607 const char kIccid[] = "1234567"; 1608 const vector<MobileOperatorInfo::OnlinePortal> olp_list { 1609 {"some@url", "some_method", "some_post_data"} 1610 }; 1611 capability_->subscription_state_ = 1612 CellularCapabilityUniversal::kSubscriptionStateUnprovisioned; 1613 cellular_->set_sim_identifier(""); 1614 cellular_->set_mdn("0000000000"); 1615 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown()) 1616 .WillRepeatedly(Return(true)); 1617 EXPECT_CALL(*mock_home_provider_info_, olp_list()) 1618 .WillRepeatedly(ReturnRef(olp_list)); 1619 1620 service_->SetAutoConnect(false); 1621 EXPECT_CALL(*service_, SetActivationState(kActivationStateNotActivated)) 1622 .Times(1); 1623 capability_->UpdateServiceActivationState(); 1624 Mock::VerifyAndClearExpectations(service_); 1625 EXPECT_FALSE(service_->auto_connect()); 1626 1627 cellular_->set_mdn("1231231122"); 1628 capability_->subscription_state_ = 1629 CellularCapabilityUniversal::kSubscriptionStateUnknown; 1630 EXPECT_CALL(*service_, SetActivationState(kActivationStateActivated)) 1631 .Times(1); 1632 capability_->UpdateServiceActivationState(); 1633 Mock::VerifyAndClearExpectations(service_); 1634 EXPECT_TRUE(service_->auto_connect()); 1635 1636 // Make sure we don't overwrite auto-connect if a service is already 1637 // activated before calling UpdateServiceActivationState(). 1638 service_->SetAutoConnect(false); 1639 EXPECT_FALSE(service_->auto_connect()); 1640 const string activation_state = kActivationStateActivated; 1641 EXPECT_CALL(*service_, activation_state()) 1642 .WillOnce(ReturnRef(activation_state)); 1643 EXPECT_CALL(*service_, SetActivationState(kActivationStateActivated)) 1644 .Times(1); 1645 capability_->UpdateServiceActivationState(); 1646 Mock::VerifyAndClearExpectations(service_); 1647 EXPECT_FALSE(service_->auto_connect()); 1648 1649 service_->SetAutoConnect(false); 1650 cellular_->set_mdn("0000000000"); 1651 cellular_->set_sim_identifier(kIccid); 1652 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1653 GetActivationState(PendingActivationStore::kIdentifierICCID, 1654 kIccid)) 1655 .Times(1) 1656 .WillRepeatedly(Return(PendingActivationStore::kStatePending)); 1657 EXPECT_CALL(*service_, SetActivationState(kActivationStateActivating)) 1658 .Times(1); 1659 capability_->UpdateServiceActivationState(); 1660 Mock::VerifyAndClearExpectations(service_); 1661 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1662 EXPECT_FALSE(service_->auto_connect()); 1663 1664 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1665 GetActivationState(PendingActivationStore::kIdentifierICCID, 1666 kIccid)) 1667 .Times(2) 1668 .WillRepeatedly(Return(PendingActivationStore::kStateActivated)); 1669 EXPECT_CALL(*service_, SetActivationState(kActivationStateActivated)) 1670 .Times(1); 1671 capability_->UpdateServiceActivationState(); 1672 Mock::VerifyAndClearExpectations(service_); 1673 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1674 EXPECT_TRUE(service_->auto_connect()); 1675 1676 // SubscriptionStateUnprovisioned overrides valid MDN. 1677 capability_->subscription_state_ = 1678 CellularCapabilityUniversal::kSubscriptionStateUnprovisioned; 1679 cellular_->set_mdn("1231231122"); 1680 cellular_->set_sim_identifier(""); 1681 service_->SetAutoConnect(false); 1682 EXPECT_CALL(*service_, SetActivationState(kActivationStateNotActivated)) 1683 .Times(1); 1684 capability_->UpdateServiceActivationState(); 1685 Mock::VerifyAndClearExpectations(service_); 1686 EXPECT_FALSE(service_->auto_connect()); 1687 1688 // SubscriptionStateProvisioned overrides invalid MDN. 1689 capability_->subscription_state_ = 1690 CellularCapabilityUniversal::kSubscriptionStateProvisioned; 1691 cellular_->set_mdn("0000000000"); 1692 cellular_->set_sim_identifier(""); 1693 service_->SetAutoConnect(false); 1694 EXPECT_CALL(*service_, SetActivationState(kActivationStateActivated)) 1695 .Times(1); 1696 capability_->UpdateServiceActivationState(); 1697 Mock::VerifyAndClearExpectations(service_); 1698 EXPECT_TRUE(service_->auto_connect()); 1699 } 1700 1701 TEST_F(CellularCapabilityUniversalMainTest, UpdatePendingActivationState) { 1702 const char kIccid[] = "1234567"; 1703 1704 capability_->InitProxies(); 1705 capability_->registration_state_ = 1706 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING; 1707 1708 // No MDN, no ICCID. 1709 cellular_->set_mdn("0000000"); 1710 capability_->subscription_state_ = 1711 CellularCapabilityUniversal::kSubscriptionStateUnknown; 1712 cellular_->set_sim_identifier(""); 1713 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1714 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 1715 .Times(0); 1716 capability_->UpdatePendingActivationState(); 1717 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1718 1719 // Valid MDN, but subsciption_state_ Unprovisioned 1720 cellular_->set_mdn("1234567"); 1721 capability_->subscription_state_ = 1722 CellularCapabilityUniversal::kSubscriptionStateUnprovisioned; 1723 cellular_->set_sim_identifier(""); 1724 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1725 GetActivationState(PendingActivationStore::kIdentifierICCID, _)) 1726 .Times(0); 1727 capability_->UpdatePendingActivationState(); 1728 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1729 1730 // ICCID known. 1731 cellular_->set_sim_identifier(kIccid); 1732 1733 // After the modem has reset. 1734 capability_->reset_done_ = true; 1735 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1736 GetActivationState(PendingActivationStore::kIdentifierICCID, 1737 kIccid)) 1738 .Times(1).WillOnce(Return(PendingActivationStore::kStatePending)); 1739 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1740 SetActivationState(PendingActivationStore::kIdentifierICCID, 1741 kIccid, 1742 PendingActivationStore::kStateActivated)) 1743 .Times(1); 1744 capability_->UpdatePendingActivationState(); 1745 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1746 1747 // Not registered. 1748 capability_->registration_state_ = 1749 MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING; 1750 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1751 GetActivationState(PendingActivationStore::kIdentifierICCID, 1752 kIccid)) 1753 .Times(2).WillRepeatedly(Return(PendingActivationStore::kStateActivated)); 1754 EXPECT_CALL(*service_, AutoConnect()).Times(0); 1755 capability_->UpdatePendingActivationState(); 1756 Mock::VerifyAndClearExpectations(service_); 1757 1758 // Service, registered. 1759 capability_->registration_state_ = 1760 MM_MODEM_3GPP_REGISTRATION_STATE_HOME; 1761 EXPECT_CALL(*service_, AutoConnect()).Times(1); 1762 capability_->UpdatePendingActivationState(); 1763 1764 cellular_->service_->activation_state_ = kActivationStateNotActivated; 1765 1766 Mock::VerifyAndClearExpectations(service_); 1767 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1768 1769 // Device is connected. 1770 cellular_->state_ = Cellular::kStateConnected; 1771 capability_->UpdatePendingActivationState(); 1772 1773 // Device is linked. 1774 cellular_->state_ = Cellular::kStateLinked; 1775 capability_->UpdatePendingActivationState(); 1776 1777 // Got valid MDN, subscription_state_ is kSubscriptionStateUnknown 1778 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1779 RemoveEntry(PendingActivationStore::kIdentifierICCID, kIccid)); 1780 cellular_->state_ = Cellular::kStateRegistered; 1781 cellular_->set_mdn("1020304"); 1782 capability_->subscription_state_ = 1783 CellularCapabilityUniversal::kSubscriptionStateUnknown; 1784 capability_->UpdatePendingActivationState(); 1785 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1786 1787 // Got invalid MDN, subscription_state_ is kSubscriptionStateProvisioned 1788 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1789 RemoveEntry(PendingActivationStore::kIdentifierICCID, kIccid)); 1790 cellular_->state_ = Cellular::kStateRegistered; 1791 cellular_->set_mdn("0000000"); 1792 capability_->subscription_state_ = 1793 CellularCapabilityUniversal::kSubscriptionStateProvisioned; 1794 capability_->UpdatePendingActivationState(); 1795 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1796 } 1797 1798 TEST_F(CellularCapabilityUniversalMainTest, IsServiceActivationRequired) { 1799 const vector<MobileOperatorInfo::OnlinePortal> empty_list; 1800 const vector<MobileOperatorInfo::OnlinePortal> olp_list { 1801 {"some@url", "some_method", "some_post_data"} 1802 }; 1803 1804 capability_->subscription_state_ = 1805 CellularCapabilityUniversal::kSubscriptionStateProvisioned; 1806 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1807 1808 capability_->subscription_state_ = 1809 CellularCapabilityUniversal::kSubscriptionStateUnprovisioned; 1810 EXPECT_TRUE(capability_->IsServiceActivationRequired()); 1811 1812 capability_->subscription_state_ = 1813 CellularCapabilityUniversal::kSubscriptionStateUnknown; 1814 cellular_->set_mdn("0000000000"); 1815 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1816 1817 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown()) 1818 .WillRepeatedly(Return(false)); 1819 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1820 Mock::VerifyAndClearExpectations(mock_home_provider_info_); 1821 1822 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown()) 1823 .WillRepeatedly(Return(true)); 1824 EXPECT_CALL(*mock_home_provider_info_, olp_list()) 1825 .WillRepeatedly(ReturnRef(empty_list)); 1826 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1827 Mock::VerifyAndClearExpectations(mock_home_provider_info_); 1828 1829 // Set expectations for all subsequent cases. 1830 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown()) 1831 .WillRepeatedly(Return(true)); 1832 EXPECT_CALL(*mock_home_provider_info_, olp_list()) 1833 .WillRepeatedly(ReturnRef(olp_list)); 1834 1835 cellular_->set_mdn(""); 1836 EXPECT_TRUE(capability_->IsServiceActivationRequired()); 1837 cellular_->set_mdn("1234567890"); 1838 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1839 cellular_->set_mdn("0000000000"); 1840 EXPECT_TRUE(capability_->IsServiceActivationRequired()); 1841 1842 const char kIccid[] = "1234567890"; 1843 cellular_->set_sim_identifier(kIccid); 1844 EXPECT_CALL(*modem_info_.mock_pending_activation_store(), 1845 GetActivationState(PendingActivationStore::kIdentifierICCID, 1846 kIccid)) 1847 .WillOnce(Return(PendingActivationStore::kStateActivated)) 1848 .WillOnce(Return(PendingActivationStore::kStatePending)) 1849 .WillOnce(Return(PendingActivationStore::kStateUnknown)); 1850 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1851 EXPECT_FALSE(capability_->IsServiceActivationRequired()); 1852 EXPECT_TRUE(capability_->IsServiceActivationRequired()); 1853 Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store()); 1854 } 1855 1856 TEST_F(CellularCapabilityUniversalMainTest, OnModemCurrentCapabilitiesChanged) { 1857 EXPECT_FALSE(cellular_->scanning_supported()); 1858 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_LTE); 1859 EXPECT_FALSE(cellular_->scanning_supported()); 1860 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_CDMA_EVDO); 1861 EXPECT_FALSE(cellular_->scanning_supported()); 1862 capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_GSM_UMTS); 1863 EXPECT_TRUE(cellular_->scanning_supported()); 1864 capability_->OnModemCurrentCapabilitiesChanged( 1865 MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO); 1866 EXPECT_TRUE(cellular_->scanning_supported()); 1867 } 1868 1869 TEST_F(CellularCapabilityUniversalMainTest, GetNetworkTechnologyStringOnE362) { 1870 cellular_->set_model_id("");; 1871 capability_->access_technologies_ = 0; 1872 EXPECT_TRUE(capability_->GetNetworkTechnologyString().empty()); 1873 1874 cellular_->set_mm_plugin(CellularCapabilityUniversal::kNovatelLTEMMPlugin); 1875 EXPECT_EQ(kNetworkTechnologyLte, capability_->GetNetworkTechnologyString()); 1876 1877 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_GPRS; 1878 EXPECT_EQ(kNetworkTechnologyLte, capability_->GetNetworkTechnologyString()); 1879 1880 cellular_->set_mm_plugin(""); 1881 EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString()); 1882 } 1883 1884 TEST_F(CellularCapabilityUniversalMainTest, GetOutOfCreditsDetectionType) { 1885 cellular_->set_model_id("");; 1886 EXPECT_EQ(OutOfCreditsDetector::OOCTypeNone, 1887 capability_->GetOutOfCreditsDetectionType()); 1888 cellular_->set_mm_plugin(CellularCapabilityUniversal::kAltairLTEMMPlugin); 1889 EXPECT_EQ(OutOfCreditsDetector::OOCTypeSubscriptionState, 1890 capability_->GetOutOfCreditsDetectionType()); 1891 } 1892 1893 TEST_F(CellularCapabilityUniversalMainTest, SimLockStatusToProperty) { 1894 Error error; 1895 KeyValueStore store = capability_->SimLockStatusToProperty(&error); 1896 EXPECT_FALSE(store.GetBool(kSIMLockEnabledProperty)); 1897 EXPECT_TRUE(store.GetString(kSIMLockTypeProperty).empty()); 1898 EXPECT_EQ(0, store.GetUint(kSIMLockRetriesLeftProperty)); 1899 1900 capability_->sim_lock_status_.enabled = true; 1901 capability_->sim_lock_status_.retries_left = 3; 1902 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PIN; 1903 store = capability_->SimLockStatusToProperty(&error); 1904 EXPECT_TRUE(store.GetBool(kSIMLockEnabledProperty)); 1905 EXPECT_EQ("sim-pin", store.GetString(kSIMLockTypeProperty)); 1906 EXPECT_EQ(3, store.GetUint(kSIMLockRetriesLeftProperty)); 1907 1908 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PUK; 1909 store = capability_->SimLockStatusToProperty(&error); 1910 EXPECT_EQ("sim-puk", store.GetString(kSIMLockTypeProperty)); 1911 1912 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PIN2; 1913 store = capability_->SimLockStatusToProperty(&error); 1914 EXPECT_TRUE(store.GetString(kSIMLockTypeProperty).empty()); 1915 1916 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PUK2; 1917 store = capability_->SimLockStatusToProperty(&error); 1918 EXPECT_TRUE(store.GetString(kSIMLockTypeProperty).empty()); 1919 } 1920 1921 TEST_F(CellularCapabilityUniversalMainTest, OnLockRetriesChanged) { 1922 CellularCapabilityUniversal::LockRetryData data; 1923 const uint32_t kDefaultRetries = 999; 1924 1925 capability_->OnLockRetriesChanged(data); 1926 EXPECT_EQ(kDefaultRetries, capability_->sim_lock_status_.retries_left); 1927 1928 data[MM_MODEM_LOCK_SIM_PIN] = 3; 1929 data[MM_MODEM_LOCK_SIM_PUK] = 10; 1930 capability_->OnLockRetriesChanged(data); 1931 EXPECT_EQ(3, capability_->sim_lock_status_.retries_left); 1932 1933 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PUK; 1934 capability_->OnLockRetriesChanged(data); 1935 EXPECT_EQ(10, capability_->sim_lock_status_.retries_left); 1936 1937 capability_->sim_lock_status_.lock_type = MM_MODEM_LOCK_SIM_PIN; 1938 capability_->OnLockRetriesChanged(data); 1939 EXPECT_EQ(3, capability_->sim_lock_status_.retries_left); 1940 1941 data.clear(); 1942 capability_->OnLockRetriesChanged(data); 1943 EXPECT_EQ(kDefaultRetries, capability_->sim_lock_status_.retries_left); 1944 } 1945 1946 TEST_F(CellularCapabilityUniversalMainTest, OnLockTypeChanged) { 1947 EXPECT_EQ(MM_MODEM_LOCK_UNKNOWN, capability_->sim_lock_status_.lock_type); 1948 1949 capability_->OnLockTypeChanged(MM_MODEM_LOCK_NONE); 1950 EXPECT_EQ(MM_MODEM_LOCK_NONE, capability_->sim_lock_status_.lock_type); 1951 EXPECT_FALSE(capability_->sim_lock_status_.enabled); 1952 1953 capability_->OnLockTypeChanged(MM_MODEM_LOCK_SIM_PIN); 1954 EXPECT_EQ(MM_MODEM_LOCK_SIM_PIN, capability_->sim_lock_status_.lock_type); 1955 EXPECT_TRUE(capability_->sim_lock_status_.enabled); 1956 1957 capability_->sim_lock_status_.enabled = false; 1958 capability_->OnLockTypeChanged(MM_MODEM_LOCK_SIM_PUK); 1959 EXPECT_EQ(MM_MODEM_LOCK_SIM_PUK, capability_->sim_lock_status_.lock_type); 1960 EXPECT_TRUE(capability_->sim_lock_status_.enabled); 1961 } 1962 1963 TEST_F(CellularCapabilityUniversalMainTest, OnSimLockPropertiesChanged) { 1964 EXPECT_EQ(MM_MODEM_LOCK_UNKNOWN, capability_->sim_lock_status_.lock_type); 1965 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left); 1966 1967 KeyValueStore changed; 1968 vector<string> invalidated; 1969 1970 capability_->OnModemPropertiesChanged(changed, invalidated); 1971 EXPECT_EQ(MM_MODEM_LOCK_UNKNOWN, capability_->sim_lock_status_.lock_type); 1972 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left); 1973 1974 // Unlock retries changed, but the SIM wasn't locked. 1975 CellularCapabilityUniversal::LockRetryData retry_data; 1976 retry_data[MM_MODEM_LOCK_SIM_PIN] = 3; 1977 changed.Set(MM_MODEM_PROPERTY_UNLOCKRETRIES, brillo::Any(retry_data)); 1978 1979 capability_->OnModemPropertiesChanged(changed, invalidated); 1980 EXPECT_EQ(MM_MODEM_LOCK_UNKNOWN, capability_->sim_lock_status_.lock_type); 1981 EXPECT_EQ(3, capability_->sim_lock_status_.retries_left); 1982 1983 // Unlock retries changed and the SIM got locked. 1984 changed.SetUint(MM_MODEM_PROPERTY_UNLOCKREQUIRED, 1985 static_cast<uint32_t>(MM_MODEM_LOCK_SIM_PIN)); 1986 capability_->OnModemPropertiesChanged(changed, invalidated); 1987 EXPECT_EQ(MM_MODEM_LOCK_SIM_PIN, capability_->sim_lock_status_.lock_type); 1988 EXPECT_EQ(3, capability_->sim_lock_status_.retries_left); 1989 1990 // Only unlock retries changed. 1991 changed.Remove(MM_MODEM_PROPERTY_UNLOCKREQUIRED); 1992 retry_data[MM_MODEM_LOCK_SIM_PIN] = 2; 1993 changed.Set(MM_MODEM_PROPERTY_UNLOCKRETRIES, brillo::Any(retry_data)); 1994 capability_->OnModemPropertiesChanged(changed, invalidated); 1995 EXPECT_EQ(MM_MODEM_LOCK_SIM_PIN, capability_->sim_lock_status_.lock_type); 1996 EXPECT_EQ(2, capability_->sim_lock_status_.retries_left); 1997 1998 // Unlock retries changed with a value that doesn't match the current 1999 // lock type. Default to whatever count is available. 2000 retry_data.clear(); 2001 retry_data[MM_MODEM_LOCK_SIM_PIN2] = 2; 2002 changed.Set(MM_MODEM_PROPERTY_UNLOCKRETRIES, brillo::Any(retry_data)); 2003 capability_->OnModemPropertiesChanged(changed, invalidated); 2004 EXPECT_EQ(MM_MODEM_LOCK_SIM_PIN, capability_->sim_lock_status_.lock_type); 2005 EXPECT_EQ(2, capability_->sim_lock_status_.retries_left); 2006 } 2007 2008 } // namespace shill 2009