blob: 4271401a861eee19bc7cfcb3bef60ec690abb147 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone88cbd5f2011-07-03 14:30:04 -07002// 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/default_profile.h"
6
7#include <map>
8#include <string>
Chris Masone877ff982011-09-21 16:18:24 -07009#include <vector>
Chris Masone88cbd5f2011-07-03 14:30:04 -070010
Chris Masone6515aab2011-10-12 16:19:09 -070011#include <base/file_path.h>
Chris Masone88cbd5f2011-07-03 14:30:04 -070012#include <chromeos/dbus/service_constants.h>
13#include <gtest/gtest.h>
14#include <gmock/gmock.h>
15
Chris Masone6515aab2011-10-12 16:19:09 -070016#include "shill/key_file_store.h"
17#include "shill/glib.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070018#include "shill/manager.h"
19#include "shill/mock_control.h"
Chris Masone877ff982011-09-21 16:18:24 -070020#include "shill/mock_device.h"
Paul Stewartf284a232012-05-01 10:24:37 -070021#include "shill/mock_service.h"
Chris Masoneaa482372011-09-14 16:40:37 -070022#include "shill/mock_store.h"
Paul Stewarte6927402012-01-23 16:11:30 -080023#include "shill/portal_detector.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070024#include "shill/property_store_unittest.h"
Paul Stewartbf667612012-06-29 14:49:54 -070025#include "shill/resolver.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070026
27using std::map;
28using std::string;
Chris Masone877ff982011-09-21 16:18:24 -070029using std::vector;
Chris Masone88cbd5f2011-07-03 14:30:04 -070030using ::testing::_;
Paul Stewart870523b2012-01-11 17:00:42 -080031using ::testing::DoAll;
Chris Masoneaa482372011-09-14 16:40:37 -070032using ::testing::Return;
Paul Stewart870523b2012-01-11 17:00:42 -080033using ::testing::SetArgumentPointee;
Chris Masone88cbd5f2011-07-03 14:30:04 -070034
35namespace shill {
36
37class DefaultProfileTest : public PropertyStoreTest {
38 public:
Chris Masone7aa5f902011-07-11 11:13:35 -070039 DefaultProfileTest()
Chris Masone2176a882011-09-14 22:29:15 -070040 : profile_(new DefaultProfile(control_interface(),
Chris Masone9d779932011-08-25 16:33:41 -070041 manager(),
Chris Masone6515aab2011-10-12 16:19:09 -070042 FilePath(storage_path()),
Paul Stewartd0a3b812012-03-28 22:48:22 -070043 DefaultProfile::kDefaultId,
Chris Masone877ff982011-09-21 16:18:24 -070044 properties_)),
45 device_(new MockDevice(control_interface(),
46 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -080047 metrics(),
Chris Masone877ff982011-09-21 16:18:24 -070048 manager(),
49 "null0",
50 "addr0",
51 0)) {
Chris Masone7aa5f902011-07-11 11:13:35 -070052 }
Chris Masone88cbd5f2011-07-03 14:30:04 -070053
54 virtual ~DefaultProfileTest() {}
55
Chris Masone6515aab2011-10-12 16:19:09 -070056 virtual void SetUp() {
57 PropertyStoreTest::SetUp();
58 FilePath final_path;
59 ASSERT_TRUE(profile_->GetStoragePath(&final_path));
60 scoped_ptr<KeyFileStore> storage(new KeyFileStore(&real_glib_));
61 storage->set_path(final_path);
62 ASSERT_TRUE(storage->Open());
63 profile_->set_storage(storage.release()); // Passes ownership.
64 }
65
Chris Masone88cbd5f2011-07-03 14:30:04 -070066 protected:
Chris Masone2ae797d2011-08-23 20:41:00 -070067 static const char kTestStoragePath[];
68
Chris Masone6515aab2011-10-12 16:19:09 -070069 GLib real_glib_;
Paul Stewart870523b2012-01-11 17:00:42 -080070 scoped_refptr<DefaultProfile> profile_;
Chris Masone877ff982011-09-21 16:18:24 -070071 scoped_refptr<MockDevice> device_;
Chris Masone88cbd5f2011-07-03 14:30:04 -070072 Manager::Properties properties_;
73};
74
Chris Masone2ae797d2011-08-23 20:41:00 -070075const char DefaultProfileTest::kTestStoragePath[] = "/no/where";
76
Chris Masone88cbd5f2011-07-03 14:30:04 -070077TEST_F(DefaultProfileTest, GetProperties) {
78 Error error(Error::kInvalidProperty, "");
79 {
80 map<string, ::DBus::Variant> props;
81 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070082 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070083 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
84 EXPECT_FALSE(props[flimflam::kOfflineModeProperty].reader().get_bool());
85 }
86 properties_.offline_mode = true;
87 {
88 map<string, ::DBus::Variant> props;
89 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070090 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070091 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
92 EXPECT_TRUE(props[flimflam::kOfflineModeProperty].reader().get_bool());
93 }
94 {
95 Error error(Error::kInvalidProperty, "");
96 EXPECT_FALSE(
mukesh agrawalde29fa82011-09-16 16:16:36 -070097 profile_->mutable_store()->SetBoolProperty(
98 flimflam::kOfflineModeProperty,
99 true,
100 &error));
Chris Masone88cbd5f2011-07-03 14:30:04 -0700101 }
102}
103
Chris Masoneaa482372011-09-14 16:40:37 -0700104TEST_F(DefaultProfileTest, Save) {
Chris Masoneb9c00592011-10-06 13:10:39 -0700105 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700106 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
107 DefaultProfile::kStorageArpGateway,
108 true))
109 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700110 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
111 DefaultProfile::kStorageName,
112 DefaultProfile::kDefaultId))
Chris Masoneaa482372011-09-14 16:40:37 -0700113 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700114 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
Paul Stewartd32f4842012-01-11 16:08:13 -0800115 DefaultProfile::kStorageHostName,
Chris Masoneb9c00592011-10-06 13:10:39 -0700116 ""))
Chris Masoneaa482372011-09-14 16:40:37 -0700117 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700118 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
119 DefaultProfile::kStorageOfflineMode,
120 false))
Chris Masoneaa482372011-09-14 16:40:37 -0700121 .WillOnce(Return(true));
Paul Stewartd32f4842012-01-11 16:08:13 -0800122 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
123 DefaultProfile::kStorageCheckPortalList,
124 ""))
125 .WillOnce(Return(true));
Paul Stewarte6927402012-01-23 16:11:30 -0800126 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
127 DefaultProfile::kStoragePortalURL,
128 ""))
129 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800130 EXPECT_CALL(*storage.get(),
131 SetString(DefaultProfile::kStorageId,
132 DefaultProfile::kStoragePortalCheckInterval,
133 "0"))
134 .WillOnce(Return(true));
Paul Stewartbf667612012-06-29 14:49:54 -0700135 EXPECT_CALL(*storage.get(),
136 SetString(DefaultProfile::kStorageId,
137 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
138 ""))
139 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700140 EXPECT_CALL(*storage.get(), Flush()).WillOnce(Return(true));
Chris Masone877ff982011-09-21 16:18:24 -0700141
Paul Stewart212d60f2012-07-12 10:59:13 -0700142 EXPECT_CALL(*device_.get(), Save(storage.get())).Times(0);
Chris Masoneb9c00592011-10-06 13:10:39 -0700143 profile_->set_storage(storage.release());
Chris Masone877ff982011-09-21 16:18:24 -0700144
145 manager()->RegisterDevice(device_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700146 ASSERT_TRUE(profile_->Save());
Chris Masone877ff982011-09-21 16:18:24 -0700147 manager()->DeregisterDevice(device_);
Chris Masoneaa482372011-09-14 16:40:37 -0700148}
149
Paul Stewarte6927402012-01-23 16:11:30 -0800150TEST_F(DefaultProfileTest, LoadManagerDefaultProperties) {
151 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700152 Manager::Properties manager_props;
153 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
154 DefaultProfile::kStorageArpGateway,
155 &manager_props.arp_gateway))
156 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800157 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
158 DefaultProfile::kStorageHostName,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700159 &manager_props.host_name))
Paul Stewarte6927402012-01-23 16:11:30 -0800160 .WillOnce(Return(false));
161 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
162 DefaultProfile::kStorageOfflineMode,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700163 &manager_props.offline_mode))
Paul Stewarte6927402012-01-23 16:11:30 -0800164 .WillOnce(Return(false));
165 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
166 DefaultProfile::kStorageCheckPortalList,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700167 &manager_props.check_portal_list))
Paul Stewarte6927402012-01-23 16:11:30 -0800168 .WillOnce(Return(false));
169 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
170 DefaultProfile::kStoragePortalURL,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700171 &manager_props.portal_url))
Paul Stewarte6927402012-01-23 16:11:30 -0800172 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800173 EXPECT_CALL(*storage.get(),
174 GetString(DefaultProfile::kStorageId,
175 DefaultProfile::kStoragePortalCheckInterval,
176 _))
177 .WillOnce(Return(false));
Paul Stewartbf667612012-06-29 14:49:54 -0700178 EXPECT_CALL(*storage.get(),
179 GetString(DefaultProfile::kStorageId,
180 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
181 _))
182 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800183 profile_->set_storage(storage.release());
184
Paul Stewarte6927402012-01-23 16:11:30 -0800185 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700186 EXPECT_TRUE(manager_props.arp_gateway);
Paul Stewarte6927402012-01-23 16:11:30 -0800187 EXPECT_EQ("", manager_props.host_name);
188 EXPECT_FALSE(manager_props.offline_mode);
Paul Stewartf555cf82012-03-15 14:42:43 -0700189 EXPECT_EQ(PortalDetector::kDefaultCheckPortalList,
190 manager_props.check_portal_list);
Paul Stewarte6927402012-01-23 16:11:30 -0800191 EXPECT_EQ(PortalDetector::kDefaultURL, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800192 EXPECT_EQ(PortalDetector::kDefaultCheckIntervalSeconds,
193 manager_props.portal_check_interval_seconds);
Paul Stewartbf667612012-06-29 14:49:54 -0700194 EXPECT_EQ(Resolver::kDefaultShortTimeoutTechnologies,
195 manager_props.short_dns_timeout_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800196}
197
Paul Stewart870523b2012-01-11 17:00:42 -0800198TEST_F(DefaultProfileTest, LoadManagerProperties) {
199 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd32f4842012-01-11 16:08:13 -0800200 const string host_name("hostname");
Paul Stewartd408fdf2012-05-07 17:15:57 -0700201 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
202 DefaultProfile::kStorageArpGateway,
203 _))
204 .WillOnce(DoAll(SetArgumentPointee<2>(false), Return(true)));
Paul Stewartd32f4842012-01-11 16:08:13 -0800205 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
206 DefaultProfile::kStorageHostName,
207 _))
208 .WillOnce(DoAll(SetArgumentPointee<2>(host_name), Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800209 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
210 DefaultProfile::kStorageOfflineMode,
211 _))
212 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(true)));
213 const string portal_list("technology1,technology2");
214 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
215 DefaultProfile::kStorageCheckPortalList,
216 _))
217 .WillOnce(DoAll(SetArgumentPointee<2>(portal_list), Return(true)));
Paul Stewarte6927402012-01-23 16:11:30 -0800218 const string portal_url("http://www.chromium.org");
219 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
220 DefaultProfile::kStoragePortalURL,
221 _))
222 .WillOnce(DoAll(SetArgumentPointee<2>(portal_url), Return(true)));
Paul Stewartc681fa02012-03-02 19:40:04 -0800223 const string portal_check_interval_string("10");
224 const int portal_check_interval_int = 10;
225 EXPECT_CALL(*storage.get(),
226 GetString(DefaultProfile::kStorageId,
227 DefaultProfile::kStoragePortalCheckInterval,
228 _))
229 .WillOnce(DoAll(SetArgumentPointee<2>(portal_check_interval_string),
230 Return(true)));
Paul Stewartbf667612012-06-29 14:49:54 -0700231 const string short_dns_timeout_technologies("wimax,cellular");
232 EXPECT_CALL(*storage.get(),
233 GetString(DefaultProfile::kStorageId,
234 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
235 _))
236 .WillOnce(DoAll(SetArgumentPointee<2>(short_dns_timeout_technologies),
237 Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800238 profile_->set_storage(storage.release());
239
240 Manager::Properties manager_props;
241 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700242 EXPECT_FALSE(manager_props.arp_gateway);
Paul Stewartd32f4842012-01-11 16:08:13 -0800243 EXPECT_EQ(host_name, manager_props.host_name);
Paul Stewart870523b2012-01-11 17:00:42 -0800244 EXPECT_TRUE(manager_props.offline_mode);
245 EXPECT_EQ(portal_list, manager_props.check_portal_list);
Paul Stewarte6927402012-01-23 16:11:30 -0800246 EXPECT_EQ(portal_url, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800247 EXPECT_EQ(portal_check_interval_int,
248 manager_props.portal_check_interval_seconds);
Paul Stewartbf667612012-06-29 14:49:54 -0700249 EXPECT_EQ(short_dns_timeout_technologies,
250 manager_props.short_dns_timeout_technologies);
Paul Stewart870523b2012-01-11 17:00:42 -0800251}
252
Chris Masone2ae797d2011-08-23 20:41:00 -0700253TEST_F(DefaultProfileTest, GetStoragePath) {
254 FilePath path;
255 EXPECT_TRUE(profile_->GetStoragePath(&path));
Chris Masone6515aab2011-10-12 16:19:09 -0700256 EXPECT_EQ(storage_path() + "/default.profile", path.value());
Chris Masone2ae797d2011-08-23 20:41:00 -0700257}
258
Paul Stewartf284a232012-05-01 10:24:37 -0700259TEST_F(DefaultProfileTest, ConfigureService) {
260 scoped_ptr<MockStore> storage(new MockStore);
261 EXPECT_CALL(*storage, ContainsGroup(_))
262 .WillRepeatedly(Return(false));
263 EXPECT_CALL(*storage, Flush())
264 .WillOnce(Return(true));
265
266 scoped_refptr<MockService> unknown_service(new MockService(
267 control_interface(),
268 dispatcher(),
269 metrics(),
270 manager()));
271 EXPECT_CALL(*unknown_service, technology())
272 .WillOnce(Return(Technology::kUnknown));
273 EXPECT_CALL(*unknown_service, Save(_)) .Times(0);
274
275 scoped_refptr<MockService> ethernet_service(new MockService(
276 control_interface(),
277 dispatcher(),
278 metrics(),
279 manager()));
280 EXPECT_CALL(*ethernet_service, technology())
281 .WillOnce(Return(Technology::kEthernet));
282 EXPECT_CALL(*ethernet_service, Save(storage.get()))
283 .WillOnce(Return(true));
284
285 profile_->set_storage(storage.release());
286 EXPECT_FALSE(profile_->ConfigureService(unknown_service));
287 EXPECT_TRUE(profile_->ConfigureService(ethernet_service));
288}
289
Darin Petkove7c6ad32012-06-29 10:22:09 +0200290TEST_F(DefaultProfileTest, UpdateDevice) {
291 scoped_ptr<MockStore> storage(new MockStore());
292 EXPECT_CALL(*storage, Flush()).WillOnce(Return(true));
293 EXPECT_CALL(*device_, Save(storage.get()))
294 .WillOnce(Return(true))
295 .WillOnce(Return(false));
296 profile_->set_storage(storage.release());
297 EXPECT_TRUE(profile_->UpdateDevice(device_));
298 EXPECT_FALSE(profile_->UpdateDevice(device_));
299}
300
Chris Masone88cbd5f2011-07-03 14:30:04 -0700301} // namespace shill