blob: eae93901f04722d831fff2db6fd420f26dd2df22 [file] [log] [blame]
Arman Uguray72fab6a2013-01-10 19:32:42 -08001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular_capability_universal_cdma.h"
6
7#include <string>
8#include <vector>
9
10#include <base/stringprintf.h>
11#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13#include <ModemManager/ModemManager.h>
14
15#include "shill/cellular.h"
16#include "shill/cellular_service.h"
17#include "shill/event_dispatcher.h"
18#include "shill/mock_adaptors.h"
19#include "shill/mock_cellular_operator_info.h"
20#include "shill/mock_cellular_service.h"
21#include "shill/mock_dbus_properties_proxy.h"
22#include "shill/mock_glib.h"
23#include "shill/mock_manager.h"
24#include "shill/mock_metrics.h"
25#include "shill/mock_mm1_bearer_proxy.h"
26#include "shill/mock_mm1_modem_modem3gpp_proxy.h"
27#include "shill/mock_mm1_modem_modemcdma_proxy.h"
28#include "shill/mock_mm1_modem_proxy.h"
29#include "shill/mock_mm1_modem_simple_proxy.h"
30#include "shill/mock_mm1_sim_proxy.h"
31#include "shill/mock_modem_info.h"
32#include "shill/nice_mock_control.h"
33#include "shill/proxy_factory.h"
34
35using base::StringPrintf;
36using std::string;
37using std::vector;
38using testing::Invoke;
39using testing::Mock;
40using testing::NiceMock;
41using testing::Return;
42using testing::SetArgumentPointee;
43using testing::_;
44
45namespace shill {
46
47class CellularCapabilityUniversalCDMATest : public testing::Test {
48 public:
49 CellularCapabilityUniversalCDMATest()
50 : capability_(NULL),
51 device_adaptor_(NULL),
52 modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
53 bearer_proxy_(new mm1::MockBearerProxy()),
54 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
55 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
56 modem_proxy_(new mm1::MockModemProxy()),
57 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
58 sim_proxy_(new mm1::MockSimProxy()),
59 properties_proxy_(new MockDBusPropertiesProxy()),
60 proxy_factory_(this),
61 cellular_(new Cellular(&modem_info_,
62 "",
63 kMachineAddress,
64 0,
65 Cellular::kTypeUniversalCDMA,
66 "",
67 "",
68 "",
69 &proxy_factory_)),
70 service_(new MockCellularService(&modem_info_,
71 cellular_)) {}
72
73 virtual ~CellularCapabilityUniversalCDMATest() {
74 cellular_->service_ = NULL;
75 capability_ = NULL;
76 device_adaptor_ = NULL;
77 }
78
79 virtual void SetUp() {
80 capability_ = dynamic_cast<CellularCapabilityUniversalCDMA *>(
81 cellular_->capability_.get());
82 device_adaptor_ =
83 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
84 cellular_->service_ = service_;
85 }
86
87 virtual void TearDown() {
88 capability_->proxy_factory_ = NULL;
89 }
90
91 void SetService() {
92 cellular_->service_ = new CellularService(&modem_info_, cellular_);
93 }
94
95 void ReleaseCapabilityProxies() {
96 capability_->ReleaseProxies();
97 }
98
99 void SetCdmaProxy() {
100 capability_->modem_cdma_proxy_.reset(modem_cdma_proxy_.release());
101 }
102
103 void SetSimpleProxy() {
104 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
105 }
106
107 protected:
108 static const char kEsn[];
109 static const char kMachineAddress[];
110 static const char kMeid[];
111
112 class TestProxyFactory : public ProxyFactory {
113 public:
114 explicit TestProxyFactory(CellularCapabilityUniversalCDMATest *test) :
115 test_(test) {}
116
117 // TODO(armansito): Some of these methods won't be necessary after 3GPP
118 // gets refactored out of CellularCapabilityUniversal.
119 virtual mm1::BearerProxyInterface *CreateBearerProxy(
120 const std::string &path,
121 const std::string &/*service*/) {
122 return test_->bearer_proxy_.release();
123 }
124
125 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
126 const std::string &/*path*/,
127 const std::string &/*service*/) {
128 return test_->modem_3gpp_proxy_.release();
129 }
130
131 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
132 const std::string &/*path*/,
133 const std::string &/*service*/) {
134 return test_->modem_cdma_proxy_.release();
135 }
136
137 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
138 const std::string &/*path*/,
139 const std::string &/*service*/) {
140 return test_->modem_proxy_.release();
141 }
142
143 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
144 const std::string &/*path*/,
145 const std::string &/*service*/) {
146 return test_->modem_simple_proxy_.release();
147 }
148
149 virtual mm1::SimProxyInterface *CreateSimProxy(
150 const std::string &/*path*/,
151 const std::string &/*service*/) {
152 return test_->sim_proxy_.release();
153 }
154
155 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
156 const std::string &/*path*/,
157 const std::string &/*service*/) {
158 return test_->properties_proxy_.release();
159 }
160
161 private:
162 CellularCapabilityUniversalCDMATest *test_;
163 };
164
165
166 CellularCapabilityUniversalCDMA *capability_;
167 NiceMock<DeviceMockAdaptor> *device_adaptor_;
168 EventDispatcher dispatcher_;
169 MockModemInfo modem_info_;
170 MockGLib glib_;
171 scoped_ptr<mm1::MockBearerProxy> bearer_proxy_;
172 // TODO(armansito): Remove |modem_3gpp_proxy_| after refactor.
173 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
174 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
175 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
176 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
177 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
178 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
179 TestProxyFactory proxy_factory_;
180 CellularRefPtr cellular_;
181 MockCellularService *service_;
182};
183
184// static
185const char CellularCapabilityUniversalCDMATest::kEsn[] = "0000";
186// static
187const char CellularCapabilityUniversalCDMATest::kMachineAddress[] =
188 "TestMachineAddress";
189// static
190const char CellularCapabilityUniversalCDMATest::kMeid[] = "11111111111111";
191
192TEST_F(CellularCapabilityUniversalCDMATest, PropertiesChanged) {
193 // Set up mock modem CDMA properties.
194 DBusPropertiesMap modem_cdma_properties;
195 modem_cdma_properties[MM_MODEM_MODEMCDMA_PROPERTY_MEID].
196 writer().append_string(kMeid);
197 modem_cdma_properties[MM_MODEM_MODEMCDMA_PROPERTY_ESN].
198 writer().append_string(kEsn);
199
200 SetUp();
201
202 EXPECT_TRUE(capability_->meid().empty());
203 EXPECT_TRUE(capability_->esn().empty());
204
205 // Changing properties on wrong interface will not have an effect
206 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
207 modem_cdma_properties,
208 vector<string>());
209 EXPECT_TRUE(capability_->meid().empty());
210 EXPECT_TRUE(capability_->esn().empty());
211
212 // Changing properties on the right interface gets reflected in the
213 // capabilities object
214 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEMCDMA,
215 modem_cdma_properties,
216 vector<string>());
217 EXPECT_EQ(kMeid, capability_->meid());
218 EXPECT_EQ(kEsn, capability_->esn());
219}
220
221TEST_F(CellularCapabilityUniversalCDMATest, OnCDMARegistrationChanged) {
222 EXPECT_EQ(0, capability_->sid_);
223 EXPECT_EQ(0, capability_->nid_);
224 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
225 capability_->cdma_1x_registration_state_);
226 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
227 capability_->cdma_evdo_registration_state_);
228
229 EXPECT_EQ("", capability_->provider_.GetCode());
230 EXPECT_EQ("", capability_->provider_.GetName());
231 EXPECT_EQ("", capability_->provider_.GetCountry());
232
233 CellularOperatorInfo::CellularOperator *provider =
234 new CellularOperatorInfo::CellularOperator();
235
236 provider->country_ = "us";
237 provider->is_primary_ = true;
238 provider->name_list_.push_back(
239 CellularOperatorInfo::LocalizedName("Test", ""));
240
241 scoped_ptr<const CellularOperatorInfo::CellularOperator> ptr(provider);
242
243 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
244 GetCellularOperatorBySID("2"))
245 .WillOnce(Return(ptr.get()));
246
247 capability_->OnCDMARegistrationChanged(
248 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
249 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
250 2,
251 0);
252 EXPECT_EQ(2, capability_->sid_);
253 EXPECT_EQ(0, capability_->nid_);
254 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
255 capability_->cdma_1x_registration_state_);
256 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
257 capability_->cdma_evdo_registration_state_);
258
259 EXPECT_TRUE(capability_->IsRegistered());
260 EXPECT_EQ("2", capability_->provider_.GetCode());
261 EXPECT_EQ("Test", capability_->provider_.GetName());
262 EXPECT_EQ("us", capability_->provider_.GetCountry());
263}
264
265TEST_F(CellularCapabilityUniversalCDMATest, UpdateOperatorInfo) {
266 EXPECT_EQ("", capability_->provider_.GetCode());
267 EXPECT_EQ("", capability_->provider_.GetName());
268 EXPECT_EQ("", capability_->provider_.GetCountry());
269
270 capability_->UpdateOperatorInfo();
271 EXPECT_EQ("", capability_->provider_.GetCode());
272 EXPECT_EQ("", capability_->provider_.GetName());
273 EXPECT_EQ("", capability_->provider_.GetCountry());
274
275
276 capability_->UpdateOperatorInfo();
277 EXPECT_EQ("", capability_->provider_.GetCode());
278 EXPECT_EQ("", capability_->provider_.GetName());
279 EXPECT_EQ("", capability_->provider_.GetCountry());
280
281 capability_->sid_ = 1;
282 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
283 GetCellularOperatorBySID(_))
284 .WillOnce(Return((const CellularOperatorInfo::CellularOperator *)NULL));
285
286 capability_->UpdateOperatorInfo();
287 EXPECT_EQ("", capability_->provider_.GetCode());
288 EXPECT_EQ("", capability_->provider_.GetName());
289 EXPECT_EQ("", capability_->provider_.GetCountry());
290
291 CellularOperatorInfo::CellularOperator *provider =
292 new CellularOperatorInfo::CellularOperator();
293
294 provider->country_ = "us";
295 provider->is_primary_ = true;
296 provider->name_list_.push_back(
297 CellularOperatorInfo::LocalizedName("Test", ""));
298
299 scoped_ptr<const CellularOperatorInfo::CellularOperator> ptr(provider);
300
301 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
302 GetCellularOperatorBySID(_))
303 .WillOnce(Return(ptr.get()));
304
305 capability_->UpdateOperatorInfo();
306
307 EXPECT_EQ("1", capability_->provider_.GetCode());
308 EXPECT_EQ("Test", capability_->provider_.GetName());
309 EXPECT_EQ("us", capability_->provider_.GetCountry());
310}
311
312TEST_F(CellularCapabilityUniversalCDMATest, CreateFriendlyServiceName) {
313 CellularCapabilityUniversalCDMA::friendly_service_name_id_cdma_ = 0;
314 EXPECT_EQ(0, capability_->sid_);
315 EXPECT_EQ("CDMANetwork0", capability_->CreateFriendlyServiceName());
316 EXPECT_EQ("CDMANetwork1", capability_->CreateFriendlyServiceName());
317
318 capability_->provider_.SetCode("0123");
319 EXPECT_EQ("cellular_sid_0123", capability_->CreateFriendlyServiceName());
320
321 CellularOperatorInfo::CellularOperator *provider =
322 new CellularOperatorInfo::CellularOperator();
323
324 capability_->sid_ = 1;
325 provider->name_list_.push_back(
326 CellularOperatorInfo::LocalizedName("Test", ""));
327 capability_->provider_.SetCode("");
328
329 scoped_ptr<const CellularOperatorInfo::CellularOperator> ptr(provider);
330
331 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
332 GetCellularOperatorBySID(_))
333 .WillOnce(Return(ptr.get()));
334 EXPECT_EQ("Test", capability_->CreateFriendlyServiceName());
335}
336
337TEST_F(CellularCapabilityUniversalCDMATest, UpdateOLP) {
338 CellularService::OLP test_olp;
339 test_olp.SetURL("http://testurl");
340 test_olp.SetMethod("POST");
341 test_olp.SetPostData("esn=${esn}&mdn=${mdn}&meid=${meid}");
342
343 capability_->esn_ = "0";
344 capability_->mdn_ = "3";
345 capability_->meid_= "4";
346 capability_->sid_ = 1;
347
348 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
349 GetOLPBySID(base::StringPrintf("%u", capability_->sid_)))
350 .WillRepeatedly(Return(&test_olp));
351
352 SetService();
353 capability_->UpdateOLP();
354 const CellularService::OLP &olp = cellular_->service()->olp();
355 EXPECT_EQ("http://testurl", olp.GetURL());
356 EXPECT_EQ("POST", olp.GetMethod());
357 EXPECT_EQ("esn=0&mdn=3&meid=4", olp.GetPostData());
358}
359
360} // namespace shill