blob: a3751cb6fa535894e81a0c3163389a874587046b [file] [log] [blame]
Chris Masoneb925cc82011-06-22 15:39:57 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular.h"
6
Darin Petkov0828f5f2011-08-11 10:18:52 -07007#include <sys/socket.h>
8#include <linux/if.h>
9#include <linux/netlink.h> // Needs typedefs from sys/socket.h.
10
Chris Masoneb925cc82011-06-22 15:39:57 -070011#include <chromeos/dbus/service_constants.h>
Darin Petkovbec79a22011-08-01 14:47:17 -070012#include <mm/mm-modem.h>
Darin Petkov137884a2011-10-26 18:52:47 +020013#include <mobile_provider.h>
Chris Masoneb925cc82011-06-22 15:39:57 -070014
Darin Petkov184c54e2011-11-15 12:44:39 +010015#include "shill/cellular_capability_gsm.h"
Darin Petkovd9661952011-08-03 16:25:42 -070016#include "shill/cellular_service.h"
Darin Petkov4d6d9412011-08-24 13:19:54 -070017#include "shill/error.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070018#include "shill/event_dispatcher.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070019#include "shill/mock_device_info.h"
Darin Petkov77cb6812011-08-15 16:19:41 -070020#include "shill/mock_dhcp_config.h"
21#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070022#include "shill/mock_manager.h"
Darin Petkovbec79a22011-08-01 14:47:17 -070023#include "shill/mock_modem_cdma_proxy.h"
Darin Petkov975b5e72011-08-30 11:48:08 -070024#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkova1e0a1c2011-08-25 15:08:33 -070025#include "shill/mock_modem_gsm_network_proxy.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070026#include "shill/mock_modem_proxy.h"
Darin Petkove604f702011-07-28 15:51:17 -070027#include "shill/mock_modem_simple_proxy.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070028#include "shill/mock_rtnl_handler.h"
Darin Petkov3335b372011-08-22 11:05:32 -070029#include "shill/nice_mock_control.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070030#include "shill/property_store_unittest.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070031#include "shill/proxy_factory.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070032
Darin Petkovc0865312011-09-16 15:31:20 -070033using std::map;
Chris Masoneb925cc82011-06-22 15:39:57 -070034using std::string;
Darin Petkovbec79a22011-08-01 14:47:17 -070035using testing::_;
Chris Masoneb9c00592011-10-06 13:10:39 -070036using testing::AnyNumber;
Darin Petkov0828f5f2011-08-11 10:18:52 -070037using testing::NiceMock;
Darin Petkove604f702011-07-28 15:51:17 -070038using testing::Return;
Darin Petkovbec79a22011-08-01 14:47:17 -070039using testing::SetArgumentPointee;
Chris Masoneb925cc82011-06-22 15:39:57 -070040
41namespace shill {
42
Darin Petkov0828f5f2011-08-11 10:18:52 -070043class CellularPropertyTest : public PropertyStoreTest {
44 public:
45 CellularPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070046 : device_(new Cellular(control_interface(),
Darin Petkov0828f5f2011-08-11 10:18:52 -070047 NULL,
48 NULL,
Darin Petkove9d12e02011-07-27 15:09:37 -070049 "usb0",
Chris Masone626719f2011-08-18 16:58:48 -070050 "00:01:02:03:04:05",
Darin Petkove9d12e02011-07-27 15:09:37 -070051 3,
52 Cellular::kTypeGSM,
Darin Petkov0828f5f2011-08-11 10:18:52 -070053 "",
Darin Petkov137884a2011-10-26 18:52:47 +020054 "",
55 NULL)) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -070056 virtual ~CellularPropertyTest() {}
Darin Petkove9d12e02011-07-27 15:09:37 -070057
Chris Masoneb925cc82011-06-22 15:39:57 -070058 protected:
Darin Petkov0828f5f2011-08-11 10:18:52 -070059 DeviceRefPtr device_;
Chris Masoneb925cc82011-06-22 15:39:57 -070060};
61
Darin Petkov0828f5f2011-08-11 10:18:52 -070062TEST_F(CellularPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070063 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
64 EXPECT_FALSE(device_->store().Contains(""));
Chris Masoneb925cc82011-06-22 15:39:57 -070065}
66
Darin Petkov0828f5f2011-08-11 10:18:52 -070067TEST_F(CellularPropertyTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -070068 {
69 ::DBus::Error error;
70 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070071 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070072 flimflam::kCellularAllowRoamingProperty,
73 PropertyStoreTest::kBoolV,
74 &error));
75 }
Chris Masonea8a2c252011-06-27 22:16:30 -070076 // Ensure that attempting to write a R/O property returns InvalidArgs error.
77 {
78 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070079 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070080 flimflam::kAddressProperty,
81 PropertyStoreTest::kStringV,
82 &error));
Chris Masone9d779932011-08-25 16:33:41 -070083 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -070084 }
85 {
86 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070087 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070088 flimflam::kCarrierProperty,
89 PropertyStoreTest::kStringV,
90 &error));
Chris Masone9d779932011-08-25 16:33:41 -070091 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -070092 }
93 {
94 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070095 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070096 flimflam::kPRLVersionProperty,
97 PropertyStoreTest::kInt16V,
98 &error));
Chris Masone9d779932011-08-25 16:33:41 -070099 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700101}
102
Darin Petkov0828f5f2011-08-11 10:18:52 -0700103class CellularTest : public testing::Test {
104 public:
105 CellularTest()
106 : manager_(&control_interface_, &dispatcher_, &glib_),
Chris Masone2ae797d2011-08-23 20:41:00 -0700107 device_info_(&control_interface_, &dispatcher_, &manager_),
Darin Petkov0828f5f2011-08-11 10:18:52 -0700108 proxy_(new MockModemProxy()),
109 simple_proxy_(new MockModemSimpleProxy()),
110 cdma_proxy_(new MockModemCDMAProxy()),
Darin Petkov975b5e72011-08-30 11:48:08 -0700111 gsm_card_proxy_(new MockModemGSMCardProxy()),
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700112 gsm_network_proxy_(new MockModemGSMNetworkProxy()),
Darin Petkov0828f5f2011-08-11 10:18:52 -0700113 proxy_factory_(this),
Darin Petkov77cb6812011-08-15 16:19:41 -0700114 dhcp_config_(new MockDHCPConfig(&control_interface_,
115 &dispatcher_,
116 &dhcp_provider_,
117 kTestDeviceName,
118 &glib_)),
Darin Petkov0828f5f2011-08-11 10:18:52 -0700119 device_(new Cellular(&control_interface_,
120 &dispatcher_,
121 &manager_,
Darin Petkov77cb6812011-08-15 16:19:41 -0700122 kTestDeviceName,
Chris Masone626719f2011-08-18 16:58:48 -0700123 kTestDeviceAddress,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700124 3,
125 Cellular::kTypeGSM,
126 kDBusOwner,
Darin Petkov137884a2011-10-26 18:52:47 +0200127 kDBusPath,
128 NULL)),
129 provider_db_(NULL) {}
130
131 virtual ~CellularTest() {
132 mobile_provider_close_db(provider_db_);
133 provider_db_ = NULL;
134 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700135
136 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700137 device_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700138 static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700139 device_->set_dhcp_provider(&dhcp_provider_);
Chris Masone2ae797d2011-08-23 20:41:00 -0700140 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700141 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700142 }
143
144 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700145 device_->proxy_factory_ = NULL;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700146 device_->Stop();
Darin Petkov77cb6812011-08-15 16:19:41 -0700147 device_->set_dhcp_provider(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700148 }
149
150 protected:
151 class TestProxyFactory : public ProxyFactory {
152 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700153 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700154
mukesh agrawal1830fa12011-09-26 14:31:40 -0700155 virtual ModemProxyInterface *CreateModemProxy(
Darin Petkov580c7af2011-10-24 12:32:50 +0200156 ModemProxyDelegate */*delegate*/,
mukesh agrawal1830fa12011-09-26 14:31:40 -0700157 const string &/*path*/,
158 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700159 return test_->proxy_.release();
160 }
161
162 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700163 const string &/*path*/,
164 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700165 return test_->simple_proxy_.release();
166 }
167
168 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
Darin Petkov580c7af2011-10-24 12:32:50 +0200169 ModemCDMAProxyDelegate */*delegate*/,
mukesh agrawal1830fa12011-09-26 14:31:40 -0700170 const string &/*path*/,
171 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700172 return test_->cdma_proxy_.release();
173 }
174
Darin Petkov975b5e72011-08-30 11:48:08 -0700175 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
Darin Petkov580c7af2011-10-24 12:32:50 +0200176 ModemGSMCardProxyDelegate */*delegate*/,
mukesh agrawal1830fa12011-09-26 14:31:40 -0700177 const string &/*path*/,
178 const string &/*service*/) {
Darin Petkov975b5e72011-08-30 11:48:08 -0700179 return test_->gsm_card_proxy_.release();
180 }
181
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700182 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
Darin Petkov580c7af2011-10-24 12:32:50 +0200183 ModemGSMNetworkProxyDelegate */*delegate*/,
mukesh agrawal1830fa12011-09-26 14:31:40 -0700184 const string &/*path*/,
185 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700186 return test_->gsm_network_proxy_.release();
187 }
188
Darin Petkov0828f5f2011-08-11 10:18:52 -0700189 private:
190 CellularTest *test_;
191 };
192
Darin Petkov77cb6812011-08-15 16:19:41 -0700193 static const char kTestDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700194 static const char kTestDeviceAddress[];
Darin Petkov0828f5f2011-08-11 10:18:52 -0700195 static const int kTestSocket;
196 static const char kDBusOwner[];
197 static const char kDBusPath[];
Darin Petkov51489002011-08-18 13:13:20 -0700198 static const char kTestCarrier[];
Darin Petkov975b5e72011-08-30 11:48:08 -0700199 static const char kMEID[];
200 static const char kIMEI[];
201 static const char kIMSI[];
202 static const char kMSISDN[];
Darin Petkov137884a2011-10-26 18:52:47 +0200203 static const char kTestMobileProviderDBPath[];
Darin Petkov0828f5f2011-08-11 10:18:52 -0700204
205 void StartRTNLHandler();
206 void StopRTNLHandler();
207
Darin Petkov3335b372011-08-22 11:05:32 -0700208 NiceMockControl control_interface_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700209 EventDispatcher dispatcher_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700210 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700211 MockManager manager_;
212 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700213 NiceMock<MockRTNLHandler> rtnl_handler_;
214
Darin Petkov0828f5f2011-08-11 10:18:52 -0700215 scoped_ptr<MockModemProxy> proxy_;
216 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
217 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700218 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700219 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700220 TestProxyFactory proxy_factory_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700221
222 MockDHCPProvider dhcp_provider_;
223 scoped_refptr<MockDHCPConfig> dhcp_config_;
224
Darin Petkov0828f5f2011-08-11 10:18:52 -0700225 CellularRefPtr device_;
Darin Petkov137884a2011-10-26 18:52:47 +0200226 mobile_provider_db *provider_db_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700227};
228
Darin Petkov77cb6812011-08-15 16:19:41 -0700229const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700230const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700231const char CellularTest::kDBusOwner[] = ":1.19";
232const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700233const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Darin Petkov975b5e72011-08-30 11:48:08 -0700234const char CellularTest::kMEID[] = "D1234567EF8901";
235const char CellularTest::kIMEI[] = "987654321098765";
236const char CellularTest::kIMSI[] = "123456789012345";
237const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200238const char CellularTest::kTestMobileProviderDBPath[] =
239 "provider_db_unittest.bfd";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700240
Darin Petkove9d12e02011-07-27 15:09:37 -0700241TEST_F(CellularTest, GetTypeString) {
242 EXPECT_EQ("CellularTypeGSM", device_->GetTypeString());
243 device_->type_ = Cellular::kTypeCDMA;
244 EXPECT_EQ("CellularTypeCDMA", device_->GetTypeString());
Darin Petkove9d12e02011-07-27 15:09:37 -0700245}
246
247TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700248 EXPECT_EQ("CellularStateDisabled",
249 device_->GetStateString(Cellular::kStateDisabled));
250 EXPECT_EQ("CellularStateEnabled",
251 device_->GetStateString(Cellular::kStateEnabled));
252 EXPECT_EQ("CellularStateRegistered",
253 device_->GetStateString(Cellular::kStateRegistered));
254 EXPECT_EQ("CellularStateConnected",
255 device_->GetStateString(Cellular::kStateConnected));
256 EXPECT_EQ("CellularStateLinked",
257 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700258}
259
Darin Petkovc408e692011-08-17 13:47:15 -0700260TEST_F(CellularTest, GetCDMAActivationStateString) {
Darin Petkov51489002011-08-18 13:13:20 -0700261 EXPECT_EQ(flimflam::kActivationStateActivated,
Darin Petkovc408e692011-08-17 13:47:15 -0700262 device_->GetCDMAActivationStateString(
263 MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED));
Darin Petkov51489002011-08-18 13:13:20 -0700264 EXPECT_EQ(flimflam::kActivationStateActivating,
Darin Petkovc408e692011-08-17 13:47:15 -0700265 device_->GetCDMAActivationStateString(
266 MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING));
Darin Petkov51489002011-08-18 13:13:20 -0700267 EXPECT_EQ(flimflam::kActivationStateNotActivated,
Darin Petkovc408e692011-08-17 13:47:15 -0700268 device_->GetCDMAActivationStateString(
269 MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED));
Darin Petkov51489002011-08-18 13:13:20 -0700270 EXPECT_EQ(flimflam::kActivationStatePartiallyActivated,
Darin Petkovc408e692011-08-17 13:47:15 -0700271 device_->GetCDMAActivationStateString(
272 MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED));
Darin Petkov51489002011-08-18 13:13:20 -0700273 EXPECT_EQ(flimflam::kActivationStateUnknown,
274 device_->GetCDMAActivationStateString(123));
275}
276
277TEST_F(CellularTest, GetCDMAActivationErrorString) {
278 EXPECT_EQ(flimflam::kErrorNeedEvdo,
279 device_->GetCDMAActivationErrorString(
280 MM_MODEM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE));
281 EXPECT_EQ(flimflam::kErrorNeedHomeNetwork,
282 device_->GetCDMAActivationErrorString(
283 MM_MODEM_CDMA_ACTIVATION_ERROR_ROAMING));
284 EXPECT_EQ(flimflam::kErrorOtaspFailed,
285 device_->GetCDMAActivationErrorString(
286 MM_MODEM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT));
287 EXPECT_EQ(flimflam::kErrorOtaspFailed,
288 device_->GetCDMAActivationErrorString(
289 MM_MODEM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED));
290 EXPECT_EQ(flimflam::kErrorOtaspFailed,
291 device_->GetCDMAActivationErrorString(
292 MM_MODEM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED));
293 EXPECT_EQ("",
294 device_->GetCDMAActivationErrorString(
295 MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR));
296 EXPECT_EQ(flimflam::kErrorActivationFailed,
297 device_->GetCDMAActivationErrorString(
298 MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL));
299 EXPECT_EQ(flimflam::kErrorActivationFailed,
300 device_->GetCDMAActivationErrorString(1234));
Darin Petkovc408e692011-08-17 13:47:15 -0700301}
302
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700303TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov22b72bf2011-08-29 14:01:20 -0700304 const int kStrength = 90;
Darin Petkovbac96002011-08-09 13:22:00 -0700305 device_->type_ = Cellular::kTypeCDMA;
306 EXPECT_CALL(*proxy_, Enable(true)).Times(1);
307 EXPECT_CALL(*simple_proxy_, GetStatus())
308 .WillOnce(Return(DBusPropertiesMap()));
Darin Petkov975b5e72011-08-30 11:48:08 -0700309 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Darin Petkovbac96002011-08-09 13:22:00 -0700310 EXPECT_CALL(*proxy_, GetInfo()).WillOnce(Return(ModemProxyInterface::Info()));
311 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(_, _))
312 .WillOnce(DoAll(
Darin Petkovd2045802011-08-23 11:09:25 -0700313 SetArgumentPointee<0>(MM_MODEM_CDMA_REGISTRATION_STATE_HOME),
314 SetArgumentPointee<1>(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN)));
Darin Petkov22b72bf2011-08-29 14:01:20 -0700315 EXPECT_CALL(*cdma_proxy_, GetSignalQuality()).WillOnce(Return(kStrength));
Darin Petkovbac96002011-08-09 13:22:00 -0700316 device_->Start();
Darin Petkov975b5e72011-08-30 11:48:08 -0700317 EXPECT_EQ(kMEID, device_->meid_);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700318 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700319 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700320 ASSERT_TRUE(device_->service_.get());
321 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
322 device_->service_->network_tech());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700323 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700324 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700325}
326
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700327TEST_F(CellularTest, StartGSMRegister) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700328 device_->type_ = Cellular::kTypeGSM;
Darin Petkov137884a2011-10-26 18:52:47 +0200329 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
330 ASSERT_TRUE(provider_db_);
331 device_->provider_db_ = provider_db_;
Darin Petkov22b72bf2011-08-29 14:01:20 -0700332 const int kStrength = 70;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700333 EXPECT_CALL(*proxy_, Enable(true)).Times(1);
Darin Petkov184c54e2011-11-15 12:44:39 +0100334 EXPECT_CALL(*gsm_network_proxy_, Register("")).Times(1);
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700335 EXPECT_CALL(*simple_proxy_, GetStatus())
336 .WillOnce(Return(DBusPropertiesMap()));
Darin Petkov975b5e72011-08-30 11:48:08 -0700337 EXPECT_CALL(*gsm_card_proxy_, GetIMEI()).WillOnce(Return(kIMEI));
338 EXPECT_CALL(*gsm_card_proxy_, GetIMSI()).WillOnce(Return(kIMSI));
339 EXPECT_CALL(*gsm_card_proxy_, GetSPN()).WillOnce(Return(kTestCarrier));
340 EXPECT_CALL(*gsm_card_proxy_, GetMSISDN()).WillOnce(Return(kMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700341 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
342 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700343 EXPECT_CALL(*proxy_, GetInfo()).WillOnce(Return(ModemProxyInterface::Info()));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700344 ModemGSMNetworkProxyInterface::RegistrationInfo reg_info;
Darin Petkov137884a2011-10-26 18:52:47 +0200345 static const char kNetworkID[] = "22803";
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700346 reg_info._1 = MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING;
Darin Petkov137884a2011-10-26 18:52:47 +0200347 reg_info._2 = kNetworkID;
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700348 EXPECT_CALL(*gsm_network_proxy_, GetRegistrationInfo())
349 .WillOnce(Return(reg_info));
Darin Petkov22b72bf2011-08-29 14:01:20 -0700350 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality())
351 .WillOnce(Return(kStrength));
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700352 device_->Start();
Darin Petkov975b5e72011-08-30 11:48:08 -0700353 EXPECT_EQ(kIMEI, device_->imei_);
354 EXPECT_EQ(kIMSI, device_->imsi_);
355 EXPECT_EQ(kTestCarrier, device_->gsm_.spn);
356 EXPECT_EQ(kMSISDN, device_->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700357 dispatcher_.DispatchPendingEvents();
358 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
359 ASSERT_TRUE(device_->service_.get());
360 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
361 device_->service_->network_tech());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700362 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700363 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200364 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
365 EXPECT_EQ("Orange", device_->service_->serving_operator().GetName());
366 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700367}
368
Darin Petkovbac96002011-08-09 13:22:00 -0700369TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700370 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
371 .WillOnce(Return(true));
Darin Petkovbac96002011-08-09 13:22:00 -0700372 device_->type_ = Cellular::kTypeCDMA;
373 device_->set_modem_state(Cellular::kModemStateConnected);
Darin Petkov975b5e72011-08-30 11:48:08 -0700374 device_->meid_ = kMEID;
Darin Petkovbac96002011-08-09 13:22:00 -0700375 EXPECT_CALL(*proxy_, Enable(true)).Times(1);
376 EXPECT_CALL(*simple_proxy_, GetStatus())
377 .WillOnce(Return(DBusPropertiesMap()));
378 EXPECT_CALL(*proxy_, GetInfo()).WillOnce(Return(ModemProxyInterface::Info()));
379 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(_, _))
380 .WillOnce(DoAll(
381 SetArgumentPointee<0>(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED),
382 SetArgumentPointee<1>(MM_MODEM_CDMA_REGISTRATION_STATE_HOME)));
383 EXPECT_CALL(*cdma_proxy_, GetSignalQuality()).WillOnce(Return(90));
384 device_->Start();
Darin Petkov0828f5f2011-08-11 10:18:52 -0700385 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700386 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
387}
388
Darin Petkov0828f5f2011-08-11 10:18:52 -0700389TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700390 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
391 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700392 device_->type_ = Cellular::kTypeCDMA;
393 device_->set_modem_state(Cellular::kModemStateConnected);
Darin Petkov975b5e72011-08-30 11:48:08 -0700394 device_->meid_ = kMEID;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700395 EXPECT_CALL(*proxy_, Enable(true)).Times(1);
396 EXPECT_CALL(*simple_proxy_, GetStatus())
397 .WillOnce(Return(DBusPropertiesMap()));
398 EXPECT_CALL(*proxy_, GetInfo()).WillOnce(Return(ModemProxyInterface::Info()));
399 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(_, _))
400 .WillOnce(DoAll(
401 SetArgumentPointee<0>(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED),
402 SetArgumentPointee<1>(MM_MODEM_CDMA_REGISTRATION_STATE_HOME)));
403 EXPECT_CALL(*cdma_proxy_, GetSignalQuality()).WillOnce(Return(90));
Darin Petkov77cb6812011-08-15 16:19:41 -0700404 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName))
405 .WillOnce(Return(dhcp_config_));
406 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700407 EXPECT_CALL(manager_, UpdateService(_)).Times(2);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700408 device_->Start();
409 dispatcher_.DispatchPendingEvents();
410 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700411 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
412 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700413}
414
Darin Petkovbec79a22011-08-01 14:47:17 -0700415TEST_F(CellularTest, InitProxiesCDMA) {
416 device_->type_ = Cellular::kTypeCDMA;
Darin Petkovdaf43862011-10-27 11:37:28 +0200417 device_->InitCapability();
Darin Petkovbec79a22011-08-01 14:47:17 -0700418 device_->InitProxies();
419 EXPECT_TRUE(device_->proxy_.get());
420 EXPECT_TRUE(device_->simple_proxy_.get());
Darin Petkovbec79a22011-08-01 14:47:17 -0700421}
422
423TEST_F(CellularTest, InitProxiesGSM) {
424 device_->type_ = Cellular::kTypeGSM;
Darin Petkovdaf43862011-10-27 11:37:28 +0200425 device_->InitCapability();
Darin Petkovbec79a22011-08-01 14:47:17 -0700426 device_->InitProxies();
427 EXPECT_TRUE(device_->proxy_.get());
428 EXPECT_TRUE(device_->simple_proxy_.get());
Darin Petkovbec79a22011-08-01 14:47:17 -0700429}
430
Darin Petkovceb68172011-07-29 14:47:48 -0700431TEST_F(CellularTest, GetModemStatus) {
Darin Petkov3335b372011-08-22 11:05:32 -0700432 device_->type_ = Cellular::kTypeCDMA;
Darin Petkovceb68172011-07-29 14:47:48 -0700433 DBusPropertiesMap props;
Darin Petkov51489002011-08-18 13:13:20 -0700434 props["carrier"].writer().append_string(kTestCarrier);
Darin Petkovceb68172011-07-29 14:47:48 -0700435 props["unknown-property"].writer().append_string("irrelevant-value");
436 EXPECT_CALL(*simple_proxy_, GetStatus()).WillOnce(Return(props));
437 device_->simple_proxy_.reset(simple_proxy_.release());
438 device_->state_ = Cellular::kStateEnabled;
439 device_->GetModemStatus();
Darin Petkov51489002011-08-18 13:13:20 -0700440 EXPECT_EQ(kTestCarrier, device_->carrier_);
Darin Petkov3335b372011-08-22 11:05:32 -0700441 EXPECT_EQ(kTestCarrier, device_->home_provider_.GetName());
Darin Petkovceb68172011-07-29 14:47:48 -0700442}
443
444TEST_F(CellularTest, GetModemInfo) {
445 static const char kManufacturer[] = "Company";
446 static const char kModelID[] = "Gobi 2000";
447 static const char kHWRev[] = "A00B1234";
448 ModemProxyInterface::Info info;
449 info._1 = kManufacturer;
450 info._2 = kModelID;
451 info._3 = kHWRev;
452 EXPECT_CALL(*proxy_, GetInfo()).WillOnce(Return(info));
453 device_->proxy_.reset(proxy_.release());
454 device_->GetModemInfo();
455 EXPECT_EQ(kManufacturer, device_->manufacturer_);
456 EXPECT_EQ(kModelID, device_->model_id_);
457 EXPECT_EQ(kHWRev, device_->hardware_revision_);
458}
459
Darin Petkov3335b372011-08-22 11:05:32 -0700460TEST_F(CellularTest, CreateService) {
461 device_->type_ = Cellular::kTypeCDMA;
462 static const char kPaymentURL[] = "https://payment.url";
463 static const char kUsageURL[] = "https://usage.url";
464 device_->cdma_.payment_url = kPaymentURL;
465 device_->cdma_.usage_url = kUsageURL;
466 device_->home_provider_.SetName(kTestCarrier);
467 device_->CreateService();
468 ASSERT_TRUE(device_->service_.get());
469 EXPECT_EQ(kPaymentURL, device_->service_->payment_url());
470 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
471 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Paul Stewart22aa71b2011-09-16 12:15:11 -0700472 EXPECT_TRUE(device_->service_->TechnologyIs(Technology::kCellular));
Darin Petkov3335b372011-08-22 11:05:32 -0700473}
474
Darin Petkovc5f56562011-08-06 16:40:05 -0700475namespace {
476
477MATCHER(ContainsPhoneNumber, "") {
478 return ContainsKey(arg, Cellular::kConnectPropertyPhoneNumber);
479}
480
481} // namespace {}
482
483TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700484 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700485 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700486 .Times(2)
487 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700488 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700489 device_->Connect(&error);
490 EXPECT_EQ(Error::kAlreadyConnected, error.type());
491 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700492
Darin Petkov0828f5f2011-08-11 10:18:52 -0700493 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700494 device_->Connect(&error);
495 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700496
Darin Petkovc5f56562011-08-06 16:40:05 -0700497 device_->state_ = Cellular::kStateRegistered;
Darin Petkovd2045802011-08-23 11:09:25 -0700498 device_->service_ = new CellularService(
499 &control_interface_, &dispatcher_, &manager_, device_);
500
501 device_->allow_roaming_ = false;
502 device_->service_->set_roaming_state(flimflam::kRoamingStateRoaming);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700503 device_->Connect(&error);
Darin Petkovd2045802011-08-23 11:09:25 -0700504 ASSERT_TRUE(device_->task_factory_.empty());
Darin Petkov4d6d9412011-08-24 13:19:54 -0700505 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
506 error.Populate(Error::kSuccess);
Darin Petkovd2045802011-08-23 11:09:25 -0700507
508 device_->service_->set_roaming_state(flimflam::kRoamingStateHome);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700509 device_->Connect(&error);
Darin Petkovc5f56562011-08-06 16:40:05 -0700510 ASSERT_FALSE(device_->task_factory_.empty());
Darin Petkov4d6d9412011-08-24 13:19:54 -0700511 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700512
Darin Petkovd2045802011-08-23 11:09:25 -0700513 device_->allow_roaming_ = true;
514 device_->service_->set_roaming_state(flimflam::kRoamingStateRoaming);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700515 device_->Connect(&error);
516 EXPECT_TRUE(error.IsSuccess());
Darin Petkovd2045802011-08-23 11:09:25 -0700517
Darin Petkovc5f56562011-08-06 16:40:05 -0700518 DBusPropertiesMap properties;
519 properties[Cellular::kConnectPropertyPhoneNumber].writer().append_string(
520 Cellular::kPhoneNumberGSM);
Darin Petkovd2045802011-08-23 11:09:25 -0700521 EXPECT_CALL(*simple_proxy_, Connect(ContainsPhoneNumber())).Times(2);
Darin Petkovc5f56562011-08-06 16:40:05 -0700522 device_->simple_proxy_.reset(simple_proxy_.release());
523 dispatcher_.DispatchPendingEvents();
524}
525
Darin Petkov48a511a2011-09-15 10:33:37 -0700526TEST_F(CellularTest, SetGSMAccessTechnology) {
527 device_->type_ = Cellular::kTypeGSM;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100528 device_->InitCapability();
Darin Petkov48a511a2011-09-15 10:33:37 -0700529 device_->SetGSMAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
530 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, device_->gsm_.access_technology);
531 device_->service_ = new CellularService(
532 &control_interface_, &dispatcher_, &manager_, device_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100533 dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get())->
534 registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
Darin Petkov48a511a2011-09-15 10:33:37 -0700535 device_->SetGSMAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
536 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, device_->gsm_.access_technology);
537 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
538 device_->service_->network_tech());
539}
540
Darin Petkov137884a2011-10-26 18:52:47 +0200541TEST_F(CellularTest, UpdateGSMOperatorInfo) {
542 static const char kOperatorName[] = "Swisscom";
543 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
544 ASSERT_TRUE(provider_db_);
545 device_->provider_db_ = provider_db_;
546 device_->gsm_.network_id = "22801";
547 device_->service_ = new CellularService(
548 &control_interface_, &dispatcher_, &manager_, device_);
549 device_->UpdateGSMOperatorInfo();
550 EXPECT_EQ(kOperatorName, device_->gsm_.operator_name);
551 EXPECT_EQ("ch", device_->gsm_.operator_country);
552 EXPECT_EQ(kOperatorName, device_->service_->serving_operator().GetName());
553}
554
Chris Masoneb925cc82011-06-22 15:39:57 -0700555} // namespace shill