blob: 9db2d9e7c8dbef4a1cf55bdf4d50608e84cf7b78 [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"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070021#include "shill/mock_service.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"
24#include "shill/shill_event.h"
25
26using std::map;
27using std::string;
28using std::vector;
Darin Petkovba40dd32011-07-11 20:06:39 -070029using testing::_;
30using testing::AtLeast;
31using testing::NiceMock;
32using testing::Return;
33using testing::StrictMock;
34using testing::Test;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070035
36namespace shill {
37
38class ServiceTest : public PropertyStoreTest {
39 public:
Chris Masone95207da2011-06-29 16:50:49 -070040 static const char kMockDeviceRpcId[];
Chris Masone7aa5f902011-07-11 11:13:35 -070041 static const char kProfileName[];
Chris Masone95207da2011-06-29 16:50:49 -070042
Chris Masoneb925cc82011-06-22 15:39:57 -070043 ServiceTest()
44 : service_(new MockService(&control_interface_,
45 &dispatcher_,
mukesh agrawal51a7e932011-07-27 16:18:26 -070046 &manager_)),
47 service_name_(service_->UniqueName()) {
Chris Masoneb925cc82011-06-22 15:39:57 -070048 }
49
Chris Masone3bd3c8c2011-06-13 08:20:26 -070050 virtual ~ServiceTest() {}
Chris Masoneb925cc82011-06-22 15:39:57 -070051
52 protected:
Chris Masone95207da2011-06-29 16:50:49 -070053 scoped_refptr<MockService> service_;
mukesh agrawal51a7e932011-07-27 16:18:26 -070054 string service_name_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070055};
56
Chris Masone95207da2011-06-29 16:50:49 -070057const char ServiceTest::kMockDeviceRpcId[] = "mock-device-rpc";
58
Chris Masone7aa5f902011-07-11 11:13:35 -070059const char ServiceTest::kProfileName[] = "profile";
60
Darin Petkovba40dd32011-07-11 20:06:39 -070061TEST_F(ServiceTest, Constructor) {
62 EXPECT_TRUE(service_->save_credentials_);
63 EXPECT_EQ(Service::kCheckPortalAuto, service_->check_portal_);
64}
65
Chris Masonea8a2c252011-06-27 22:16:30 -070066TEST_F(ServiceTest, GetProperties) {
Chris Masone95207da2011-06-29 16:50:49 -070067 EXPECT_CALL(*service_.get(), CalculateState()).WillRepeatedly(Return(""));
68 EXPECT_CALL(*service_.get(), GetDeviceRpcId())
69 .WillRepeatedly(Return(ServiceTest::kMockDeviceRpcId));
Chris Masonea8a2c252011-06-27 22:16:30 -070070 map<string, ::DBus::Variant> props;
71 Error error(Error::kInvalidProperty, "");
72 {
73 ::DBus::Error dbus_error;
74 string expected("portal_list");
Chris Masone27c4aa52011-07-02 13:10:14 -070075 service_->store()->SetStringProperty(flimflam::kCheckPortalProperty,
76 expected,
77 &error);
78 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070079 ASSERT_FALSE(props.find(flimflam::kCheckPortalProperty) == props.end());
80 EXPECT_EQ(props[flimflam::kCheckPortalProperty].reader().get_string(),
81 expected);
82 }
83 {
84 ::DBus::Error dbus_error;
85 bool expected = true;
Chris Masone27c4aa52011-07-02 13:10:14 -070086 service_->store()->SetBoolProperty(flimflam::kAutoConnectProperty,
87 expected,
88 &error);
89 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070090 ASSERT_FALSE(props.find(flimflam::kAutoConnectProperty) == props.end());
91 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
92 expected);
93 }
94 {
95 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -070096 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070097 ASSERT_FALSE(props.find(flimflam::kConnectableProperty) == props.end());
98 EXPECT_EQ(props[flimflam::kConnectableProperty].reader().get_bool(), false);
99 }
100 {
101 ::DBus::Error dbus_error;
102 int32 expected = 127;
Chris Masone27c4aa52011-07-02 13:10:14 -0700103 service_->store()->SetInt32Property(flimflam::kPriorityProperty,
104 expected,
105 &error);
106 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700107 ASSERT_FALSE(props.find(flimflam::kPriorityProperty) == props.end());
108 EXPECT_EQ(props[flimflam::kPriorityProperty].reader().get_int32(),
109 expected);
110 }
Chris Masone95207da2011-06-29 16:50:49 -0700111 {
112 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700113 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masone95207da2011-06-29 16:50:49 -0700114 ASSERT_FALSE(props.find(flimflam::kDeviceProperty) == props.end());
115 EXPECT_EQ(props[flimflam::kDeviceProperty].reader().get_string(),
116 string(ServiceTest::kMockDeviceRpcId));
117 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700118}
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700119
Chris Masonea8a2c252011-06-27 22:16:30 -0700120TEST_F(ServiceTest, Dispatch) {
121 {
122 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700123 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700124 flimflam::kSaveCredentialsProperty,
125 PropertyStoreTest::kBoolV,
126 &error));
127 }
128 {
129 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700130 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700131 flimflam::kPriorityProperty,
132 PropertyStoreTest::kInt32V,
133 &error));
134 }
135 {
136 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700137 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700138 flimflam::kEAPEAPProperty,
139 PropertyStoreTest::kStringV,
140 &error));
141 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700142 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700143 {
144 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700145 EXPECT_FALSE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700146 flimflam::kFavoriteProperty,
147 PropertyStoreTest::kBoolV,
148 &error));
149 EXPECT_EQ(invalid_args_, error.name());
150 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700151}
152
Darin Petkovba40dd32011-07-11 20:06:39 -0700153TEST_F(ServiceTest, GetStorageIdentifier) {
mukesh agrawal51a7e932011-07-27 16:18:26 -0700154 EXPECT_EQ(service_name_, service_->GetStorageIdentifier());
Darin Petkovba40dd32011-07-11 20:06:39 -0700155}
156
157TEST_F(ServiceTest, Load) {
158 NiceMock<MockStore> storage;
mukesh agrawal51a7e932011-07-27 16:18:26 -0700159 const string id = service_name_;
Darin Petkovba40dd32011-07-11 20:06:39 -0700160 EXPECT_CALL(storage, ContainsGroup(id)).WillOnce(Return(true));
161 EXPECT_CALL(storage, GetString(id, _, _))
162 .Times(AtLeast(1))
163 .WillRepeatedly(Return(true));
164 EXPECT_TRUE(service_->Load(&storage));
165}
166
167TEST_F(ServiceTest, LoadFail) {
168 StrictMock<MockStore> storage;
mukesh agrawal51a7e932011-07-27 16:18:26 -0700169 EXPECT_CALL(storage, ContainsGroup(service_name_)).WillOnce(Return(false));
Darin Petkovba40dd32011-07-11 20:06:39 -0700170 EXPECT_FALSE(service_->Load(&storage));
171}
172
173TEST_F(ServiceTest, SaveString) {
174 MockStore storage;
175 static const char kKey[] = "test-key";
176 static const char kData[] = "test-data";
mukesh agrawal51a7e932011-07-27 16:18:26 -0700177 EXPECT_CALL(storage, SetString(service_name_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700178 .WillOnce(Return(true));
179 service_->SaveString(&storage, kKey, kData, false, true);
180}
181
182TEST_F(ServiceTest, SaveStringCrypted) {
183 MockStore storage;
184 static const char kKey[] = "test-key";
185 static const char kData[] = "test-data";
mukesh agrawal51a7e932011-07-27 16:18:26 -0700186 EXPECT_CALL(storage, SetCryptedString(service_name_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700187 .WillOnce(Return(true));
188 service_->SaveString(&storage, kKey, kData, true, true);
189}
190
191TEST_F(ServiceTest, SaveStringDontSave) {
192 MockStore storage;
193 static const char kKey[] = "test-key";
mukesh agrawal51a7e932011-07-27 16:18:26 -0700194 EXPECT_CALL(storage, DeleteKey(service_name_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700195 .WillOnce(Return(true));
196 service_->SaveString(&storage, kKey, "data", false, false);
197}
198
199TEST_F(ServiceTest, SaveStringEmpty) {
200 MockStore storage;
201 static const char kKey[] = "test-key";
mukesh agrawal51a7e932011-07-27 16:18:26 -0700202 EXPECT_CALL(storage, DeleteKey(service_name_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700203 .WillOnce(Return(true));
204 service_->SaveString(&storage, kKey, "", true, true);
205}
206
207TEST_F(ServiceTest, Save) {
208 NiceMock<MockStore> storage;
mukesh agrawal51a7e932011-07-27 16:18:26 -0700209 const string id = service_name_;
Darin Petkovba40dd32011-07-11 20:06:39 -0700210 EXPECT_CALL(storage, SetString(id, _, _))
211 .Times(AtLeast(1))
212 .WillRepeatedly(Return(true));
213 EXPECT_CALL(storage, DeleteKey(id, _))
214 .Times(AtLeast(1))
215 .WillRepeatedly(Return(true));
216 EXPECT_TRUE(service_->Save(&storage));
217}
218
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700219} // namespace shill