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