blob: e47bd2e13e7377ba083a996e9bda4d94194968d7 [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 Masone7aa5f902011-07-11 11:13:35 -070021#include "shill/mock_profile.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070022#include "shill/mock_service.h"
23#include "shill/property_store_unittest.h"
24#include "shill/shill_event.h"
25
26using std::map;
27using std::string;
28using std::vector;
29using ::testing::_;
30using ::testing::NiceMock;
31using ::testing::Return;
32using ::testing::Test;
33
34namespace shill {
35
36class ServiceTest : public PropertyStoreTest {
37 public:
Chris Masone95207da2011-06-29 16:50:49 -070038 static const char kMockServiceName[];
39 static const char kMockDeviceRpcId[];
Chris Masone7aa5f902011-07-11 11:13:35 -070040 static const char kProfileName[];
Chris Masone95207da2011-06-29 16:50:49 -070041
Chris Masoneb925cc82011-06-22 15:39:57 -070042 ServiceTest()
43 : service_(new MockService(&control_interface_,
44 &dispatcher_,
Chris Masone7aa5f902011-07-11 11:13:35 -070045 new MockProfile(&control_interface_, &glib_),
Chris Masone95207da2011-06-29 16:50:49 -070046 kMockServiceName)) {
Chris Masoneb925cc82011-06-22 15:39:57 -070047 }
48
Chris Masone3bd3c8c2011-06-13 08:20:26 -070049 virtual ~ServiceTest() {}
Chris Masoneb925cc82011-06-22 15:39:57 -070050
51 protected:
Chris Masone95207da2011-06-29 16:50:49 -070052 scoped_refptr<MockService> service_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070053};
54
Chris Masone95207da2011-06-29 16:50:49 -070055const char ServiceTest::kMockServiceName[] = "mock-service";
56
57const char ServiceTest::kMockDeviceRpcId[] = "mock-device-rpc";
58
Chris Masone7aa5f902011-07-11 11:13:35 -070059const char ServiceTest::kProfileName[] = "profile";
60
Chris Masonea8a2c252011-06-27 22:16:30 -070061TEST_F(ServiceTest, GetProperties) {
Chris Masone95207da2011-06-29 16:50:49 -070062 EXPECT_CALL(*service_.get(), CalculateState()).WillRepeatedly(Return(""));
63 EXPECT_CALL(*service_.get(), GetDeviceRpcId())
64 .WillRepeatedly(Return(ServiceTest::kMockDeviceRpcId));
Chris Masonea8a2c252011-06-27 22:16:30 -070065 map<string, ::DBus::Variant> props;
66 Error error(Error::kInvalidProperty, "");
67 {
68 ::DBus::Error dbus_error;
69 string expected("portal_list");
Chris Masone27c4aa52011-07-02 13:10:14 -070070 service_->store()->SetStringProperty(flimflam::kCheckPortalProperty,
71 expected,
72 &error);
73 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070074 ASSERT_FALSE(props.find(flimflam::kCheckPortalProperty) == props.end());
75 EXPECT_EQ(props[flimflam::kCheckPortalProperty].reader().get_string(),
76 expected);
77 }
78 {
79 ::DBus::Error dbus_error;
80 bool expected = true;
Chris Masone27c4aa52011-07-02 13:10:14 -070081 service_->store()->SetBoolProperty(flimflam::kAutoConnectProperty,
82 expected,
83 &error);
84 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070085 ASSERT_FALSE(props.find(flimflam::kAutoConnectProperty) == props.end());
86 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
87 expected);
88 }
89 {
90 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -070091 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -070092 ASSERT_FALSE(props.find(flimflam::kConnectableProperty) == props.end());
93 EXPECT_EQ(props[flimflam::kConnectableProperty].reader().get_bool(), false);
94 }
95 {
96 ::DBus::Error dbus_error;
97 int32 expected = 127;
Chris Masone27c4aa52011-07-02 13:10:14 -070098 service_->store()->SetInt32Property(flimflam::kPriorityProperty,
99 expected,
100 &error);
101 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700102 ASSERT_FALSE(props.find(flimflam::kPriorityProperty) == props.end());
103 EXPECT_EQ(props[flimflam::kPriorityProperty].reader().get_int32(),
104 expected);
105 }
Chris Masone95207da2011-06-29 16:50:49 -0700106 {
107 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700108 DBusAdaptor::GetProperties(service_->store(), &props, &dbus_error);
Chris Masone95207da2011-06-29 16:50:49 -0700109 ASSERT_FALSE(props.find(flimflam::kDeviceProperty) == props.end());
110 EXPECT_EQ(props[flimflam::kDeviceProperty].reader().get_string(),
111 string(ServiceTest::kMockDeviceRpcId));
112 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700113}
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700114
Chris Masonea8a2c252011-06-27 22:16:30 -0700115TEST_F(ServiceTest, Dispatch) {
116 {
117 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700118 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700119 flimflam::kSaveCredentialsProperty,
120 PropertyStoreTest::kBoolV,
121 &error));
122 }
123 {
124 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700125 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700126 flimflam::kPriorityProperty,
127 PropertyStoreTest::kInt32V,
128 &error));
129 }
130 {
131 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700132 EXPECT_TRUE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700133 flimflam::kEAPEAPProperty,
134 PropertyStoreTest::kStringV,
135 &error));
136 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700137 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700138 {
139 ::DBus::Error error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700140 EXPECT_FALSE(DBusAdaptor::DispatchOnType(service_->store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700141 flimflam::kFavoriteProperty,
142 PropertyStoreTest::kBoolV,
143 &error));
144 EXPECT_EQ(invalid_args_, error.name());
145 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700146}
147
Chris Masoneb2e326b2011-07-12 13:28:51 -0700148TEST_F(ServiceTest, MoveService) {
149 // I want to ensure that the Profiles are managing this Service object
150 // lifetime properly, so I can't hold a ref to it here.
Chris Masone7aa5f902011-07-11 11:13:35 -0700151 ProfileRefPtr profile(new Profile(&control_interface_, &glib_));
Chris Masoneb2e326b2011-07-12 13:28:51 -0700152 {
153 ServiceRefPtr s2(
154 new MockService(&control_interface_,
155 &dispatcher_,
156 new MockProfile(&control_interface_, &glib_),
157 kMockServiceName));
158 profile->services_[kMockServiceName] = s2;
159 }
Chris Masone7aa5f902011-07-11 11:13:35 -0700160
Chris Masoneb2e326b2011-07-12 13:28:51 -0700161 // Now, move the service to another profile.
Chris Masone7aa5f902011-07-11 11:13:35 -0700162 ProfileRefPtr profile2(new Profile(&control_interface_, &glib_));
Chris Masoneb2e326b2011-07-12 13:28:51 -0700163 map<string, ServiceRefPtr>::iterator it =
164 profile->services_.find(kMockServiceName);
165 ASSERT_TRUE(it != profile->services_.end());
Chris Masone7aa5f902011-07-11 11:13:35 -0700166
Chris Masoneb2e326b2011-07-12 13:28:51 -0700167 profile2->AdoptService(it->first, it->second);
168 // Force destruction of the original Profile, to ensure that the Service
Chris Masone7aa5f902011-07-11 11:13:35 -0700169 // is kept alive and populated with data.
170 profile = NULL;
171 {
Chris Masoneb2e326b2011-07-12 13:28:51 -0700172 map<string, ServiceRefPtr>::iterator it =
173 profile2->services_.find(kMockServiceName);
Chris Masone7aa5f902011-07-11 11:13:35 -0700174 Error error(Error::kInvalidProperty, "");
175 ::DBus::Error dbus_error;
176 map<string, ::DBus::Variant> props;
177 bool expected = true;
Chris Masoneb2e326b2011-07-12 13:28:51 -0700178 it->second->store()->SetBoolProperty(flimflam::kAutoConnectProperty,
179 expected,
180 &error);
181 DBusAdaptor::GetProperties(it->second->store(), &props, &dbus_error);
Chris Masone7aa5f902011-07-11 11:13:35 -0700182 ASSERT_FALSE(props.find(flimflam::kAutoConnectProperty) == props.end());
183 EXPECT_EQ(props[flimflam::kAutoConnectProperty].reader().get_bool(),
184 expected);
185 }
186}
187
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700188} // namespace shill