blob: 7d7d4fbd825ba94d393c2a0aa721db0344a679b3 [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
11#include <dbus-c++/dbus.h>
12#include <chromeos/dbus/service_constants.h>
13#include <gtest/gtest.h>
14#include <gmock/gmock.h>
15
16#include "shill/dbus_adaptor.h"
17#include "shill/ethernet_service.h"
18#include "shill/manager.h"
Chris Masone95207da2011-06-29 16:50:49 -070019#include "shill/mock_adaptors.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070020#include "shill/mock_control.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070021#include "shill/mock_manager.h"
Darin Petkovba40dd32011-07-11 20:06:39 -070022#include "shill/mock_store.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070023#include "shill/property_store_unittest.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070024#include "shill/service.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070025#include "shill/shill_event.h"
26
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
Paul Stewart03dba0b2011-08-22 16:32:45 -070039// This is a simple Service subclass with all the pure-virutal methods stubbed
40class ServiceUnderTest : public Service {
41 public:
42 static const char kRpcId[];
43 static const char kStorageId[];
44
45 ServiceUnderTest(ControlInterface *control_interface,
46 EventDispatcher *dispatcher,
47 Manager *manager)
48 : Service(control_interface, dispatcher, manager) {}
49 virtual ~ServiceUnderTest() {}
50
51 virtual void Connect(Error *error) {}
52 virtual void Disconnect() {}
53 virtual string CalculateState() { return ""; }
54 virtual string GetRpcIdentifier() const { return ServiceMockAdaptor::kRpcId; }
55 virtual string GetDeviceRpcId() { return kRpcId; }
56 virtual string GetStorageIdentifier(const string &mac) { return kStorageId; }
57
58 private:
59 DISALLOW_COPY_AND_ASSIGN(ServiceUnderTest);
60};
61
62const char ServiceUnderTest::kRpcId[] = "mock-device-rpc";
63const char ServiceUnderTest::kStorageId[] = "service";
64
Chris Masone3bd3c8c2011-06-13 08:20:26 -070065class ServiceTest : public PropertyStoreTest {
66 public:
Chris Masoneb925cc82011-06-22 15:39:57 -070067 ServiceTest()
Paul Stewart03dba0b2011-08-22 16:32:45 -070068 : mock_manager_(&control_interface_, &dispatcher_, &glib_),
69 service_(new ServiceUnderTest(&control_interface_,
70 &dispatcher_,
71 &mock_manager_)),
72 storage_id_(ServiceUnderTest::kStorageId) {}
Chris Masoneb925cc82011-06-22 15:39:57 -070073
Chris Masone3bd3c8c2011-06-13 08:20:26 -070074 virtual ~ServiceTest() {}
Chris Masoneb925cc82011-06-22 15:39:57 -070075
76 protected:
Paul Stewart03dba0b2011-08-22 16:32:45 -070077 MockManager mock_manager_;
78 scoped_refptr<ServiceUnderTest> service_;
Chris Masone34af2182011-08-22 11:59:36 -070079 string storage_id_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070080};
81
Darin Petkovba40dd32011-07-11 20:06:39 -070082TEST_F(ServiceTest, Constructor) {
83 EXPECT_TRUE(service_->save_credentials_);
84 EXPECT_EQ(Service::kCheckPortalAuto, service_->check_portal_);
85}
86
Chris Masonea8a2c252011-06-27 22:16:30 -070087TEST_F(ServiceTest, GetProperties) {
88 map<string, ::DBus::Variant> props;
89 Error error(Error::kInvalidProperty, "");
90 {
91 ::DBus::Error dbus_error;
92 string expected("portal_list");
Chris Masone27c4aa52011-07-02 13:10:14 -070093 service_->store()->SetStringProperty(flimflam::kCheckPortalProperty,
94 expected,
95 &error);
96 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070097 ASSERT_FALSE(props.find(flimflam::kCheckPortalProperty) == props.end());
98 EXPECT_EQ(props[flimflam::kCheckPortalProperty].reader().get_string(),
99 expected);
100 }
101 {
102 ::DBus::Error dbus_error;
103 bool expected = true;
Chris Masone27c4aa52011-07-02 13:10:14 -0700104 service_->store()->SetBoolProperty(flimflam::kAutoConnectProperty,
105 expected,
106 &error);
107 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 ASSERT_FALSE(props.find(flimflam::kAutoConnectProperty) == props.end());
109 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
110 expected);
111 }
112 {
113 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700114 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700115 ASSERT_FALSE(props.find(flimflam::kConnectableProperty) == props.end());
116 EXPECT_EQ(props[flimflam::kConnectableProperty].reader().get_bool(), false);
117 }
118 {
119 ::DBus::Error dbus_error;
120 int32 expected = 127;
Chris Masone27c4aa52011-07-02 13:10:14 -0700121 service_->store()->SetInt32Property(flimflam::kPriorityProperty,
122 expected,
123 &error);
124 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700125 ASSERT_FALSE(props.find(flimflam::kPriorityProperty) == props.end());
126 EXPECT_EQ(props[flimflam::kPriorityProperty].reader().get_int32(),
127 expected);
128 }
Chris Masone95207da2011-06-29 16:50:49 -0700129 {
130 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700131 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masone95207da2011-06-29 16:50:49 -0700132 ASSERT_FALSE(props.find(flimflam::kDeviceProperty) == props.end());
133 EXPECT_EQ(props[flimflam::kDeviceProperty].reader().get_string(),
Paul Stewart03dba0b2011-08-22 16:32:45 -0700134 string(ServiceUnderTest::kRpcId));
Chris Masone95207da2011-06-29 16:50:49 -0700135 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700136}
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700137
Chris Masonea8a2c252011-06-27 22:16:30 -0700138TEST_F(ServiceTest, Dispatch) {
139 {
140 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700141 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700142 flimflam::kSaveCredentialsProperty,
143 PropertyStoreTest::kBoolV,
144 &error));
145 }
146 {
147 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700148 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700149 flimflam::kPriorityProperty,
150 PropertyStoreTest::kInt32V,
151 &error));
152 }
153 {
154 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700155 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700156 flimflam::kEAPEAPProperty,
157 PropertyStoreTest::kStringV,
158 &error));
159 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700160 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700161 {
162 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700163 EXPECT_FALSE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700164 flimflam::kFavoriteProperty,
165 PropertyStoreTest::kBoolV,
166 &error));
167 EXPECT_EQ(invalid_args_, error.name());
168 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700169}
170
Darin Petkovba40dd32011-07-11 20:06:39 -0700171TEST_F(ServiceTest, Load) {
172 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700173 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(true));
174 EXPECT_CALL(storage, GetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700175 .Times(AtLeast(1))
176 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700177 EXPECT_TRUE(service_->Load(&storage, ""));
Darin Petkovba40dd32011-07-11 20:06:39 -0700178}
179
180TEST_F(ServiceTest, LoadFail) {
181 StrictMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700182 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(false));
183 EXPECT_FALSE(service_->Load(&storage, ""));
Darin Petkovba40dd32011-07-11 20:06:39 -0700184}
185
186TEST_F(ServiceTest, SaveString) {
187 MockStore storage;
188 static const char kKey[] = "test-key";
189 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700190 EXPECT_CALL(storage, SetString(storage_id_, kKey, kData))
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, kData, false, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700193}
194
195TEST_F(ServiceTest, SaveStringCrypted) {
196 MockStore storage;
197 static const char kKey[] = "test-key";
198 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700199 EXPECT_CALL(storage, SetCryptedString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700200 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700201 service_->SaveString(&storage, storage_id_, kKey, kData, true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700202}
203
204TEST_F(ServiceTest, SaveStringDontSave) {
205 MockStore storage;
206 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700207 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700208 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700209 service_->SaveString(&storage, storage_id_, kKey, "data", false, false);
Darin Petkovba40dd32011-07-11 20:06:39 -0700210}
211
212TEST_F(ServiceTest, SaveStringEmpty) {
213 MockStore storage;
214 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700215 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700216 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700217 service_->SaveString(&storage, storage_id_, kKey, "", true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700218}
219
220TEST_F(ServiceTest, Save) {
221 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700222 EXPECT_CALL(storage, SetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700223 .Times(AtLeast(1))
224 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700225 EXPECT_CALL(storage, DeleteKey(storage_id_, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700226 .Times(AtLeast(1))
227 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700228 EXPECT_TRUE(service_->Save(&storage, ""));
Darin Petkovba40dd32011-07-11 20:06:39 -0700229}
230
Paul Stewart03dba0b2011-08-22 16:32:45 -0700231TEST_F(ServiceTest, State) {
232 EXPECT_EQ(Service::kStateUnknown, service_->state());
233 EXPECT_EQ(Service::kFailureUnknown, service_->failure());
234
235 ServiceConstRefPtr service_ref(service_);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700236
237 // TODO(quiche): make this EXPECT_CALL work (crosbug.com/20154)
238 // EXPECT_CALL(*dynamic_cast<ServiceMockAdaptor *>(service_->adaptor_.get()),
239 // EmitStringChanged(flimflam::kStateProperty, _));
Paul Stewart03dba0b2011-08-22 16:32:45 -0700240 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
241 service_->SetState(Service::kStateConnected);
242 // A second state change shouldn't cause another update
243 service_->SetState(Service::kStateConnected);
244
245 EXPECT_EQ(Service::kStateConnected, service_->state());
246 EXPECT_EQ(Service::kFailureUnknown, service_->failure());
247 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
248 service_->SetState(Service::kStateDisconnected);
249
250 EXPECT_CALL(mock_manager_, UpdateService(service_ref));
251 service_->SetFailure(Service::kFailureOutOfRange);
252
253 EXPECT_EQ(Service::kStateFailure, service_->state());
254 EXPECT_EQ(Service::kFailureOutOfRange, service_->failure());
255}
256
Darin Petkovb100ae72011-08-24 16:19:45 -0700257TEST_F(ServiceTest, ActivateCellularModem) {
258 Error error;
259 service_->ActivateCellularModem("Carrier", &error);
260 EXPECT_EQ(Error::kInvalidArguments, error.type());
261}
262
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700263} // namespace shill