blob: 7b4b53d2beaf11c88b3d05339bea3f66e47c6f6c [file] [log] [blame]
Chris Masone3bd3c8c2011-06-13 08:20:26 -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/service.h"
6
7#include <map>
8#include <string>
9#include <vector>
10
Chris Masone3bd3c8c2011-06-13 08:20:26 -070011#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070012#include <dbus-c++/dbus.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070013#include <gtest/gtest.h>
14#include <gmock/gmock.h>
15
16#include "shill/dbus_adaptor.h"
17#include "shill/ethernet_service.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070018#include "shill/event_dispatcher.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070019#include "shill/manager.h"
Chris Masone95207da2011-06-29 16:50:49 -070020#include "shill/mock_adaptors.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070021#include "shill/mock_control.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070022#include "shill/mock_manager.h"
Darin Petkovba40dd32011-07-11 20:06:39 -070023#include "shill/mock_store.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070024#include "shill/property_store_unittest.h"
Chris Masone6515aab2011-10-12 16:19:09 -070025#include "shill/service_under_test.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070026
27using std::map;
28using std::string;
29using std::vector;
Darin Petkovba40dd32011-07-11 20:06:39 -070030using testing::_;
31using testing::AtLeast;
32using testing::NiceMock;
33using testing::Return;
34using testing::StrictMock;
35using testing::Test;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070036
37namespace shill {
38
39class ServiceTest : public PropertyStoreTest {
40 public:
Chris Masoneb925cc82011-06-22 15:39:57 -070041 ServiceTest()
Chris Masone2176a882011-09-14 22:29:15 -070042 : mock_manager_(control_interface(), dispatcher(), glib()),
43 service_(new ServiceUnderTest(control_interface(),
44 dispatcher(),
Paul Stewart03dba0b2011-08-22 16:32:45 -070045 &mock_manager_)),
Chris Masone9d779932011-08-25 16:33:41 -070046 storage_id_(ServiceUnderTest::kStorageId) {
47 }
Chris Masoneb925cc82011-06-22 15:39:57 -070048
Chris Masone3bd3c8c2011-06-13 08:20:26 -070049 virtual ~ServiceTest() {}
Chris Masoneb925cc82011-06-22 15:39:57 -070050
51 protected:
Paul Stewart03dba0b2011-08-22 16:32:45 -070052 MockManager mock_manager_;
53 scoped_refptr<ServiceUnderTest> service_;
Chris Masone34af2182011-08-22 11:59:36 -070054 string storage_id_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070055};
56
Darin Petkovba40dd32011-07-11 20:06:39 -070057TEST_F(ServiceTest, Constructor) {
58 EXPECT_TRUE(service_->save_credentials_);
59 EXPECT_EQ(Service::kCheckPortalAuto, service_->check_portal_);
60}
61
Chris Masonea8a2c252011-06-27 22:16:30 -070062TEST_F(ServiceTest, GetProperties) {
63 map<string, ::DBus::Variant> props;
64 Error error(Error::kInvalidProperty, "");
65 {
66 ::DBus::Error dbus_error;
67 string expected("portal_list");
mukesh agrawalde29fa82011-09-16 16:16:36 -070068 service_->mutable_store()->SetStringProperty(flimflam::kCheckPortalProperty,
69 expected,
70 &error);
Chris Masone27c4aa52011-07-02 13:10:14 -070071 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070072 ASSERT_FALSE(props.find(flimflam::kCheckPortalProperty) == props.end());
73 EXPECT_EQ(props[flimflam::kCheckPortalProperty].reader().get_string(),
74 expected);
75 }
76 {
77 ::DBus::Error dbus_error;
78 bool expected = true;
mukesh agrawalde29fa82011-09-16 16:16:36 -070079 service_->mutable_store()->SetBoolProperty(flimflam::kAutoConnectProperty,
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::kAutoConnectProperty) == props.end());
84 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
85 expected);
86 }
87 {
88 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -070089 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070090 ASSERT_FALSE(props.find(flimflam::kConnectableProperty) == props.end());
91 EXPECT_EQ(props[flimflam::kConnectableProperty].reader().get_bool(), false);
92 }
93 {
94 ::DBus::Error dbus_error;
95 int32 expected = 127;
mukesh agrawalde29fa82011-09-16 16:16:36 -070096 service_->mutable_store()->SetInt32Property(flimflam::kPriorityProperty,
97 expected,
98 &error);
Chris Masone27c4aa52011-07-02 13:10:14 -070099 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 ASSERT_FALSE(props.find(flimflam::kPriorityProperty) == props.end());
101 EXPECT_EQ(props[flimflam::kPriorityProperty].reader().get_int32(),
102 expected);
103 }
Chris Masone95207da2011-06-29 16:50:49 -0700104 {
105 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700106 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masone95207da2011-06-29 16:50:49 -0700107 ASSERT_FALSE(props.find(flimflam::kDeviceProperty) == props.end());
108 EXPECT_EQ(props[flimflam::kDeviceProperty].reader().get_string(),
Paul Stewart03dba0b2011-08-22 16:32:45 -0700109 string(ServiceUnderTest::kRpcId));
Chris Masone95207da2011-06-29 16:50:49 -0700110 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700111}
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700112
Chris Masonea8a2c252011-06-27 22:16:30 -0700113TEST_F(ServiceTest, Dispatch) {
114 {
115 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700116 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700117 flimflam::kSaveCredentialsProperty,
118 PropertyStoreTest::kBoolV,
119 &error));
120 }
121 {
122 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700123 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700124 flimflam::kPriorityProperty,
125 PropertyStoreTest::kInt32V,
126 &error));
127 }
128 {
129 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700130 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700131 flimflam::kEAPEAPProperty,
132 PropertyStoreTest::kStringV,
133 &error));
134 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700135 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700136 {
137 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700138 EXPECT_FALSE(DBusAdaptor::DispatchOnType(service_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700139 flimflam::kFavoriteProperty,
140 PropertyStoreTest::kBoolV,
141 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700142 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700143 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700144}
145
Darin Petkovba40dd32011-07-11 20:06:39 -0700146TEST_F(ServiceTest, Load) {
147 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700148 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(true));
149 EXPECT_CALL(storage, GetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700150 .Times(AtLeast(1))
151 .WillRepeatedly(Return(true));
Chris Masone9d779932011-08-25 16:33:41 -0700152 EXPECT_TRUE(service_->Load(&storage));
Darin Petkovba40dd32011-07-11 20:06:39 -0700153}
154
155TEST_F(ServiceTest, LoadFail) {
156 StrictMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700157 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(false));
Chris Masone9d779932011-08-25 16:33:41 -0700158 EXPECT_FALSE(service_->Load(&storage));
Darin Petkovba40dd32011-07-11 20:06:39 -0700159}
160
161TEST_F(ServiceTest, SaveString) {
162 MockStore storage;
163 static const char kKey[] = "test-key";
164 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700165 EXPECT_CALL(storage, SetString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700166 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700167 service_->SaveString(&storage, storage_id_, kKey, kData, false, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700168}
169
170TEST_F(ServiceTest, SaveStringCrypted) {
171 MockStore storage;
172 static const char kKey[] = "test-key";
173 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700174 EXPECT_CALL(storage, SetCryptedString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700175 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700176 service_->SaveString(&storage, storage_id_, kKey, kData, true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700177}
178
179TEST_F(ServiceTest, SaveStringDontSave) {
180 MockStore storage;
181 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700182 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700183 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700184 service_->SaveString(&storage, storage_id_, kKey, "data", false, false);
Darin Petkovba40dd32011-07-11 20:06:39 -0700185}
186
187TEST_F(ServiceTest, SaveStringEmpty) {
188 MockStore storage;
189 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700190 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700191 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700192 service_->SaveString(&storage, storage_id_, kKey, "", true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700193}
194
195TEST_F(ServiceTest, Save) {
196 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700197 EXPECT_CALL(storage, SetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700198 .Times(AtLeast(1))
199 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700200 EXPECT_CALL(storage, DeleteKey(storage_id_, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700201 .Times(AtLeast(1))
202 .WillRepeatedly(Return(true));
Chris Masone9d779932011-08-25 16:33:41 -0700203 EXPECT_TRUE(service_->Save(&storage));
Darin Petkovba40dd32011-07-11 20:06:39 -0700204}
205
Paul Stewart03dba0b2011-08-22 16:32:45 -0700206TEST_F(ServiceTest, State) {
207 EXPECT_EQ(Service::kStateUnknown, service_->state());
208 EXPECT_EQ(Service::kFailureUnknown, service_->failure());
209
210 ServiceConstRefPtr service_ref(service_);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700211
212 // TODO(quiche): make this EXPECT_CALL work (crosbug.com/20154)
213 // EXPECT_CALL(*dynamic_cast<ServiceMockAdaptor *>(service_->adaptor_.get()),
214 // EmitStringChanged(flimflam::kStateProperty, _));
Paul Stewart03dba0b2011-08-22 16:32:45 -0700215 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
216 service_->SetState(Service::kStateConnected);
217 // A second state change shouldn't cause another update
218 service_->SetState(Service::kStateConnected);
219
220 EXPECT_EQ(Service::kStateConnected, service_->state());
221 EXPECT_EQ(Service::kFailureUnknown, service_->failure());
222 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
223 service_->SetState(Service::kStateDisconnected);
224
225 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
226 service_->SetFailure(Service::kFailureOutOfRange);
227
228 EXPECT_EQ(Service::kStateFailure, service_->state());
229 EXPECT_EQ(Service::kFailureOutOfRange, service_->failure());
230}
231
Darin Petkovb100ae72011-08-24 16:19:45 -0700232TEST_F(ServiceTest, ActivateCellularModem) {
233 Error error;
234 service_->ActivateCellularModem("Carrier", &error);
235 EXPECT_EQ(Error::kInvalidArguments, error.type());
236}
237
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700238} // namespace shill