blob: 0545162ca1f923681b1a0da22c80349ca8020444 [file] [log] [blame]
Darin Petkovac635a82012-01-10 16:51:58 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovb72cf402011-11-22 14:51:39 +01002// 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_service.h"
6
7#include <chromeos/dbus/service_constants.h>
8#include <gtest/gtest.h>
9
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050010#include "shill/cellular_capability.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040011#include "shill/cellular_capability_gsm.h"
Darin Petkovb72cf402011-11-22 14:51:39 +010012#include "shill/nice_mock_control.h"
13#include "shill/mock_adaptors.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080014#include "shill/mock_metrics.h"
Eric Shienbroodc7073302012-04-03 14:41:44 -040015#include "shill/mock_profile.h"
Darin Petkovb72cf402011-11-22 14:51:39 +010016
Darin Petkov31332412012-01-28 01:50:02 +010017using std::string;
Darin Petkov9cb02682012-01-28 00:17:38 +010018using testing::_;
Eric Shienbroodc7073302012-04-03 14:41:44 -040019using testing::InSequence;
Darin Petkovb72cf402011-11-22 14:51:39 +010020using testing::NiceMock;
21
22namespace shill {
23
24class CellularServiceTest : public testing::Test {
25 public:
26 CellularServiceTest()
Darin Petkovac635a82012-01-10 16:51:58 +010027 : device_(new Cellular(&control_,
28 NULL,
Thieu Le3426c8f2012-01-11 17:35:11 -080029 &metrics_,
Darin Petkovac635a82012-01-10 16:51:58 +010030 NULL,
31 "usb0",
Darin Petkov31332412012-01-28 01:50:02 +010032 kAddress,
Darin Petkovac635a82012-01-10 16:51:58 +010033 3,
34 Cellular::kTypeGSM,
35 "",
36 "",
37 NULL)),
Thieu Le3426c8f2012-01-11 17:35:11 -080038 service_(new CellularService(&control_, NULL, &metrics_, NULL,
39 device_)),
Darin Petkovb72cf402011-11-22 14:51:39 +010040 adaptor_(NULL) {}
41
42 virtual ~CellularServiceTest() {
43 adaptor_ = NULL;
44 }
45
46 virtual void SetUp() {
47 adaptor_ =
48 dynamic_cast<NiceMock<ServiceMockAdaptor> *>(service_->adaptor());
49 }
50
Jason Glasgow82f9ab32012-04-04 14:27:19 -040051 CellularCapabilityGSM *GetCapabilityGSM() {
52 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
53 }
54
Darin Petkovb72cf402011-11-22 14:51:39 +010055 protected:
Darin Petkov31332412012-01-28 01:50:02 +010056 static const char kAddress[];
57
Darin Petkovb72cf402011-11-22 14:51:39 +010058 NiceMockControl control_;
Thieu Le3426c8f2012-01-11 17:35:11 -080059 MockMetrics metrics_;
Darin Petkovac635a82012-01-10 16:51:58 +010060 CellularRefPtr device_;
Darin Petkovb72cf402011-11-22 14:51:39 +010061 CellularServiceRefPtr service_;
62 NiceMock<ServiceMockAdaptor> *adaptor_; // Owned by |service_|.
63};
64
Darin Petkov31332412012-01-28 01:50:02 +010065const char CellularServiceTest::kAddress[] = "000102030405";
66
Thieu Le9fdf1372012-05-14 15:20:48 -070067TEST_F(CellularServiceTest, Constructor) {
68 EXPECT_TRUE(service_->connectable());
69}
70
Darin Petkovb72cf402011-11-22 14:51:39 +010071TEST_F(CellularServiceTest, SetNetworkTechnology) {
72 EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kNetworkTechnologyProperty,
73 flimflam::kNetworkTechnologyUmts));
74 EXPECT_TRUE(service_->network_technology().empty());
75 service_->SetNetworkTechnology(flimflam::kNetworkTechnologyUmts);
76 EXPECT_EQ(flimflam::kNetworkTechnologyUmts, service_->network_technology());
77 service_->SetNetworkTechnology(flimflam::kNetworkTechnologyUmts);
78}
79
80TEST_F(CellularServiceTest, SetRoamingState) {
81 EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kRoamingStateProperty,
82 flimflam::kRoamingStateHome));
83 EXPECT_TRUE(service_->roaming_state().empty());
84 service_->SetRoamingState(flimflam::kRoamingStateHome);
85 EXPECT_EQ(flimflam::kRoamingStateHome, service_->roaming_state());
86 service_->SetRoamingState(flimflam::kRoamingStateHome);
87}
88
Darin Petkovac635a82012-01-10 16:51:58 +010089TEST_F(CellularServiceTest, FriendlyName) {
90 static const char kCarrier[] = "Cellular Carrier";
Jason Glasgow82f9ab32012-04-04 14:27:19 -040091 GetCapabilityGSM()->carrier_ = kCarrier;
Thieu Le3426c8f2012-01-11 17:35:11 -080092 service_ = new CellularService(&control_, NULL, &metrics_, NULL, device_);
Darin Petkovac635a82012-01-10 16:51:58 +010093 EXPECT_EQ(kCarrier, service_->friendly_name());
94}
95
Darin Petkov31332412012-01-28 01:50:02 +010096TEST_F(CellularServiceTest, SetStorageIdentifier) {
Darin Petkovdd3e8662012-02-03 13:16:20 +010097 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" +
98 kAddress + "_" + service_->friendly_name(),
Darin Petkov31332412012-01-28 01:50:02 +010099 service_->GetStorageIdentifier());
100 service_->SetStorageIdentifier("a b c");
101 EXPECT_EQ("a_b_c", service_->GetStorageIdentifier());
102}
103
Darin Petkov9cb02682012-01-28 00:17:38 +0100104TEST_F(CellularServiceTest, SetServingOperator) {
105 EXPECT_CALL(*adaptor_,
106 EmitStringmapChanged(flimflam::kServingOperatorProperty, _));
107 static const char kCode[] = "123456";
108 static const char kName[] = "Some Cellular Operator";
109 Cellular::Operator oper;
110 service_->SetServingOperator(oper);
111 oper.SetCode(kCode);
112 oper.SetName(kName);
113 service_->SetServingOperator(oper);
114 EXPECT_EQ(kCode, service_->serving_operator().GetCode());
115 EXPECT_EQ(kName, service_->serving_operator().GetName());
116 service_->SetServingOperator(oper);
117}
118
Darin Petkov381928f2012-02-02 23:00:12 +0100119TEST_F(CellularServiceTest, SetOLP) {
120 EXPECT_CALL(*adaptor_,
121 EmitStringmapChanged(flimflam::kPaymentPortalProperty, _));
122 static const char kURL[] = "payment.url";
123 static const char kMethod[] = "GET";
124 CellularService::OLP olp;
125 service_->SetOLP(olp);
126 olp.SetURL(kURL);
127 olp.SetMethod(kMethod);
128 service_->SetOLP(olp);
129 EXPECT_EQ(kURL, service_->olp().GetURL());
130 EXPECT_EQ(kMethod, service_->olp().GetMethod());
131 service_->SetOLP(olp);
132}
133
134TEST_F(CellularServiceTest, SetUsageURL) {
135 static const char kUsageURL[] = "usage.url";
136 EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kUsageURLProperty,
137 kUsageURL));
138 EXPECT_TRUE(service_->usage_url().empty());
139 service_->SetUsageURL(kUsageURL);
140 EXPECT_EQ(kUsageURL, service_->usage_url());
141 service_->SetUsageURL(kUsageURL);
142}
143
Eric Shienbroodc7073302012-04-03 14:41:44 -0400144TEST_F(CellularServiceTest, SetApn) {
145 static const char kApn[] = "TheAPN";
146 static const char kUsername[] = "commander.data";
147 ProfileRefPtr profile(new NiceMock<MockProfile>(
148 &control_, reinterpret_cast<Manager *>(NULL)));
149 service_->set_profile(profile);
150 Error error;
151 Stringmap testapn;
152 testapn[flimflam::kApnProperty] = kApn;
153 testapn[flimflam::kApnUsernameProperty] = kUsername;
154 {
155 InSequence seq;
156 EXPECT_CALL(*adaptor_,
157 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
158 _));
159 EXPECT_CALL(*adaptor_,
160 EmitStringmapChanged(flimflam::kCellularApnProperty, _));
161 }
162 service_->SetApn(testapn, &error);
163 EXPECT_TRUE(error.IsSuccess());
164 Stringmap resultapn = service_->GetApn(&error);
165 EXPECT_TRUE(error.IsSuccess());
166 EXPECT_EQ(2, resultapn.size());
167 Stringmap::const_iterator it = resultapn.find(flimflam::kApnProperty);
168 EXPECT_TRUE(it != resultapn.end() && it->second == kApn);
169 it = resultapn.find(flimflam::kApnUsernameProperty);
170 EXPECT_TRUE(it != resultapn.end() && it->second == kUsername);
171 EXPECT_FALSE(service_->GetUserSpecifiedApn() == NULL);
172}
173
174TEST_F(CellularServiceTest, ClearApn) {
175 static const char kApn[] = "TheAPN";
176 static const char kUsername[] = "commander.data";
177 ProfileRefPtr profile(new NiceMock<MockProfile>(
178 &control_, reinterpret_cast<Manager *>(NULL)));
179 service_->set_profile(profile);
180 Error error;
181 // Set up an APN to make sure that it later gets cleared.
182 Stringmap testapn;
183 testapn[flimflam::kApnProperty] = kApn;
184 testapn[flimflam::kApnUsernameProperty] = kUsername;
185 {
186 InSequence seq;
187 EXPECT_CALL(*adaptor_,
188 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
189 _));
190 EXPECT_CALL(*adaptor_,
191 EmitStringmapChanged(flimflam::kCellularApnProperty, _));
192 }
193 service_->SetApn(testapn, &error);
194 Stringmap resultapn = service_->GetApn(&error);
195 ASSERT_TRUE(error.IsSuccess());
196 ASSERT_EQ(2, service_->GetApn(&error).size());
197
198 Stringmap emptyapn;
199 EXPECT_CALL(*adaptor_,
200 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
201 _)).Times(0);
202 EXPECT_CALL(*adaptor_,
203 EmitStringmapChanged(flimflam::kCellularApnProperty, _)).Times(1);
204 service_->SetApn(emptyapn, &error);
205 EXPECT_TRUE(error.IsSuccess());
206 resultapn = service_->GetApn(&error);
207 EXPECT_TRUE(resultapn.empty());
208 EXPECT_TRUE(service_->GetUserSpecifiedApn() == NULL);
209}
210
211TEST_F(CellularServiceTest, LastGoodApn) {
212 static const char kApn[] = "TheAPN";
213 static const char kUsername[] = "commander.data";
214 ProfileRefPtr profile(new NiceMock<MockProfile>(
215 &control_, reinterpret_cast<Manager *>(NULL)));
216 service_->set_profile(profile);
217 Stringmap testapn;
218 testapn[flimflam::kApnProperty] = kApn;
219 testapn[flimflam::kApnUsernameProperty] = kUsername;
220 EXPECT_CALL(*adaptor_,
221 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty, _));
222 service_->SetLastGoodApn(testapn);
223 Stringmap *resultapn = service_->GetLastGoodApn();
224 EXPECT_FALSE(resultapn == NULL);
225 EXPECT_EQ(2, resultapn->size());
226 Stringmap::const_iterator it = resultapn->find(flimflam::kApnProperty);
227 EXPECT_TRUE(it != resultapn->end() && it->second == kApn);
228 it = resultapn->find(flimflam::kApnUsernameProperty);
229 EXPECT_TRUE(it != resultapn->end() && it->second == kUsername);
230 // Now set the user-specified APN, and check that LastGoodApn got
231 // cleared.
232 Stringmap userapn;
233 userapn[flimflam::kApnProperty] = kApn;
234 userapn[flimflam::kApnUsernameProperty] = kUsername;
235 {
236 InSequence seq;
237 EXPECT_CALL(*adaptor_,
238 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
239 _));
240 EXPECT_CALL(*adaptor_,
241 EmitStringmapChanged(flimflam::kCellularApnProperty, _));
242 }
243 Error error;
244 service_->SetApn(userapn, &error);
245 EXPECT_TRUE(service_->GetLastGoodApn() == NULL);
246}
247
Darin Petkovb72cf402011-11-22 14:51:39 +0100248} // namespace shill