blob: bfa6cf4a777852703d127d6bb2e398fe46506bb7 [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"
Paul Stewart036dba02012-08-07 12:34:41 -070018#include "shill/link_monitor.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070019#include "shill/manager.h"
20#include "shill/mock_control.h"
Chris Masone877ff982011-09-21 16:18:24 -070021#include "shill/mock_device.h"
Paul Stewartf284a232012-05-01 10:24:37 -070022#include "shill/mock_service.h"
Chris Masoneaa482372011-09-14 16:40:37 -070023#include "shill/mock_store.h"
Paul Stewarte6927402012-01-23 16:11:30 -080024#include "shill/portal_detector.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070025#include "shill/property_store_unittest.h"
Paul Stewartbf667612012-06-29 14:49:54 -070026#include "shill/resolver.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070027
28using std::map;
29using std::string;
Chris Masone877ff982011-09-21 16:18:24 -070030using std::vector;
Chris Masone88cbd5f2011-07-03 14:30:04 -070031using ::testing::_;
Paul Stewart870523b2012-01-11 17:00:42 -080032using ::testing::DoAll;
Chris Masoneaa482372011-09-14 16:40:37 -070033using ::testing::Return;
Paul Stewart870523b2012-01-11 17:00:42 -080034using ::testing::SetArgumentPointee;
Chris Masone88cbd5f2011-07-03 14:30:04 -070035
36namespace shill {
37
38class DefaultProfileTest : public PropertyStoreTest {
39 public:
Chris Masone7aa5f902011-07-11 11:13:35 -070040 DefaultProfileTest()
Chris Masone2176a882011-09-14 22:29:15 -070041 : profile_(new DefaultProfile(control_interface(),
Chris Masone9d779932011-08-25 16:33:41 -070042 manager(),
Chris Masone6515aab2011-10-12 16:19:09 -070043 FilePath(storage_path()),
Paul Stewartd0a3b812012-03-28 22:48:22 -070044 DefaultProfile::kDefaultId,
Chris Masone877ff982011-09-21 16:18:24 -070045 properties_)),
46 device_(new MockDevice(control_interface(),
47 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -080048 metrics(),
Chris Masone877ff982011-09-21 16:18:24 -070049 manager(),
50 "null0",
51 "addr0",
52 0)) {
Chris Masone7aa5f902011-07-11 11:13:35 -070053 }
Chris Masone88cbd5f2011-07-03 14:30:04 -070054
55 virtual ~DefaultProfileTest() {}
56
Chris Masone6515aab2011-10-12 16:19:09 -070057 virtual void SetUp() {
58 PropertyStoreTest::SetUp();
59 FilePath final_path;
60 ASSERT_TRUE(profile_->GetStoragePath(&final_path));
61 scoped_ptr<KeyFileStore> storage(new KeyFileStore(&real_glib_));
62 storage->set_path(final_path);
63 ASSERT_TRUE(storage->Open());
64 profile_->set_storage(storage.release()); // Passes ownership.
65 }
66
Chris Masone88cbd5f2011-07-03 14:30:04 -070067 protected:
Chris Masone2ae797d2011-08-23 20:41:00 -070068 static const char kTestStoragePath[];
69
Chris Masone6515aab2011-10-12 16:19:09 -070070 GLib real_glib_;
Paul Stewart870523b2012-01-11 17:00:42 -080071 scoped_refptr<DefaultProfile> profile_;
Chris Masone877ff982011-09-21 16:18:24 -070072 scoped_refptr<MockDevice> device_;
Chris Masone88cbd5f2011-07-03 14:30:04 -070073 Manager::Properties properties_;
74};
75
Chris Masone2ae797d2011-08-23 20:41:00 -070076const char DefaultProfileTest::kTestStoragePath[] = "/no/where";
77
Chris Masone88cbd5f2011-07-03 14:30:04 -070078TEST_F(DefaultProfileTest, GetProperties) {
79 Error error(Error::kInvalidProperty, "");
80 {
81 map<string, ::DBus::Variant> props;
82 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070083 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070084 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
85 EXPECT_FALSE(props[flimflam::kOfflineModeProperty].reader().get_bool());
86 }
87 properties_.offline_mode = true;
88 {
89 map<string, ::DBus::Variant> props;
90 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070091 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070092 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
93 EXPECT_TRUE(props[flimflam::kOfflineModeProperty].reader().get_bool());
94 }
95 {
96 Error error(Error::kInvalidProperty, "");
97 EXPECT_FALSE(
mukesh agrawalde29fa82011-09-16 16:16:36 -070098 profile_->mutable_store()->SetBoolProperty(
99 flimflam::kOfflineModeProperty,
100 true,
101 &error));
Chris Masone88cbd5f2011-07-03 14:30:04 -0700102 }
103}
104
Chris Masoneaa482372011-09-14 16:40:37 -0700105TEST_F(DefaultProfileTest, Save) {
Chris Masoneb9c00592011-10-06 13:10:39 -0700106 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700107 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
108 DefaultProfile::kStorageArpGateway,
109 true))
110 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700111 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
112 DefaultProfile::kStorageName,
113 DefaultProfile::kDefaultId))
Chris Masoneaa482372011-09-14 16:40:37 -0700114 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700115 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
Paul Stewartd32f4842012-01-11 16:08:13 -0800116 DefaultProfile::kStorageHostName,
Chris Masoneb9c00592011-10-06 13:10:39 -0700117 ""))
Chris Masoneaa482372011-09-14 16:40:37 -0700118 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700119 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
120 DefaultProfile::kStorageOfflineMode,
121 false))
Chris Masoneaa482372011-09-14 16:40:37 -0700122 .WillOnce(Return(true));
Paul Stewartd32f4842012-01-11 16:08:13 -0800123 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
124 DefaultProfile::kStorageCheckPortalList,
125 ""))
126 .WillOnce(Return(true));
Paul Stewart036dba02012-08-07 12:34:41 -0700127 EXPECT_CALL(*storage.get(),
128 SetString(DefaultProfile::kStorageId,
Paul Stewart4d5efb72012-09-17 12:24:34 -0700129 DefaultProfile::kStorageIgnoredDNSSearchPaths,
130 ""))
131 .WillOnce(Return(true));
132 EXPECT_CALL(*storage.get(),
133 SetString(DefaultProfile::kStorageId,
Paul Stewart036dba02012-08-07 12:34:41 -0700134 DefaultProfile::kStorageLinkMonitorTechnologies,
135 ""))
136 .WillOnce(Return(true));
Paul Stewarte6927402012-01-23 16:11:30 -0800137 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
138 DefaultProfile::kStoragePortalURL,
139 ""))
140 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800141 EXPECT_CALL(*storage.get(),
142 SetString(DefaultProfile::kStorageId,
143 DefaultProfile::kStoragePortalCheckInterval,
144 "0"))
145 .WillOnce(Return(true));
Paul Stewartbf667612012-06-29 14:49:54 -0700146 EXPECT_CALL(*storage.get(),
147 SetString(DefaultProfile::kStorageId,
148 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
149 ""))
150 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700151 EXPECT_CALL(*storage.get(), Flush()).WillOnce(Return(true));
Chris Masone877ff982011-09-21 16:18:24 -0700152
Paul Stewart212d60f2012-07-12 10:59:13 -0700153 EXPECT_CALL(*device_.get(), Save(storage.get())).Times(0);
Chris Masoneb9c00592011-10-06 13:10:39 -0700154 profile_->set_storage(storage.release());
Chris Masone877ff982011-09-21 16:18:24 -0700155
156 manager()->RegisterDevice(device_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700157 ASSERT_TRUE(profile_->Save());
Chris Masone877ff982011-09-21 16:18:24 -0700158 manager()->DeregisterDevice(device_);
Chris Masoneaa482372011-09-14 16:40:37 -0700159}
160
Paul Stewarte6927402012-01-23 16:11:30 -0800161TEST_F(DefaultProfileTest, LoadManagerDefaultProperties) {
162 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700163 Manager::Properties manager_props;
164 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
165 DefaultProfile::kStorageArpGateway,
166 &manager_props.arp_gateway))
167 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800168 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
169 DefaultProfile::kStorageHostName,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700170 &manager_props.host_name))
Paul Stewarte6927402012-01-23 16:11:30 -0800171 .WillOnce(Return(false));
172 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
173 DefaultProfile::kStorageOfflineMode,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700174 &manager_props.offline_mode))
Paul Stewarte6927402012-01-23 16:11:30 -0800175 .WillOnce(Return(false));
176 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
177 DefaultProfile::kStorageCheckPortalList,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700178 &manager_props.check_portal_list))
Paul Stewarte6927402012-01-23 16:11:30 -0800179 .WillOnce(Return(false));
Paul Stewart036dba02012-08-07 12:34:41 -0700180 EXPECT_CALL(*storage.get(),
181 GetString(DefaultProfile::kStorageId,
Paul Stewart4d5efb72012-09-17 12:24:34 -0700182 DefaultProfile::kStorageIgnoredDNSSearchPaths,
183 &manager_props.ignored_dns_search_paths))
184 .WillOnce(Return(false));
185 EXPECT_CALL(*storage.get(),
186 GetString(DefaultProfile::kStorageId,
Paul Stewart036dba02012-08-07 12:34:41 -0700187 DefaultProfile::kStorageLinkMonitorTechnologies,
188 _))
189 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800190 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
191 DefaultProfile::kStoragePortalURL,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700192 &manager_props.portal_url))
Paul Stewarte6927402012-01-23 16:11:30 -0800193 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800194 EXPECT_CALL(*storage.get(),
195 GetString(DefaultProfile::kStorageId,
196 DefaultProfile::kStoragePortalCheckInterval,
197 _))
198 .WillOnce(Return(false));
Paul Stewartbf667612012-06-29 14:49:54 -0700199 EXPECT_CALL(*storage.get(),
200 GetString(DefaultProfile::kStorageId,
201 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
202 _))
203 .WillOnce(Return(false));
Paul Stewart036dba02012-08-07 12:34:41 -0700204
Paul Stewarte6927402012-01-23 16:11:30 -0800205 profile_->set_storage(storage.release());
206
Paul Stewarte6927402012-01-23 16:11:30 -0800207 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700208 EXPECT_TRUE(manager_props.arp_gateway);
Paul Stewarte6927402012-01-23 16:11:30 -0800209 EXPECT_EQ("", manager_props.host_name);
210 EXPECT_FALSE(manager_props.offline_mode);
Paul Stewartf555cf82012-03-15 14:42:43 -0700211 EXPECT_EQ(PortalDetector::kDefaultCheckPortalList,
212 manager_props.check_portal_list);
Paul Stewart4d5efb72012-09-17 12:24:34 -0700213 EXPECT_EQ(Resolver::kDefaultIgnoredSearchList,
214 manager_props.ignored_dns_search_paths);
Paul Stewart036dba02012-08-07 12:34:41 -0700215 EXPECT_EQ(LinkMonitor::kDefaultLinkMonitorTechnologies,
216 manager_props.link_monitor_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800217 EXPECT_EQ(PortalDetector::kDefaultURL, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800218 EXPECT_EQ(PortalDetector::kDefaultCheckIntervalSeconds,
219 manager_props.portal_check_interval_seconds);
Paul Stewartbf667612012-06-29 14:49:54 -0700220 EXPECT_EQ(Resolver::kDefaultShortTimeoutTechnologies,
221 manager_props.short_dns_timeout_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800222}
223
Paul Stewart870523b2012-01-11 17:00:42 -0800224TEST_F(DefaultProfileTest, LoadManagerProperties) {
225 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd32f4842012-01-11 16:08:13 -0800226 const string host_name("hostname");
Paul Stewartd408fdf2012-05-07 17:15:57 -0700227 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
228 DefaultProfile::kStorageArpGateway,
229 _))
230 .WillOnce(DoAll(SetArgumentPointee<2>(false), Return(true)));
Paul Stewartd32f4842012-01-11 16:08:13 -0800231 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
232 DefaultProfile::kStorageHostName,
233 _))
234 .WillOnce(DoAll(SetArgumentPointee<2>(host_name), Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800235 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
236 DefaultProfile::kStorageOfflineMode,
237 _))
238 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(true)));
239 const string portal_list("technology1,technology2");
240 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
241 DefaultProfile::kStorageCheckPortalList,
242 _))
243 .WillOnce(DoAll(SetArgumentPointee<2>(portal_list), Return(true)));
Paul Stewart4d5efb72012-09-17 12:24:34 -0700244 const string ignored_paths("chromium.org,google.com");
245 EXPECT_CALL(*storage.get(),
246 GetString(DefaultProfile::kStorageId,
247 DefaultProfile::kStorageIgnoredDNSSearchPaths,
248 _))
249 .WillOnce(DoAll(SetArgumentPointee<2>(ignored_paths), Return(true)));
Paul Stewart036dba02012-08-07 12:34:41 -0700250 const string link_monitor_technologies("ethernet,wimax");
251 EXPECT_CALL(*storage.get(),
252 GetString(DefaultProfile::kStorageId,
253 DefaultProfile::kStorageLinkMonitorTechnologies,
254 _))
255 .WillOnce(DoAll(SetArgumentPointee<2>(link_monitor_technologies),
256 Return(true)));
Paul Stewarte6927402012-01-23 16:11:30 -0800257 const string portal_url("http://www.chromium.org");
258 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
259 DefaultProfile::kStoragePortalURL,
260 _))
261 .WillOnce(DoAll(SetArgumentPointee<2>(portal_url), Return(true)));
Paul Stewartc681fa02012-03-02 19:40:04 -0800262 const string portal_check_interval_string("10");
263 const int portal_check_interval_int = 10;
264 EXPECT_CALL(*storage.get(),
265 GetString(DefaultProfile::kStorageId,
266 DefaultProfile::kStoragePortalCheckInterval,
267 _))
268 .WillOnce(DoAll(SetArgumentPointee<2>(portal_check_interval_string),
269 Return(true)));
Paul Stewartbf667612012-06-29 14:49:54 -0700270 const string short_dns_timeout_technologies("wimax,cellular");
271 EXPECT_CALL(*storage.get(),
272 GetString(DefaultProfile::kStorageId,
273 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
274 _))
275 .WillOnce(DoAll(SetArgumentPointee<2>(short_dns_timeout_technologies),
276 Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800277 profile_->set_storage(storage.release());
278
279 Manager::Properties manager_props;
280 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700281 EXPECT_FALSE(manager_props.arp_gateway);
Paul Stewartd32f4842012-01-11 16:08:13 -0800282 EXPECT_EQ(host_name, manager_props.host_name);
Paul Stewart870523b2012-01-11 17:00:42 -0800283 EXPECT_TRUE(manager_props.offline_mode);
284 EXPECT_EQ(portal_list, manager_props.check_portal_list);
Paul Stewart4d5efb72012-09-17 12:24:34 -0700285 EXPECT_EQ(ignored_paths, manager_props.ignored_dns_search_paths);
Paul Stewart036dba02012-08-07 12:34:41 -0700286 EXPECT_EQ(link_monitor_technologies,
287 manager_props.link_monitor_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800288 EXPECT_EQ(portal_url, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800289 EXPECT_EQ(portal_check_interval_int,
290 manager_props.portal_check_interval_seconds);
Paul Stewartbf667612012-06-29 14:49:54 -0700291 EXPECT_EQ(short_dns_timeout_technologies,
292 manager_props.short_dns_timeout_technologies);
Paul Stewart870523b2012-01-11 17:00:42 -0800293}
294
Chris Masone2ae797d2011-08-23 20:41:00 -0700295TEST_F(DefaultProfileTest, GetStoragePath) {
296 FilePath path;
297 EXPECT_TRUE(profile_->GetStoragePath(&path));
Chris Masone6515aab2011-10-12 16:19:09 -0700298 EXPECT_EQ(storage_path() + "/default.profile", path.value());
Chris Masone2ae797d2011-08-23 20:41:00 -0700299}
300
Paul Stewartf284a232012-05-01 10:24:37 -0700301TEST_F(DefaultProfileTest, ConfigureService) {
302 scoped_ptr<MockStore> storage(new MockStore);
303 EXPECT_CALL(*storage, ContainsGroup(_))
304 .WillRepeatedly(Return(false));
305 EXPECT_CALL(*storage, Flush())
306 .WillOnce(Return(true));
307
308 scoped_refptr<MockService> unknown_service(new MockService(
309 control_interface(),
310 dispatcher(),
311 metrics(),
312 manager()));
313 EXPECT_CALL(*unknown_service, technology())
314 .WillOnce(Return(Technology::kUnknown));
315 EXPECT_CALL(*unknown_service, Save(_)) .Times(0);
316
317 scoped_refptr<MockService> ethernet_service(new MockService(
318 control_interface(),
319 dispatcher(),
320 metrics(),
321 manager()));
322 EXPECT_CALL(*ethernet_service, technology())
323 .WillOnce(Return(Technology::kEthernet));
324 EXPECT_CALL(*ethernet_service, Save(storage.get()))
325 .WillOnce(Return(true));
326
327 profile_->set_storage(storage.release());
328 EXPECT_FALSE(profile_->ConfigureService(unknown_service));
329 EXPECT_TRUE(profile_->ConfigureService(ethernet_service));
330}
331
Darin Petkove7c6ad32012-06-29 10:22:09 +0200332TEST_F(DefaultProfileTest, UpdateDevice) {
333 scoped_ptr<MockStore> storage(new MockStore());
334 EXPECT_CALL(*storage, Flush()).WillOnce(Return(true));
335 EXPECT_CALL(*device_, Save(storage.get()))
336 .WillOnce(Return(true))
337 .WillOnce(Return(false));
338 profile_->set_storage(storage.release());
339 EXPECT_TRUE(profile_->UpdateDevice(device_));
340 EXPECT_FALSE(profile_->UpdateDevice(device_));
341}
342
Chris Masone88cbd5f2011-07-03 14:30:04 -0700343} // namespace shill