blob: 64131667ac9bb7298a4e7d150d54b9ce23a9eb32 [file] [log] [blame]
Paul Stewartd8ad3c42012-01-09 12:39:38 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone3bd3c8c2011-06-13 08:20:26 -07002// 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/service.h"
6
7#include <map>
8#include <string>
9#include <vector>
10
Eric Shienbrood9a245532012-03-07 14:20:39 -050011#include <base/bind.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070012#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070013#include <dbus-c++/dbus.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070014#include <gtest/gtest.h>
15#include <gmock/gmock.h>
16
17#include "shill/dbus_adaptor.h"
18#include "shill/ethernet_service.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070019#include "shill/event_dispatcher.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070020#include "shill/manager.h"
Chris Masone95207da2011-06-29 16:50:49 -070021#include "shill/mock_adaptors.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070022#include "shill/mock_control.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070023#include "shill/mock_manager.h"
Darin Petkovba40dd32011-07-11 20:06:39 -070024#include "shill/mock_store.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070025#include "shill/property_store_unittest.h"
Chris Masone6515aab2011-10-12 16:19:09 -070026#include "shill/service_under_test.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070027
Eric Shienbrood9a245532012-03-07 14:20:39 -050028using base::Bind;
29using base::Unretained;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070030using std::map;
31using std::string;
32using std::vector;
Darin Petkovba40dd32011-07-11 20:06:39 -070033using testing::_;
34using testing::AtLeast;
Paul Stewartd8ad3c42012-01-09 12:39:38 -080035using testing::DoAll;
Darin Petkovba40dd32011-07-11 20:06:39 -070036using testing::NiceMock;
37using testing::Return;
38using testing::StrictMock;
Paul Stewartd8ad3c42012-01-09 12:39:38 -080039using testing::SetArgumentPointee;
Darin Petkovba40dd32011-07-11 20:06:39 -070040using testing::Test;
Paul Stewart9f32d192012-01-30 20:37:50 -080041using testing::Values;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070042
43namespace shill {
44
45class ServiceTest : public PropertyStoreTest {
46 public:
Chris Masoneb925cc82011-06-22 15:39:57 -070047 ServiceTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080048 : mock_manager_(control_interface(), dispatcher(), metrics(), glib()),
Chris Masone2176a882011-09-14 22:29:15 -070049 service_(new ServiceUnderTest(control_interface(),
50 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -080051 metrics(),
Paul Stewart03dba0b2011-08-22 16:32:45 -070052 &mock_manager_)),
Chris Masone9d779932011-08-25 16:33:41 -070053 storage_id_(ServiceUnderTest::kStorageId) {
54 }
Chris Masoneb925cc82011-06-22 15:39:57 -070055
Chris Masone3bd3c8c2011-06-13 08:20:26 -070056 virtual ~ServiceTest() {}
Chris Masoneb925cc82011-06-22 15:39:57 -070057
Eric Shienbrood9a245532012-03-07 14:20:39 -050058 MOCK_METHOD1(TestCallback, void(const Error &error));
59
Chris Masoneb925cc82011-06-22 15:39:57 -070060 protected:
Eric Shienbrood9a245532012-03-07 14:20:39 -050061
Paul Stewart03dba0b2011-08-22 16:32:45 -070062 MockManager mock_manager_;
63 scoped_refptr<ServiceUnderTest> service_;
Chris Masone34af2182011-08-22 11:59:36 -070064 string storage_id_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070065};
66
Darin Petkovba40dd32011-07-11 20:06:39 -070067TEST_F(ServiceTest, Constructor) {
68 EXPECT_TRUE(service_->save_credentials_);
69 EXPECT_EQ(Service::kCheckPortalAuto, service_->check_portal_);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -040070 EXPECT_EQ(Service::kStateIdle, service_->state());
Darin Petkovba40dd32011-07-11 20:06:39 -070071}
72
Chris Masonea8a2c252011-06-27 22:16:30 -070073TEST_F(ServiceTest, GetProperties) {
74 map<string, ::DBus::Variant> props;
75 Error error(Error::kInvalidProperty, "");
76 {
77 ::DBus::Error dbus_error;
78 string expected("portal_list");
mukesh agrawalde29fa82011-09-16 16:16:36 -070079 service_->mutable_store()->SetStringProperty(flimflam::kCheckPortalProperty,
80 expected,
81 &error);
Chris Masone27c4aa52011-07-02 13:10:14 -070082 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070083 ASSERT_FALSE(props.find(flimflam::kCheckPortalProperty) == props.end());
84 EXPECT_EQ(props[flimflam::kCheckPortalProperty].reader().get_string(),
85 expected);
86 }
87 {
88 ::DBus::Error dbus_error;
89 bool expected = true;
Thieu Le284fe792012-01-31 17:53:19 -080090 service_->set_favorite(true);
mukesh agrawalde29fa82011-09-16 16:16:36 -070091 service_->mutable_store()->SetBoolProperty(flimflam::kAutoConnectProperty,
92 expected,
93 &error);
Chris Masone27c4aa52011-07-02 13:10:14 -070094 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070095 ASSERT_FALSE(props.find(flimflam::kAutoConnectProperty) == props.end());
96 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
97 expected);
98 }
99 {
100 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700101 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700102 ASSERT_FALSE(props.find(flimflam::kConnectableProperty) == props.end());
103 EXPECT_EQ(props[flimflam::kConnectableProperty].reader().get_bool(), false);
104 }
105 {
106 ::DBus::Error dbus_error;
107 int32 expected = 127;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700108 service_->mutable_store()->SetInt32Property(flimflam::kPriorityProperty,
109 expected,
110 &error);
Chris Masone27c4aa52011-07-02 13:10:14 -0700111 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700112 ASSERT_FALSE(props.find(flimflam::kPriorityProperty) == props.end());
113 EXPECT_EQ(props[flimflam::kPriorityProperty].reader().get_int32(),
114 expected);
115 }
Chris Masone95207da2011-06-29 16:50:49 -0700116 {
117 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700118 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masone95207da2011-06-29 16:50:49 -0700119 ASSERT_FALSE(props.find(flimflam::kDeviceProperty) == props.end());
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400120 EXPECT_EQ(props[flimflam::kDeviceProperty].reader().get_path(),
Paul Stewart03dba0b2011-08-22 16:32:45 -0700121 string(ServiceUnderTest::kRpcId));
Chris Masone95207da2011-06-29 16:50:49 -0700122 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700123}
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700124
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800125TEST_F(ServiceTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700126 {
127 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800128 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
129 flimflam::kSaveCredentialsProperty,
130 PropertyStoreTest::kBoolV,
131 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700132 }
133 {
134 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800135 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
136 flimflam::kPriorityProperty,
137 PropertyStoreTest::kInt32V,
138 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700139 }
140 {
141 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800142 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
143 flimflam::kEAPEAPProperty,
144 PropertyStoreTest::kStringV,
145 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700146 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700147 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700148 {
149 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800150 EXPECT_FALSE(DBusAdaptor::SetProperty(service_->mutable_store(),
151 flimflam::kFavoriteProperty,
152 PropertyStoreTest::kBoolV,
153 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700154 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700155 }
Thieu Le284fe792012-01-31 17:53:19 -0800156 {
157 ::DBus::Error error;
158 service_->set_favorite(true);
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800159 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
160 flimflam::kAutoConnectProperty,
161 PropertyStoreTest::kBoolV,
162 &error));
Thieu Le284fe792012-01-31 17:53:19 -0800163 }
164 {
165 ::DBus::Error error;
166 service_->set_favorite(false);
Wade Guthrie4f28e8b2012-04-11 10:52:07 -0700167 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800168 flimflam::kAutoConnectProperty,
169 PropertyStoreTest::kBoolV,
170 &error));
Thieu Le284fe792012-01-31 17:53:19 -0800171 }
Paul Stewart0c438332012-04-11 07:55:27 -0700172 // Ensure that we can perform a trivial set of the Name property (to its
173 // current value) but an attempt to set the property to a different value
174 // fails.
175 {
176 ::DBus::Error error;
177 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
178 flimflam::kNameProperty,
179 DBusAdaptor::StringToVariant(
180 service_->friendly_name()),
181 &error));
182 }
183 {
184 ::DBus::Error error;
185 EXPECT_FALSE(DBusAdaptor::SetProperty(service_->mutable_store(),
186 flimflam::kNameProperty,
187 PropertyStoreTest::kStringV,
188 &error));
189 EXPECT_EQ(invalid_args(), error.name());
190 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700191}
192
Darin Petkovba40dd32011-07-11 20:06:39 -0700193TEST_F(ServiceTest, Load) {
194 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700195 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(true));
196 EXPECT_CALL(storage, GetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700197 .Times(AtLeast(1))
198 .WillRepeatedly(Return(true));
Chris Masone9d779932011-08-25 16:33:41 -0700199 EXPECT_TRUE(service_->Load(&storage));
Darin Petkovba40dd32011-07-11 20:06:39 -0700200}
201
202TEST_F(ServiceTest, LoadFail) {
203 StrictMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700204 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(false));
Chris Masone9d779932011-08-25 16:33:41 -0700205 EXPECT_FALSE(service_->Load(&storage));
Darin Petkovba40dd32011-07-11 20:06:39 -0700206}
207
208TEST_F(ServiceTest, SaveString) {
209 MockStore storage;
210 static const char kKey[] = "test-key";
211 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700212 EXPECT_CALL(storage, SetString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700213 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700214 service_->SaveString(&storage, storage_id_, kKey, kData, false, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700215}
216
217TEST_F(ServiceTest, SaveStringCrypted) {
218 MockStore storage;
219 static const char kKey[] = "test-key";
220 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700221 EXPECT_CALL(storage, SetCryptedString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700222 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700223 service_->SaveString(&storage, storage_id_, kKey, kData, true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700224}
225
226TEST_F(ServiceTest, SaveStringDontSave) {
227 MockStore storage;
228 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700229 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700230 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700231 service_->SaveString(&storage, storage_id_, kKey, "data", false, false);
Darin Petkovba40dd32011-07-11 20:06:39 -0700232}
233
234TEST_F(ServiceTest, SaveStringEmpty) {
235 MockStore storage;
236 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700237 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700238 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700239 service_->SaveString(&storage, storage_id_, kKey, "", true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700240}
241
242TEST_F(ServiceTest, Save) {
243 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700244 EXPECT_CALL(storage, SetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700245 .Times(AtLeast(1))
246 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700247 EXPECT_CALL(storage, DeleteKey(storage_id_, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700248 .Times(AtLeast(1))
249 .WillRepeatedly(Return(true));
Chris Masone9d779932011-08-25 16:33:41 -0700250 EXPECT_TRUE(service_->Save(&storage));
Darin Petkovba40dd32011-07-11 20:06:39 -0700251}
252
Paul Stewartd8ad3c42012-01-09 12:39:38 -0800253TEST_F(ServiceTest, Unload) {
254 NiceMock<MockStore> storage;
255 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(true));
256 static const string string_value("value");
257 EXPECT_CALL(storage, GetString(storage_id_, _, _))
258 .Times(AtLeast(1))
259 .WillRepeatedly(DoAll(SetArgumentPointee<2>(string_value), Return(true)));
260 ASSERT_TRUE(service_->Load(&storage));
261 // TODO(pstew): A single string property in the service is tested as
262 // a sentinel that properties are being set and reset at the rit times.
263 // However, since property load/store is essentially a manual process,
264 // it is error prone and should either be exhaustively unit-tested or
265 // a generic framework for registering loaded/stored properties should
266 // be created. crosbug.com/24859
267 EXPECT_EQ(string_value, service_->ui_data_);
268 service_->Unload();
269 EXPECT_EQ(string(""), service_->ui_data_);
270}
271
Paul Stewart03dba0b2011-08-22 16:32:45 -0700272TEST_F(ServiceTest, State) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400273 EXPECT_EQ(Service::kStateIdle, service_->state());
Paul Stewart03dba0b2011-08-22 16:32:45 -0700274 EXPECT_EQ(Service::kFailureUnknown, service_->failure());
275
mukesh agrawal00917ce2011-11-22 23:56:55 +0000276 ServiceRefPtr service_ref(service_);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700277
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400278 EXPECT_CALL(*dynamic_cast<ServiceMockAdaptor *>(service_->adaptor_.get()),
279 EmitStringChanged(flimflam::kStateProperty, _)).Times(5);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700280 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
281 service_->SetState(Service::kStateConnected);
282 // A second state change shouldn't cause another update
283 service_->SetState(Service::kStateConnected);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700284 EXPECT_EQ(Service::kStateConnected, service_->state());
285 EXPECT_EQ(Service::kFailureUnknown, service_->failure());
mukesh agrawal568b5c62012-02-28 14:44:47 -0800286
Paul Stewart03dba0b2011-08-22 16:32:45 -0700287 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
288 service_->SetState(Service::kStateDisconnected);
289
290 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
291 service_->SetFailure(Service::kFailureOutOfRange);
mukesh agrawal568b5c62012-02-28 14:44:47 -0800292 EXPECT_TRUE(service_->IsFailed());
293 EXPECT_GT(service_->failed_time_, 0);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700294 EXPECT_EQ(Service::kStateFailure, service_->state());
295 EXPECT_EQ(Service::kFailureOutOfRange, service_->failure());
mukesh agrawal568b5c62012-02-28 14:44:47 -0800296
297 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
298 service_->SetState(Service::kStateConnected);
299 EXPECT_FALSE(service_->IsFailed());
300 EXPECT_EQ(service_->failed_time_, 0);
301
302 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
303 service_->SetFailureSilent(Service::kFailurePinMissing);
304 EXPECT_TRUE(service_->IsFailed());
305 EXPECT_GT(service_->failed_time_, 0);
306 EXPECT_EQ(Service::kStateIdle, service_->state());
307 EXPECT_EQ(Service::kFailurePinMissing, service_->failure());
Paul Stewart03dba0b2011-08-22 16:32:45 -0700308}
309
Darin Petkovb100ae72011-08-24 16:19:45 -0700310TEST_F(ServiceTest, ActivateCellularModem) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500311 ResultCallback callback =
312 Bind(&ServiceTest::TestCallback, Unretained(this));
313 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Darin Petkovb100ae72011-08-24 16:19:45 -0700314 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500315 service_->ActivateCellularModem("Carrier", &error, callback);
316 EXPECT_TRUE(error.IsFailure());
Darin Petkovb100ae72011-08-24 16:19:45 -0700317}
318
mukesh agrawal00917ce2011-11-22 23:56:55 +0000319TEST_F(ServiceTest, MakeFavorite) {
320 EXPECT_FALSE(service_->favorite());
321 EXPECT_FALSE(service_->auto_connect());
322
323 service_->MakeFavorite();
324 EXPECT_TRUE(service_->favorite());
325 EXPECT_TRUE(service_->auto_connect());
326}
327
328TEST_F(ServiceTest, ReMakeFavorite) {
329 service_->MakeFavorite();
330 EXPECT_TRUE(service_->favorite());
331 EXPECT_TRUE(service_->auto_connect());
332
333 service_->set_auto_connect(false);
334 service_->MakeFavorite();
335 EXPECT_TRUE(service_->favorite());
336 EXPECT_FALSE(service_->auto_connect());
337}
338
mukesh agrawal76d13882012-01-12 15:23:11 -0800339TEST_F(ServiceTest, IsAutoConnectable) {
mukesh agrawalbf14e942012-03-02 14:36:34 -0800340 const char *reason;
mukesh agrawal76d13882012-01-12 15:23:11 -0800341 service_->set_connectable(true);
mukesh agrawalbf14e942012-03-02 14:36:34 -0800342 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
mukesh agrawal76d13882012-01-12 15:23:11 -0800343
mukesh agrawaladb68482012-01-17 16:31:51 -0800344 // We should not auto-connect to a Service that a user has
345 // deliberately disconnected.
346 Error error;
347 service_->Disconnect(&error);
mukesh agrawalbf14e942012-03-02 14:36:34 -0800348 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
349 EXPECT_STREQ(Service::kAutoConnExplicitDisconnect, reason);
mukesh agrawaladb68482012-01-17 16:31:51 -0800350
351 // But if the Service is reloaded, it is eligible for auto-connect
352 // again.
353 NiceMock<MockStore> storage;
354 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(true));
355 EXPECT_TRUE(service_->Load(&storage));
mukesh agrawalbf14e942012-03-02 14:36:34 -0800356 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
mukesh agrawaladb68482012-01-17 16:31:51 -0800357
358 // A deliberate Connect should also re-enable auto-connect.
359 service_->Disconnect(&error);
mukesh agrawalbf14e942012-03-02 14:36:34 -0800360 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
mukesh agrawaladb68482012-01-17 16:31:51 -0800361 service_->Connect(&error);
mukesh agrawalbf14e942012-03-02 14:36:34 -0800362 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
mukesh agrawaladb68482012-01-17 16:31:51 -0800363
364 // TODO(quiche): After we have resume handling in place, test that
365 // we re-enable auto-connect on resume. crosbug.com/25213
366
mukesh agrawal76d13882012-01-12 15:23:11 -0800367 service_->SetState(Service::kStateConnected);
mukesh agrawalbf14e942012-03-02 14:36:34 -0800368 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
369 EXPECT_STREQ(Service::kAutoConnConnected, reason);
mukesh agrawal76d13882012-01-12 15:23:11 -0800370
371 service_->SetState(Service::kStateAssociating);
mukesh agrawalbf14e942012-03-02 14:36:34 -0800372 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
373 EXPECT_STREQ(Service::kAutoConnConnecting, reason);
mukesh agrawal76d13882012-01-12 15:23:11 -0800374}
375
Paul Stewartcb59fed2012-03-21 21:14:46 -0700376TEST_F(ServiceTest, ConfigureBadProperty) {
377 KeyValueStore args;
378 args.SetString("XXXInvalid", "Value");
379 Error error;
380 service_->Configure(args, &error);
381 EXPECT_FALSE(error.IsSuccess());
382}
383
384TEST_F(ServiceTest, ConfigureBoolProperty) {
385 service_->MakeFavorite();
386 service_->set_auto_connect(false);
387 ASSERT_FALSE(service_->auto_connect());
388 KeyValueStore args;
389 args.SetBool(flimflam::kAutoConnectProperty, true);
390 Error error;
391 service_->Configure(args, &error);
392 EXPECT_TRUE(error.IsSuccess());
393 EXPECT_TRUE(service_->auto_connect());
394}
395
396TEST_F(ServiceTest, ConfigureStringProperty) {
397 const string kEAPManagement0 = "management_zero";
398 const string kEAPManagement1 = "management_one";
399 service_->SetEAPKeyManagement(kEAPManagement0);
400 ASSERT_EQ(kEAPManagement0, service_->GetEAPKeyManagement());
401 KeyValueStore args;
402 args.SetString(flimflam::kEapKeyMgmtProperty, kEAPManagement1);
403 Error error;
404 service_->Configure(args, &error);
405 EXPECT_TRUE(error.IsSuccess());
406 EXPECT_EQ(kEAPManagement1, service_->GetEAPKeyManagement());
407}
408
409TEST_F(ServiceTest, ConfigureIgnoredProperty) {
410 service_->MakeFavorite();
411 service_->set_auto_connect(false);
412 ASSERT_FALSE(service_->auto_connect());
413 KeyValueStore args;
414 args.SetBool(flimflam::kAutoConnectProperty, true);
415 Error error;
416 service_->IgnoreParameterForConfigure(flimflam::kAutoConnectProperty);
417 service_->Configure(args, &error);
418 EXPECT_TRUE(error.IsSuccess());
419 EXPECT_FALSE(service_->auto_connect());
420}
421
Paul Stewart9f32d192012-01-30 20:37:50 -0800422// Make sure a property is registered as a write only property
423// by reading and comparing all string properties returned on the store.
424// Subtle: We need to convert the test argument back and forth between
425// string and ::DBus::Variant because this is the parameter type that
426// our supeclass (PropertyStoreTest) is declared with.
427class ReadOnlyServicePropertyTest : public ServiceTest {};
428TEST_P(ReadOnlyServicePropertyTest, PropertyWriteOnly) {
429 ReadablePropertyConstIterator<string> it =
430 (service_->store()).GetStringPropertiesIter();
431 string property(GetParam().reader().get_string());
432 for( ; !it.AtEnd(); it.Advance())
433 EXPECT_NE(it.Key(), property);
434}
435
436INSTANTIATE_TEST_CASE_P(
437 ReadOnlyServicePropertyTestInstance,
438 ReadOnlyServicePropertyTest,
439 Values(
440 DBusAdaptor::StringToVariant(flimflam::kEapPrivateKeyPasswordProperty),
441 DBusAdaptor::StringToVariant(flimflam::kEapPasswordProperty)));
442
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700443} // namespace shill