blob: 269379f6a421cd86b2e08bbb00997996ff1cc2f6 [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_)),
Chris Masone34af2182011-08-22 11:59:36 -070047 storage_id_("service") {
48 EXPECT_CALL(*service_.get(), GetStorageIdentifier(_))
49 .WillRepeatedly(Return(storage_id_));
50 EXPECT_CALL(*service_.get(), GetRpcIdentifier())
51 .WillRepeatedly(Return(ServiceMockAdaptor::kRpcId));
Chris Masoneb925cc82011-06-22 15:39:57 -070052 }
53
Chris Masone3bd3c8c2011-06-13 08:20:26 -070054 virtual ~ServiceTest() {}
Chris Masoneb925cc82011-06-22 15:39:57 -070055
56 protected:
Chris Masone95207da2011-06-29 16:50:49 -070057 scoped_refptr<MockService> service_;
Chris Masone34af2182011-08-22 11:59:36 -070058 string storage_id_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070059};
60
Chris Masone95207da2011-06-29 16:50:49 -070061const char ServiceTest::kMockDeviceRpcId[] = "mock-device-rpc";
62
Chris Masone7aa5f902011-07-11 11:13:35 -070063const char ServiceTest::kProfileName[] = "profile";
64
Darin Petkovba40dd32011-07-11 20:06:39 -070065TEST_F(ServiceTest, Constructor) {
66 EXPECT_TRUE(service_->save_credentials_);
67 EXPECT_EQ(Service::kCheckPortalAuto, service_->check_portal_);
68}
69
Chris Masonea8a2c252011-06-27 22:16:30 -070070TEST_F(ServiceTest, GetProperties) {
Chris Masone95207da2011-06-29 16:50:49 -070071 EXPECT_CALL(*service_.get(), CalculateState()).WillRepeatedly(Return(""));
72 EXPECT_CALL(*service_.get(), GetDeviceRpcId())
73 .WillRepeatedly(Return(ServiceTest::kMockDeviceRpcId));
Chris Masonea8a2c252011-06-27 22:16:30 -070074 map<string, ::DBus::Variant> props;
75 Error error(Error::kInvalidProperty, "");
76 {
77 ::DBus::Error dbus_error;
78 string expected("portal_list");
Chris Masone27c4aa52011-07-02 13:10:14 -070079 service_->store()->SetStringProperty(flimflam::kCheckPortalProperty,
80 expected,
81 &error);
82 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;
Chris Masone27c4aa52011-07-02 13:10:14 -070090 service_->store()->SetBoolProperty(flimflam::kAutoConnectProperty,
91 expected,
92 &error);
93 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070094 ASSERT_FALSE(props.find(flimflam::kAutoConnectProperty) == props.end());
95 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
96 expected);
97 }
98 {
99 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700100 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700101 ASSERT_FALSE(props.find(flimflam::kConnectableProperty) == props.end());
102 EXPECT_EQ(props[flimflam::kConnectableProperty].reader().get_bool(), false);
103 }
104 {
105 ::DBus::Error dbus_error;
106 int32 expected = 127;
Chris Masone27c4aa52011-07-02 13:10:14 -0700107 service_->store()->SetInt32Property(flimflam::kPriorityProperty,
108 expected,
109 &error);
110 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700111 ASSERT_FALSE(props.find(flimflam::kPriorityProperty) == props.end());
112 EXPECT_EQ(props[flimflam::kPriorityProperty].reader().get_int32(),
113 expected);
114 }
Chris Masone95207da2011-06-29 16:50:49 -0700115 {
116 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700117 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masone95207da2011-06-29 16:50:49 -0700118 ASSERT_FALSE(props.find(flimflam::kDeviceProperty) == props.end());
119 EXPECT_EQ(props[flimflam::kDeviceProperty].reader().get_string(),
120 string(ServiceTest::kMockDeviceRpcId));
121 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700122}
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700123
Chris Masonea8a2c252011-06-27 22:16:30 -0700124TEST_F(ServiceTest, Dispatch) {
125 {
126 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700127 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700128 flimflam::kSaveCredentialsProperty,
129 PropertyStoreTest::kBoolV,
130 &error));
131 }
132 {
133 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700134 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700135 flimflam::kPriorityProperty,
136 PropertyStoreTest::kInt32V,
137 &error));
138 }
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::kEAPEAPProperty,
143 PropertyStoreTest::kStringV,
144 &error));
145 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700146 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700147 {
148 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700149 EXPECT_FALSE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700150 flimflam::kFavoriteProperty,
151 PropertyStoreTest::kBoolV,
152 &error));
153 EXPECT_EQ(invalid_args_, error.name());
154 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700155}
156
Darin Petkovba40dd32011-07-11 20:06:39 -0700157TEST_F(ServiceTest, Load) {
158 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700159 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(true));
160 EXPECT_CALL(storage, GetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700161 .Times(AtLeast(1))
162 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700163 EXPECT_TRUE(service_->Load(&storage, ""));
Darin Petkovba40dd32011-07-11 20:06:39 -0700164}
165
166TEST_F(ServiceTest, LoadFail) {
167 StrictMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700168 EXPECT_CALL(storage, ContainsGroup(storage_id_)).WillOnce(Return(false));
169 EXPECT_FALSE(service_->Load(&storage, ""));
Darin Petkovba40dd32011-07-11 20:06:39 -0700170}
171
172TEST_F(ServiceTest, SaveString) {
173 MockStore storage;
174 static const char kKey[] = "test-key";
175 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700176 EXPECT_CALL(storage, SetString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700177 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700178 service_->SaveString(&storage, storage_id_, kKey, kData, false, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700179}
180
181TEST_F(ServiceTest, SaveStringCrypted) {
182 MockStore storage;
183 static const char kKey[] = "test-key";
184 static const char kData[] = "test-data";
Chris Masone34af2182011-08-22 11:59:36 -0700185 EXPECT_CALL(storage, SetCryptedString(storage_id_, kKey, kData))
Darin Petkovba40dd32011-07-11 20:06:39 -0700186 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700187 service_->SaveString(&storage, storage_id_, kKey, kData, true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700188}
189
190TEST_F(ServiceTest, SaveStringDontSave) {
191 MockStore storage;
192 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700193 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700194 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700195 service_->SaveString(&storage, storage_id_, kKey, "data", false, false);
Darin Petkovba40dd32011-07-11 20:06:39 -0700196}
197
198TEST_F(ServiceTest, SaveStringEmpty) {
199 MockStore storage;
200 static const char kKey[] = "test-key";
Chris Masone34af2182011-08-22 11:59:36 -0700201 EXPECT_CALL(storage, DeleteKey(storage_id_, kKey))
Darin Petkovba40dd32011-07-11 20:06:39 -0700202 .WillOnce(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700203 service_->SaveString(&storage, storage_id_, kKey, "", true, true);
Darin Petkovba40dd32011-07-11 20:06:39 -0700204}
205
206TEST_F(ServiceTest, Save) {
207 NiceMock<MockStore> storage;
Chris Masone34af2182011-08-22 11:59:36 -0700208 EXPECT_CALL(storage, SetString(storage_id_, _, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700209 .Times(AtLeast(1))
210 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700211 EXPECT_CALL(storage, DeleteKey(storage_id_, _))
Darin Petkovba40dd32011-07-11 20:06:39 -0700212 .Times(AtLeast(1))
213 .WillRepeatedly(Return(true));
Chris Masone34af2182011-08-22 11:59:36 -0700214 EXPECT_TRUE(service_->Save(&storage, ""));
Darin Petkovba40dd32011-07-11 20:06:39 -0700215}
216
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700217} // namespace shill