1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 16b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_capability_gsm.h" 18b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 194c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow#include <string> 204c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow#include <vector> 214c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow 229a24553461df7036755060423f90804011612249Eric Shienbrood#include <base/bind.h> 23a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 24289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__) 25289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h> 26289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else 2720c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov#include <chromeos/dbus/service_constants.h> 28289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif // __ANDROID__ 2920c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov#include <mm/mm-modem.h> 30b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 31c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular.h" 32c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_service.h" 33c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_mobile_operator_info.h" 34c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_gsm_card_proxy.h" 35c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_gsm_network_proxy.h" 36c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_info.h" 37c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_proxy.h" 38c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_simple_proxy.h" 39b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov#include "shill/error.h" 403cfbf216f1f918384866bf0d1a4c9a447d8109e8Darin Petkov#include "shill/mock_adaptors.h" 41608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu#include "shill/mock_control.h" 4282a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain#include "shill/mock_log.h" 4330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood#include "shill/mock_profile.h" 4405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu#include "shill/test_event_dispatcher.h" 45be277dd19182e3de5422fd5ea5094053e88a396fBen Chan#include "shill/testing.h" 46b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 479a24553461df7036755060423f90804011612249Eric Shienbroodusing base::Bind; 48a4ca3c38f3e187cb0ee21b01583eb2803a19d11fDarin Petkovusing base::StringPrintf; 499a24553461df7036755060423f90804011612249Eric Shienbroodusing base::Unretained; 50313324136473f9120b1e485a408f51ae938dcb64Darin Petkovusing std::string; 514c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgowusing std::vector; 52e5bc2cbc1c9717564d4ab75c42a26492b505f537Darin Petkovusing testing::_; 539a24553461df7036755060423f90804011612249Eric Shienbroodusing testing::Invoke; 543cfbf216f1f918384866bf0d1a4c9a447d8109e8Darin Petkovusing testing::NiceMock; 55cb547737d288052935052eeb341b30922b4022a0Darin Petkovusing testing::Return; 56cd0349c9bafcb5c250da25691ada7fcc3752e145Jason Glasgowusing testing::SaveArg; 57cb547737d288052935052eeb341b30922b4022a0Darin Petkov 58b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkovnamespace shill { 59b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 60b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkovclass CellularCapabilityGSMTest : public testing::Test { 61b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov public: 62b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov CellularCapabilityGSMTest() 63608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu : control_interface_(this), 64bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal modem_info_(&control_interface_, &dispatcher_, nullptr, nullptr), 656c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le create_card_proxy_from_factory_(false), 663ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan proxy_(new MockModemProxy()), 673ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan simple_proxy_(new MockModemSimpleProxy()), 683ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan card_proxy_(new MockModemGSMCardProxy()), 693ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan network_proxy_(new MockModemGSMNetworkProxy()), 70ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan capability_(nullptr), 71ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan device_adaptor_(nullptr), 7227526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu cellular_(new Cellular(&modem_info_, 73b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov "", 74313324136473f9120b1e485a408f51ae938dcb64Darin Petkov kAddress, 75b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 0, 76b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov Cellular::kTypeGSM, 77b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov "", 78608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu "")), 79ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan mock_home_provider_info_(nullptr), 80ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan mock_serving_operator_info_(nullptr) { 8127526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu modem_info_.metrics()->RegisterDevice(cellular_->interface_index(), 8227526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu Technology::kCellular); 83ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le } 84b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 853e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin Petkov virtual ~CellularCapabilityGSMTest() { 86ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan cellular_->service_ = nullptr; 87ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan capability_ = nullptr; 88ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan device_adaptor_ = nullptr; 89721ac93ab19a9169872a296626adb49279031af5Darin Petkov } 90721ac93ab19a9169872a296626adb49279031af5Darin Petkov 91721ac93ab19a9169872a296626adb49279031af5Darin Petkov virtual void SetUp() { 92721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_ = 93fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko static_cast<CellularCapabilityGSM*>(cellular_->capability_.get()); 943cfbf216f1f918384866bf0d1a4c9a447d8109e8Darin Petkov device_adaptor_ = 95fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko static_cast<DeviceMockAdaptor*>(cellular_->adaptor()); 9627526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu } 9727526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu 982f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeEnable(bool enable, Error* error, 992f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const ResultCallback& callback, int timeout) { 100923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le callback.Run(Error()); 101923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 1022f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetIMEI(Error* error, const GSMIdentifierCallback& callback, 1039a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1049a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(kIMEI, Error()); 1059a24553461df7036755060423f90804011612249Eric Shienbrood } 1062f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetIMSI(Error* error, const GSMIdentifierCallback& callback, 1079a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1089a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(kIMSI, Error()); 1099a24553461df7036755060423f90804011612249Eric Shienbrood } 1102f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetIMSIFails(Error* error, const GSMIdentifierCallback& callback, 11182a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain int timeout) { 11282a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain callback.Run("", Error(Error::kOperationFailed)); 11382a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain } 1142f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetMSISDN(Error* error, const GSMIdentifierCallback& callback, 1159a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1169a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(kMSISDN, Error()); 1179a24553461df7036755060423f90804011612249Eric Shienbrood } 1182f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetMSISDNFail(Error* error, const GSMIdentifierCallback& callback, 119923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le int timeout) { 120923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le callback.Run("", Error(Error::kOperationFailed)); 121923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 1222f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetSPN(Error* error, const GSMIdentifierCallback& callback, 1239a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1249a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(kTestCarrier, Error()); 1259a24553461df7036755060423f90804011612249Eric Shienbrood } 1262f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetSPNFail(Error* error, const GSMIdentifierCallback& callback, 127923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le int timeout) { 128923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le callback.Run("", Error(Error::kOperationFailed)); 129923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 1302f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetSignalQuality(Error* error, 1312f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const SignalQualityCallback& callback, 1329a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1339a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(kStrength, Error()); 1349a24553461df7036755060423f90804011612249Eric Shienbrood } 1352f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetRegistrationInfo(Error* error, 1362f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const RegistrationInfoCallback& callback, 1379a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1389a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME, 1399a24553461df7036755060423f90804011612249Eric Shienbrood kTestNetwork, kTestCarrier, Error()); 1409a24553461df7036755060423f90804011612249Eric Shienbrood } 1412f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeRegister(const string& network_id, 1422f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart Error* error, 1432f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const ResultCallback& callback, 1449a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1459a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(Error()); 1469a24553461df7036755060423f90804011612249Eric Shienbrood } 1472f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeEnablePIN(const string& pin, bool enable, 1482f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart Error* error, const ResultCallback& callback, 1499a24553461df7036755060423f90804011612249Eric Shienbrood int timeout) { 1509a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(Error()); 1519a24553461df7036755060423f90804011612249Eric Shienbrood } 1522f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeSendPIN(const string& pin, Error* error, 1532f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const ResultCallback& callback, int timeout) { 1549a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(Error()); 1559a24553461df7036755060423f90804011612249Eric Shienbrood } 1562f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeSendPUK(const string& puk, const string& pin, Error* error, 1572f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const ResultCallback& callback, int timeout) { 1589a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(Error()); 1599a24553461df7036755060423f90804011612249Eric Shienbrood } 1602f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeChangePIN(const string& old_pin, const string& pin, Error* error, 1612f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const ResultCallback& callback, int timeout) { 1629a24553461df7036755060423f90804011612249Eric Shienbrood callback.Run(Error()); 1639a24553461df7036755060423f90804011612249Eric Shienbrood } 1642f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetModemStatus(Error* error, 16505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const KeyValueStoreCallback& callback, 166923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le int timeout) { 16705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu KeyValueStore props; 168923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le callback.Run(props, Error()); 169923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 1702f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart void InvokeGetModemInfo(Error* error, const ModemInfoCallback& callback, 171923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le int timeout) { 17205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu callback.Run("", "", "", Error()); 173923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 1749a24553461df7036755060423f90804011612249Eric Shienbrood 17505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu void InvokeConnectFail(KeyValueStore props, Error* error, 1762f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const ResultCallback& callback, int timeout) { 177b5954a249c1346e5a0da097330a3639753392ecbThieu Le callback.Run(Error(Error::kOperationFailed)); 178b5954a249c1346e5a0da097330a3639753392ecbThieu Le } 179b5954a249c1346e5a0da097330a3639753392ecbThieu Le 1802f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart MOCK_METHOD1(TestCallback, void(const Error& error)); 1819a24553461df7036755060423f90804011612249Eric Shienbrood 182b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov protected: 183313324136473f9120b1e485a408f51ae938dcb64Darin Petkov static const char kAddress[]; 1841272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov static const char kTestMobileProviderDBPath[]; 1855de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood static const char kTestNetwork[]; 186cb547737d288052935052eeb341b30922b4022a0Darin Petkov static const char kTestCarrier[]; 187b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov static const char kPIN[]; 188b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov static const char kPUK[]; 189cb547737d288052935052eeb341b30922b4022a0Darin Petkov static const char kIMEI[]; 190cb547737d288052935052eeb341b30922b4022a0Darin Petkov static const char kIMSI[]; 191cb547737d288052935052eeb341b30922b4022a0Darin Petkov static const char kMSISDN[]; 1929a24553461df7036755060423f90804011612249Eric Shienbrood static const int kStrength; 193cb547737d288052935052eeb341b30922b4022a0Darin Petkov 194608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu class TestControl : public MockControl { 195923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le public: 196608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu explicit TestControl(CellularCapabilityGSMTest* test) : test_(test) {} 197923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 1982f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart virtual ModemProxyInterface* CreateModemProxy( 1992f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*path*/, 2002f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*service*/) { 201923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le return test_->proxy_.release(); 202923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 203923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 2042f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart virtual ModemSimpleProxyInterface* CreateModemSimpleProxy( 2052f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*path*/, 2062f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*service*/) { 207923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le return test_->simple_proxy_.release(); 208923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 209923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 2102f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart virtual ModemGSMCardProxyInterface* CreateModemGSMCardProxy( 2112f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*path*/, 2122f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*service*/) { 213ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan // TODO(benchan): This code conditionally returns a nullptr to avoid 2143ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan // CellularCapabilityGSM::InitProperties (and thus 2153ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan // CellularCapabilityGSM::GetIMSI) from being called during the 2163ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan // construction. Remove this workaround after refactoring the tests. 2173ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan return test_->create_card_proxy_from_factory_ ? 218ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan test_->card_proxy_.release() : nullptr; 219923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 220923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 2212f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart virtual ModemGSMNetworkProxyInterface* CreateModemGSMNetworkProxy( 2222f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*path*/, 2232f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const string& /*service*/) { 224923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le return test_->network_proxy_.release(); 225923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 226923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 227923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le private: 2282f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart CellularCapabilityGSMTest* test_; 229923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le }; 230923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 231923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le void SetProxy() { 232923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le capability_->proxy_.reset(proxy_.release()); 233923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 234923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 235cb547737d288052935052eeb341b30922b4022a0Darin Petkov void SetCardProxy() { 236721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->card_proxy_.reset(card_proxy_.release()); 237cb547737d288052935052eeb341b30922b4022a0Darin Petkov } 238b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 2391272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov void SetNetworkProxy() { 240721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->network_proxy_.reset(network_proxy_.release()); 2411272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov } 2421272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov 2437fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetAccessTechnology(uint32_t technology) { 244721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->access_technology_ = technology; 24520c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov } 24620c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov 2477fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetRegistrationState(uint32_t state) { 248721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->registration_state_ = state; 24920c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov } 25020c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov 2516e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu void CreateService() { 2526e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu // The following constants are never directly accessed by the tests. 2536e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu const char kStorageIdentifier[] = "default_test_storage_id"; 2546e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu const char kFriendlyServiceName[] = "default_test_service_name"; 2556e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu const char kOperatorCode[] = "10010"; 2566e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu const char kOperatorName[] = "default_test_operator_name"; 2576e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu const char kOperatorCountry[] = "us"; 2586e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu 2596e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu // Simulate all the side-effects of Cellular::CreateService 2606e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu auto service = new CellularService(&modem_info_, cellular_); 2616e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu service->SetStorageIdentifier(kStorageIdentifier); 2626e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu service->SetFriendlyName(kFriendlyServiceName); 2636e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu 264ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius Stringmap serving_operator; 265ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius serving_operator[kOperatorCodeKey] = kOperatorCode; 266ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius serving_operator[kOperatorNameKey] = kOperatorName; 267ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius serving_operator[kOperatorCountryKey] = kOperatorCountry; 2686e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu 269ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service->set_serving_operator(serving_operator); 270ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius cellular_->set_home_provider(serving_operator); 2716e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu cellular_->service_ = service; 2726e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu } 2736e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu 2746e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu void SetMockMobileOperatorInfoObjects() { 2756e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu CHECK(!mock_home_provider_info_); 2766e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu CHECK(!mock_serving_operator_info_); 27770190b3ae0b63aa49e9548a71af2fc1ac80c0ea5Miao-chen Chou mock_home_provider_info_ = 27870190b3ae0b63aa49e9548a71af2fc1ac80c0ea5Miao-chen Chou new MockMobileOperatorInfo(&dispatcher_, "HomeProvider"); 27970190b3ae0b63aa49e9548a71af2fc1ac80c0ea5Miao-chen Chou mock_serving_operator_info_ = 28070190b3ae0b63aa49e9548a71af2fc1ac80c0ea5Miao-chen Chou new MockMobileOperatorInfo(&dispatcher_, "ServingOperator"); 2816e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu cellular_->set_home_provider_info(mock_home_provider_info_); 2826e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu cellular_->set_serving_operator_info(mock_serving_operator_info_); 2831272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov } 2841272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov 285b5954a249c1346e5a0da097330a3639753392ecbThieu Le void SetupCommonProxiesExpectations() { 286923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*proxy_, set_state_changed_callback(_)); 287923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_)); 288923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*network_proxy_, set_network_mode_callback(_)); 289923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*network_proxy_, set_registration_info_callback(_)); 290b5954a249c1346e5a0da097330a3639753392ecbThieu Le } 291b5954a249c1346e5a0da097330a3639753392ecbThieu Le 292b5954a249c1346e5a0da097330a3639753392ecbThieu Le void SetupCommonStartModemExpectations() { 293b5954a249c1346e5a0da097330a3639753392ecbThieu Le SetupCommonProxiesExpectations(); 294923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 295923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable)) 296923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable)); 297923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 298923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetIMEI(_, _, CellularCapability::kTimeoutDefault)) 299923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI)); 300923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 301923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetIMSI(_, _, CellularCapability::kTimeoutDefault)) 302923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI)); 303923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*network_proxy_, AccessTechnology()); 304923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, EnabledFacilityLocks()); 305923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*proxy_, 306923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetModemInfo(_, _, CellularCapability::kTimeoutDefault)) 307923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo)); 308923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*network_proxy_, 309923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault)); 310923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*network_proxy_, 311923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetSignalQuality(_, _, CellularCapability::kTimeoutDefault)); 312923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*this, TestCallback(IsSuccess())); 313923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le } 314923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 315b5954a249c1346e5a0da097330a3639753392ecbThieu Le void InitProxies() { 3163ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan AllowCreateCardProxyFromFactory(); 317b5954a249c1346e5a0da097330a3639753392ecbThieu Le capability_->InitProxies(); 318b5954a249c1346e5a0da097330a3639753392ecbThieu Le } 319b5954a249c1346e5a0da097330a3639753392ecbThieu Le 3203ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan void AllowCreateCardProxyFromFactory() { 3213ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan create_card_proxy_from_factory_ = true; 3223ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan } 3233ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan 32405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu EventDispatcherForTest dispatcher_; 325608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu TestControl control_interface_; 32627526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu MockModemInfo modem_info_; 3273ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan bool create_card_proxy_from_factory_; 328c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<MockModemProxy> proxy_; 329c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<MockModemSimpleProxy> simple_proxy_; 330c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<MockModemGSMCardProxy> card_proxy_; 331c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<MockModemGSMNetworkProxy> network_proxy_; 3322f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart CellularCapabilityGSM* capability_; // Owned by |cellular_|. 3332f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart DeviceMockAdaptor* device_adaptor_; // Owned by |cellular_|. 3343ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan CellularRefPtr cellular_; 3356e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu 3366e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu // Set when required and passed to |cellular_|. Owned by |cellular_|. 3372f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart MockMobileOperatorInfo* mock_home_provider_info_; 3382f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart MockMobileOperatorInfo* mock_serving_operator_info_; 339b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov}; 340b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 341313324136473f9120b1e485a408f51ae938dcb64Darin Petkovconst char CellularCapabilityGSMTest::kAddress[] = "1122334455"; 3421272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkovconst char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] = 3431272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov "provider_db_unittest.bfd"; 344cb547737d288052935052eeb341b30922b4022a0Darin Petkovconst char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier"; 3455de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbroodconst char CellularCapabilityGSMTest::kTestNetwork[] = "310555"; 346b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkovconst char CellularCapabilityGSMTest::kPIN[] = "9876"; 347b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkovconst char CellularCapabilityGSMTest::kPUK[] = "8765"; 348cb547737d288052935052eeb341b30922b4022a0Darin Petkovconst char CellularCapabilityGSMTest::kIMEI[] = "987654321098765"; 3490a4dfebb325f9835f6dc7419dc9bb97c5aa41965Darin Petkovconst char CellularCapabilityGSMTest::kIMSI[] = "310150123456789"; 350cb547737d288052935052eeb341b30922b4022a0Darin Petkovconst char CellularCapabilityGSMTest::kMSISDN[] = "12345678901"; 3519a24553461df7036755060423f90804011612249Eric Shienbroodconst int CellularCapabilityGSMTest::kStrength = 80; 352cb547737d288052935052eeb341b30922b4022a0Darin Petkov 353721ac93ab19a9169872a296626adb49279031af5Darin PetkovTEST_F(CellularCapabilityGSMTest, PropertyStore) { 3547ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_TRUE(cellular_->store().Contains(kSIMLockStatusProperty)); 355721ac93ab19a9169872a296626adb49279031af5Darin Petkov} 356721ac93ab19a9169872a296626adb49279031af5Darin Petkov 3575de44ab664b7cbb7619e31431e346ec8309548a6Eric ShienbroodTEST_F(CellularCapabilityGSMTest, GetIMEI) { 3589a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault)) 3599a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, 3609a24553461df7036755060423f90804011612249Eric Shienbrood &CellularCapabilityGSMTest::InvokeGetIMEI)); 3619a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 362cb547737d288052935052eeb341b30922b4022a0Darin Petkov SetCardProxy(); 3639f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu ASSERT_TRUE(cellular_->imei().empty()); 3649a24553461df7036755060423f90804011612249Eric Shienbrood capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback, 3659a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 3669f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_EQ(kIMEI, cellular_->imei()); 3675de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood} 3685de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 3695de44ab664b7cbb7619e31431e346ec8309548a6Eric ShienbroodTEST_F(CellularCapabilityGSMTest, GetIMSI) { 3706e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu SetMockMobileOperatorInfoObjects(); 3719a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault)) 3729a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, 3736e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu &CellularCapabilityGSMTest::InvokeGetIMSI)); 3746e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu EXPECT_CALL(*this, TestCallback(IsSuccess())); 3755de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood SetCardProxy(); 3769a24553461df7036755060423f90804011612249Eric Shienbrood ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback, 3779a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this)); 3789f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_TRUE(cellular_->imsi().empty()); 3799f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_FALSE(cellular_->sim_present()); 3806e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kIMSI)); 3819a24553461df7036755060423f90804011612249Eric Shienbrood capability_->GetIMSI(callback); 3829f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_EQ(kIMSI, cellular_->imsi()); 3839f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_TRUE(cellular_->sim_present()); 3845de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood} 3855de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 38682a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain// In this test, the call to the proxy's GetIMSI() will always indicate failure, 38782a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain// which will cause the retry logic to call the proxy again a number of times. 38882a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain// Eventually, the retries expire. 38982a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary MorainTEST_F(CellularCapabilityGSMTest, GetIMSIFails) { 39082a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain ScopedMockLog log; 391ef342b4400ad2338d3caf8f30ae06ba9f9fa4d77Liam McLoughlin EXPECT_CALL(log, Log(logging::LOG_INFO, 392ef342b4400ad2338d3caf8f30ae06ba9f9fa4d77Liam McLoughlin ::testing::EndsWith("cellular_capability_gsm.cc"), 39382a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain ::testing::StartsWith("GetIMSI failed - "))); 39482a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault)) 39529505ec166c72afd3dee2317795ca13f7ff94e10Arman Uguray .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 2) 39682a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain .WillRepeatedly(Invoke(this, 39782a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain &CellularCapabilityGSMTest::InvokeGetIMSIFails)); 39829505ec166c72afd3dee2317795ca13f7ff94e10Arman Uguray EXPECT_CALL(*this, TestCallback(IsFailure())).Times(2); 39982a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain SetCardProxy(); 40082a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback, 40182a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain Unretained(this)); 4029f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_TRUE(cellular_->imsi().empty()); 4039f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_FALSE(cellular_->sim_present()); 40482a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain 40529505ec166c72afd3dee2317795ca13f7ff94e10Arman Uguray capability_->sim_lock_status_.lock_type = "sim-pin"; 40629505ec166c72afd3dee2317795ca13f7ff94e10Arman Uguray capability_->GetIMSI(callback); 4079f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_TRUE(cellular_->imsi().empty()); 4089f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_TRUE(cellular_->sim_present()); 40929505ec166c72afd3dee2317795ca13f7ff94e10Arman Uguray 41029505ec166c72afd3dee2317795ca13f7ff94e10Arman Uguray capability_->sim_lock_status_.lock_type.clear(); 4119f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu cellular_->set_sim_present(false); 41282a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain capability_->get_imsi_retries_ = 0; 41382a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds, 41482a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain capability_->get_imsi_retry_delay_milliseconds_); 41582a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain 41682a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain // Set the delay to zero to speed up the test. 41782a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain capability_->get_imsi_retry_delay_milliseconds_ = 0; 41882a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain capability_->GetIMSI(callback); 41982a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) { 42082a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain dispatcher_.DispatchPendingEvents(); 42182a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain } 42282a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1, 42382a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain capability_->get_imsi_retries_); 4249f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_TRUE(cellular_->imsi().empty()); 4259f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_FALSE(cellular_->sim_present()); 42682a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain} 42782a31a0323d2f7b72045e5ee6ef25f9a7dfbc3bbGary Morain 4285de44ab664b7cbb7619e31431e346ec8309548a6Eric ShienbroodTEST_F(CellularCapabilityGSMTest, GetMSISDN) { 4299a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, GetMSISDN(_, _, 4309a24553461df7036755060423f90804011612249Eric Shienbrood CellularCapability::kTimeoutDefault)) 4319a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, 4329a24553461df7036755060423f90804011612249Eric Shienbrood &CellularCapabilityGSMTest::InvokeGetMSISDN)); 4339a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 4345de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood SetCardProxy(); 4359f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu ASSERT_TRUE(cellular_->mdn().empty()); 4369a24553461df7036755060423f90804011612249Eric Shienbrood capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback, 4379a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 4389f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_EQ(kMSISDN, cellular_->mdn()); 4395de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood} 4405de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 4415de44ab664b7cbb7619e31431e346ec8309548a6Eric ShienbroodTEST_F(CellularCapabilityGSMTest, GetSPN) { 4429a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault)) 4439a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, 4449a24553461df7036755060423f90804011612249Eric Shienbrood &CellularCapabilityGSMTest::InvokeGetSPN)); 4459a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 4465de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood SetCardProxy(); 4479a24553461df7036755060423f90804011612249Eric Shienbrood ASSERT_TRUE(capability_->spn_.empty()); 4489a24553461df7036755060423f90804011612249Eric Shienbrood capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback, 4499a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 4505de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood EXPECT_EQ(kTestCarrier, capability_->spn_); 451cb547737d288052935052eeb341b30922b4022a0Darin Petkov} 452b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 4533e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin PetkovTEST_F(CellularCapabilityGSMTest, GetSignalQuality) { 4549a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*network_proxy_, 4559a24553461df7036755060423f90804011612249Eric Shienbrood GetSignalQuality(_, _, CellularCapability::kTimeoutDefault)) 4569a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, 4579a24553461df7036755060423f90804011612249Eric Shienbrood &CellularCapabilityGSMTest::InvokeGetSignalQuality)); 4583e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin Petkov SetNetworkProxy(); 4596e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu CreateService(); 4603e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin Petkov EXPECT_EQ(0, cellular_->service()->strength()); 461721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->GetSignalQuality(); 4623e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin Petkov EXPECT_EQ(kStrength, cellular_->service()->strength()); 4633e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin Petkov} 4643e509242f1a0e2e018a5c18a8d7b9224c6044d9aDarin Petkov 465184c54e6091b21fc2a8ba40d8957ca6c84c37d6eDarin PetkovTEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) { 4669a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _, 4679a24553461df7036755060423f90804011612249Eric Shienbrood CellularCapability::kTimeoutRegister)) 4689a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister)); 4699a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 470184c54e6091b21fc2a8ba40d8957ca6c84c37d6eDarin Petkov SetNetworkProxy(); 4719a24553461df7036755060423f90804011612249Eric Shienbrood Error error; 4729a24553461df7036755060423f90804011612249Eric Shienbrood capability_->RegisterOnNetwork(kTestNetwork, &error, 4739a24553461df7036755060423f90804011612249Eric Shienbrood Bind(&CellularCapabilityGSMTest::TestCallback, 4749a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 4759f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_EQ(kTestNetwork, cellular_->selected_network()); 476184c54e6091b21fc2a8ba40d8957ca6c84c37d6eDarin Petkov} 477184c54e6091b21fc2a8ba40d8957ca6c84c37d6eDarin Petkov 478b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularCapabilityGSMTest, IsRegistered) { 479b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_FALSE(capability_->IsRegistered()); 480b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE); 481b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_FALSE(capability_->IsRegistered()); 482b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME); 483b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_TRUE(capability_->IsRegistered()); 484b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING); 485b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_FALSE(capability_->IsRegistered()); 486b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED); 487b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_FALSE(capability_->IsRegistered()); 488b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN); 489b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_FALSE(capability_->IsRegistered()); 490b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING); 491b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_TRUE(capability_->IsRegistered()); 492b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 493b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 4945de44ab664b7cbb7619e31431e346ec8309548a6Eric ShienbroodTEST_F(CellularCapabilityGSMTest, GetRegistrationState) { 4955de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood ASSERT_FALSE(capability_->IsRegistered()); 4965de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood EXPECT_CALL(*network_proxy_, 4979a24553461df7036755060423f90804011612249Eric Shienbrood GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault)) 4989a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, 4999a24553461df7036755060423f90804011612249Eric Shienbrood &CellularCapabilityGSMTest::InvokeGetRegistrationInfo)); 5005de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood SetNetworkProxy(); 5019a24553461df7036755060423f90804011612249Eric Shienbrood capability_->GetRegistrationState(); 5025de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood EXPECT_TRUE(capability_->IsRegistered()); 5035de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME, 5045de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood capability_->registration_state_); 5055de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood} 5065de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 507b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin PetkovTEST_F(CellularCapabilityGSMTest, RequirePIN) { 5089a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _, 5099a24553461df7036755060423f90804011612249Eric Shienbrood CellularCapability::kTimeoutDefault)) 5109a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN)); 5119a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 512cb547737d288052935052eeb341b30922b4022a0Darin Petkov SetCardProxy(); 5139a24553461df7036755060423f90804011612249Eric Shienbrood Error error; 5149a24553461df7036755060423f90804011612249Eric Shienbrood capability_->RequirePIN(kPIN, true, &error, 5159a24553461df7036755060423f90804011612249Eric Shienbrood Bind(&CellularCapabilityGSMTest::TestCallback, 5169a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 5179a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_TRUE(error.IsSuccess()); 518b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov} 519b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 520b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin PetkovTEST_F(CellularCapabilityGSMTest, EnterPIN) { 5219a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _, 5229a24553461df7036755060423f90804011612249Eric Shienbrood CellularCapability::kTimeoutDefault)) 5239a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN)); 5249a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 525cb547737d288052935052eeb341b30922b4022a0Darin Petkov SetCardProxy(); 5269a24553461df7036755060423f90804011612249Eric Shienbrood Error error; 5279a24553461df7036755060423f90804011612249Eric Shienbrood capability_->EnterPIN(kPIN, &error, 5289a24553461df7036755060423f90804011612249Eric Shienbrood Bind(&CellularCapabilityGSMTest::TestCallback, 5299a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 5309a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_TRUE(error.IsSuccess()); 531b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov} 532b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 533b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin PetkovTEST_F(CellularCapabilityGSMTest, UnblockPIN) { 5349a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _, 5359a24553461df7036755060423f90804011612249Eric Shienbrood CellularCapability::kTimeoutDefault)) 5369a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK)); 5379a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 538cb547737d288052935052eeb341b30922b4022a0Darin Petkov SetCardProxy(); 5399a24553461df7036755060423f90804011612249Eric Shienbrood Error error; 5409a24553461df7036755060423f90804011612249Eric Shienbrood capability_->UnblockPIN(kPUK, kPIN, &error, 5419a24553461df7036755060423f90804011612249Eric Shienbrood Bind(&CellularCapabilityGSMTest::TestCallback, 5429a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 5439a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_TRUE(error.IsSuccess()); 544b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov} 545b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 546b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin PetkovTEST_F(CellularCapabilityGSMTest, ChangePIN) { 547b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov static const char kOldPIN[] = "1111"; 5489a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _, 5499a24553461df7036755060423f90804011612249Eric Shienbrood CellularCapability::kTimeoutDefault)) 5509a24553461df7036755060423f90804011612249Eric Shienbrood .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN)); 5519a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_CALL(*this, TestCallback(IsSuccess())); 552cb547737d288052935052eeb341b30922b4022a0Darin Petkov SetCardProxy(); 5539a24553461df7036755060423f90804011612249Eric Shienbrood Error error; 5549a24553461df7036755060423f90804011612249Eric Shienbrood capability_->ChangePIN(kOldPIN, kPIN, &error, 5559a24553461df7036755060423f90804011612249Eric Shienbrood Bind(&CellularCapabilityGSMTest::TestCallback, 5569a24553461df7036755060423f90804011612249Eric Shienbrood Unretained(this))); 5579a24553461df7036755060423f90804011612249Eric Shienbrood EXPECT_TRUE(error.IsSuccess()); 558b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov} 559b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 5601272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov 5611272a43bf73f6a99f51a6cc6345183aa503cfb67Darin PetkovTEST_F(CellularCapabilityGSMTest, ParseScanResult) { 5621272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov static const char kID[] = "123"; 5631272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov static const char kLongName[] = "long name"; 5641272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov static const char kShortName[] = "short name"; 5655de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood GSMScanResult result; 5661272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1"; 5671272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result[CellularCapabilityGSM::kNetworkPropertyID] = kID; 5681272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName; 5691272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName; 5701272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3"; 5711272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result["unknown property"] = "random value"; 572721ac93ab19a9169872a296626adb49279031af5Darin Petkov Stringmap parsed = capability_->ParseScanResult(result); 5731272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov EXPECT_EQ(5, parsed.size()); 5747ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ("available", parsed[kStatusProperty]); 5757ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kID, parsed[kNetworkIdProperty]); 5767ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kLongName, parsed[kLongNameProperty]); 5777ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kShortName, parsed[kShortNameProperty]); 5787ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyEdge, parsed[kTechnologyProperty]); 5791272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov} 5801272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov 5811272a43bf73f6a99f51a6cc6345183aa503cfb67Darin PetkovTEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) { 582afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu static const char kID[] = "10001"; 583afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu const string kLongName = "TestNetworkLongName"; 584afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu // Replace the |MobileOperatorInfo| used by |ParseScanResult| by a mock. 5852f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart auto* mock_mobile_operator_info = new MockMobileOperatorInfo( 586afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu &dispatcher_, 587afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu "MockParseScanResult"); 588afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu capability_->mobile_operator_info_.reset(mock_mobile_operator_info); 589afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu 590afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu mock_mobile_operator_info->SetEmptyDefaultsForProperties(); 591afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu EXPECT_CALL(*mock_mobile_operator_info, UpdateMCCMNC(kID)); 592afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu EXPECT_CALL(*mock_mobile_operator_info, IsMobileNetworkOperatorKnown()). 593afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu WillOnce(Return(true)); 594afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu EXPECT_CALL(*mock_mobile_operator_info, operator_name()). 595afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu WillRepeatedly(ReturnRef(kLongName)); 5965de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood GSMScanResult result; 5971272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov result[CellularCapabilityGSM::kNetworkPropertyID] = kID; 598721ac93ab19a9169872a296626adb49279031af5Darin Petkov Stringmap parsed = capability_->ParseScanResult(result); 5991272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov EXPECT_EQ(2, parsed.size()); 6007ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kID, parsed[kNetworkIdProperty]); 601afe636676760df31a8db2f4b77bfd19faae52782Prathmesh Prabhu EXPECT_EQ(kLongName, parsed[kLongNameProperty]); 6021272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov} 6031272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov 604ae0c64ea644748f28b7a320e9663f30cd69e344eDarin PetkovTEST_F(CellularCapabilityGSMTest, SetAccessTechnology) { 605721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM); 606721ac93ab19a9169872a296626adb49279031af5Darin Petkov EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_); 6076e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu CreateService(); 608b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME); 609721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS); 610721ac93ab19a9169872a296626adb49279031af5Darin Petkov EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_); 6117ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyGprs, cellular_->service()->network_technology()); 612ae0c64ea644748f28b7a320e9663f30cd69e344eDarin Petkov} 613ae0c64ea644748f28b7a320e9663f30cd69e344eDarin Petkov 614f508c8273e6265599f184189a424e697598eb980Darin PetkovTEST_F(CellularCapabilityGSMTest, AllowRoaming) { 615f508c8273e6265599f184189a424e697598eb980Darin Petkov EXPECT_FALSE(cellular_->allow_roaming_); 6169f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu EXPECT_FALSE(cellular_->provider_requires_roaming()); 617f508c8273e6265599f184189a424e697598eb980Darin Petkov EXPECT_FALSE(capability_->AllowRoaming()); 6189f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu cellular_->set_provider_requires_roaming(true); 619f508c8273e6265599f184189a424e697598eb980Darin Petkov EXPECT_TRUE(capability_->AllowRoaming()); 6209f06c870229b00cdd19224cb12c4202de65772aePrathmesh Prabhu cellular_->set_provider_requires_roaming(false); 621f508c8273e6265599f184189a424e697598eb980Darin Petkov cellular_->allow_roaming_ = true; 622f508c8273e6265599f184189a424e697598eb980Darin Petkov EXPECT_TRUE(capability_->AllowRoaming()); 623f508c8273e6265599f184189a424e697598eb980Darin Petkov} 624f508c8273e6265599f184189a424e697598eb980Darin Petkov 62520c13ec645faacb9c517fd2c574aa7fa30d890d0Darin PetkovTEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) { 626721ac93ab19a9169872a296626adb49279031af5Darin Petkov EXPECT_EQ("", capability_->GetNetworkTechnologyString()); 62720c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM); 6287ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString()); 62920c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT); 6307ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString()); 63120c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS); 6327ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString()); 63320c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE); 6347ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyEdge, capability_->GetNetworkTechnologyString()); 63520c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS); 6367ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyUmts, capability_->GetNetworkTechnologyString()); 63720c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA); 6387ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString()); 63920c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA); 6407ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString()); 64120c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA); 6427ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString()); 64320c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS); 6447ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyHspaPlus, 645721ac93ab19a9169872a296626adb49279031af5Darin Petkov capability_->GetNetworkTechnologyString()); 64620c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov} 64720c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov 64820c13ec645faacb9c517fd2c574aa7fa30d890d0Darin PetkovTEST_F(CellularCapabilityGSMTest, GetRoamingStateString) { 6497ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString()); 65020c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME); 6517ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateHome, capability_->GetRoamingStateString()); 65220c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING); 6537ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateRoaming, capability_->GetRoamingStateString()); 65420c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING); 6557ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString()); 65620c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED); 6577ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString()); 65820c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE); 6597ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString()); 66020c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov} 66120c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov 66205d87e34869f44473edc1eec25d2fe1110d777a7Peter QiuTEST_F(CellularCapabilityGSMTest, OnPropertiesChanged) { 66363138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_); 66463138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_FALSE(capability_->sim_lock_status_.enabled); 66563138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_EQ("", capability_->sim_lock_status_.lock_type); 66663138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_EQ(0, capability_->sim_lock_status_.retries_left); 66705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu KeyValueStore props; 66863138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov static const char kLockType[] = "sim-pin"; 66963138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov const int kRetries = 3; 67005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu props.SetUint(CellularCapabilityGSM::kPropertyAccessTechnology, 67105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu MM_MODEM_GSM_ACCESS_TECH_EDGE); 67205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu props.SetUint(CellularCapabilityGSM::kPropertyEnabledFacilityLocks, 67305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu MM_MODEM_GSM_FACILITY_SIM); 67405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu props.SetString(CellularCapabilityGSM::kPropertyUnlockRequired, kLockType); 67505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu props.SetUint(CellularCapabilityGSM::kPropertyUnlockRetries, kRetries); 6764c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow // Call with the 'wrong' interface and nothing should change. 67705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu capability_->OnPropertiesChanged(MM_MODEM_GSM_INTERFACE, props, 67805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu vector<string>()); 6794c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_); 6804c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow EXPECT_FALSE(capability_->sim_lock_status_.enabled); 6814c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow EXPECT_EQ("", capability_->sim_lock_status_.lock_type); 6824c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow EXPECT_EQ(0, capability_->sim_lock_status_.retries_left); 6834c0724af38d0eaf7155bb789280940a41ef9f08cJason Glasgow 684baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change 685baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain // to the enabled state of the SIM lock. 686baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain KeyValueStore lock_status; 6877ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan lock_status.SetBool(kSIMLockEnabledProperty, true); 6887ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan lock_status.SetString(kSIMLockTypeProperty, ""); 6897ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan lock_status.SetUint(kSIMLockRetriesLeftProperty, 0); 690baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain 691baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged( 6927ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kSIMLockStatusProperty, 693baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain KeyValueStoreEq(lock_status))); 694baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain 69505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu capability_->OnPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props, 69605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu vector<string>()); 69763138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_); 69805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu capability_->OnPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props, 69905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu vector<string>()); 70063138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_TRUE(capability_->sim_lock_status_.enabled); 701baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty()); 702baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain EXPECT_EQ(0, capability_->sim_lock_status_.retries_left); 703baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain 704baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain // Some properties are sent on the MM_MODEM_INTERFACE. 705baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain capability_->sim_lock_status_.enabled = false; 706baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain capability_->sim_lock_status_.lock_type = ""; 707baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain capability_->sim_lock_status_.retries_left = 0; 708baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain KeyValueStore lock_status2; 7097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan lock_status2.SetBool(kSIMLockEnabledProperty, false); 7107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan lock_status2.SetString(kSIMLockTypeProperty, kLockType); 7117ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan lock_status2.SetUint(kSIMLockRetriesLeftProperty, kRetries); 712baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain EXPECT_CALL(*device_adaptor_, 7137ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitKeyValueStoreChanged(kSIMLockStatusProperty, 714baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain KeyValueStoreEq(lock_status2))); 71505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu capability_->OnPropertiesChanged(MM_MODEM_INTERFACE, props, 71605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu vector<string>()); 717baeefdf544bfcfe2895e4e15c348db3f7ce4d45bGary Morain EXPECT_FALSE(capability_->sim_lock_status_.enabled); 71863138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type); 71963138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left); 72063138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov} 72163138a9b8249fd69c83a772ee3170551a589d57aDarin Petkov 722923006bc5f3fde53ea8651de16200d7226f065a2Thieu LeTEST_F(CellularCapabilityGSMTest, StartModemSuccess) { 723923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le SetupCommonStartModemExpectations(); 724923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 725923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetSPN(_, _, CellularCapability::kTimeoutDefault)) 726923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN)); 727923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 728923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetMSISDN(_, _, CellularCapability::kTimeoutDefault)) 729923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN)); 7303ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan AllowCreateCardProxyFromFactory(); 731923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 732923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le Error error; 733923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le capability_->StartModem( 734923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this))); 735923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le dispatcher_.DispatchPendingEvents(); 736923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le} 737923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 738923006bc5f3fde53ea8651de16200d7226f065a2Thieu LeTEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) { 739923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le SetupCommonStartModemExpectations(); 740923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 741923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetSPN(_, _, CellularCapability::kTimeoutDefault)) 742923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail)); 743923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 744923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetMSISDN(_, _, CellularCapability::kTimeoutDefault)) 745923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN)); 7463ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan AllowCreateCardProxyFromFactory(); 747923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 748923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le Error error; 749923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le capability_->StartModem( 750923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this))); 751923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le dispatcher_.DispatchPendingEvents(); 752923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le} 753923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 754923006bc5f3fde53ea8651de16200d7226f065a2Thieu LeTEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) { 755923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le SetupCommonStartModemExpectations(); 756923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 757923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetSPN(_, _, CellularCapability::kTimeoutDefault)) 758923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN)); 759923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le EXPECT_CALL(*card_proxy_, 760923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le GetMSISDN(_, _, CellularCapability::kTimeoutDefault)) 761923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail)); 7623ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan AllowCreateCardProxyFromFactory(); 763923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 764923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le Error error; 765923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le capability_->StartModem( 766923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this))); 767923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le dispatcher_.DispatchPendingEvents(); 768923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le} 769923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le 770b5954a249c1346e5a0da097330a3639753392ecbThieu LeTEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) { 771b5954a249c1346e5a0da097330a3639753392ecbThieu Le // Make sure we don't crash if the connect failed and there is no 772b5954a249c1346e5a0da097330a3639753392ecbThieu Le // CellularService object. This can happen if the modem is enabled and 773b5954a249c1346e5a0da097330a3639753392ecbThieu Le // then quickly disabled. 774b5954a249c1346e5a0da097330a3639753392ecbThieu Le SetupCommonProxiesExpectations(); 775b5954a249c1346e5a0da097330a3639753392ecbThieu Le EXPECT_CALL(*simple_proxy_, 776b5954a249c1346e5a0da097330a3639753392ecbThieu Le Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect)) 777b5954a249c1346e5a0da097330a3639753392ecbThieu Le .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail)); 778b5954a249c1346e5a0da097330a3639753392ecbThieu Le EXPECT_CALL(*this, TestCallback(IsFailure())); 779b5954a249c1346e5a0da097330a3639753392ecbThieu Le InitProxies(); 780b5954a249c1346e5a0da097330a3639753392ecbThieu Le EXPECT_FALSE(capability_->cellular()->service()); 781b5954a249c1346e5a0da097330a3639753392ecbThieu Le Error error; 78205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu KeyValueStore props; 783b5954a249c1346e5a0da097330a3639753392ecbThieu Le capability_->Connect(props, &error, 784b5954a249c1346e5a0da097330a3639753392ecbThieu Le Bind(&CellularCapabilityGSMTest::TestCallback, 785b5954a249c1346e5a0da097330a3639753392ecbThieu Le Unretained(this))); 786b5954a249c1346e5a0da097330a3639753392ecbThieu Le} 787b5954a249c1346e5a0da097330a3639753392ecbThieu Le 788b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov} // namespace shill 789