blob: c1a1d585a196f34e5a252b4ad1417ddc9c149b8e [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
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080028using base::FilePath;
Chris Masone88cbd5f2011-07-03 14:30:04 -070029using std::map;
30using std::string;
Chris Masone877ff982011-09-21 16:18:24 -070031using std::vector;
Chris Masone88cbd5f2011-07-03 14:30:04 -070032using ::testing::_;
Paul Stewart870523b2012-01-11 17:00:42 -080033using ::testing::DoAll;
Chris Masoneaa482372011-09-14 16:40:37 -070034using ::testing::Return;
Paul Stewart870523b2012-01-11 17:00:42 -080035using ::testing::SetArgumentPointee;
Chris Masone88cbd5f2011-07-03 14:30:04 -070036
37namespace shill {
38
39class DefaultProfileTest : public PropertyStoreTest {
40 public:
Chris Masone7aa5f902011-07-11 11:13:35 -070041 DefaultProfileTest()
Chris Masone2176a882011-09-14 22:29:15 -070042 : profile_(new DefaultProfile(control_interface(),
Thieu Le5133b712013-02-19 14:47:21 -080043 metrics(),
Chris Masone9d779932011-08-25 16:33:41 -070044 manager(),
Chris Masone6515aab2011-10-12 16:19:09 -070045 FilePath(storage_path()),
Paul Stewartd0a3b812012-03-28 22:48:22 -070046 DefaultProfile::kDefaultId,
Chris Masone877ff982011-09-21 16:18:24 -070047 properties_)),
48 device_(new MockDevice(control_interface(),
49 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -080050 metrics(),
Chris Masone877ff982011-09-21 16:18:24 -070051 manager(),
52 "null0",
53 "addr0",
54 0)) {
Chris Masone7aa5f902011-07-11 11:13:35 -070055 }
Chris Masone88cbd5f2011-07-03 14:30:04 -070056
57 virtual ~DefaultProfileTest() {}
58
Chris Masone6515aab2011-10-12 16:19:09 -070059 virtual void SetUp() {
60 PropertyStoreTest::SetUp();
61 FilePath final_path;
62 ASSERT_TRUE(profile_->GetStoragePath(&final_path));
63 scoped_ptr<KeyFileStore> storage(new KeyFileStore(&real_glib_));
64 storage->set_path(final_path);
65 ASSERT_TRUE(storage->Open());
66 profile_->set_storage(storage.release()); // Passes ownership.
67 }
68
Chris Masone88cbd5f2011-07-03 14:30:04 -070069 protected:
Chris Masone2ae797d2011-08-23 20:41:00 -070070 static const char kTestStoragePath[];
71
Chris Masone6515aab2011-10-12 16:19:09 -070072 GLib real_glib_;
Paul Stewart870523b2012-01-11 17:00:42 -080073 scoped_refptr<DefaultProfile> profile_;
Chris Masone877ff982011-09-21 16:18:24 -070074 scoped_refptr<MockDevice> device_;
Chris Masone88cbd5f2011-07-03 14:30:04 -070075 Manager::Properties properties_;
76};
77
Chris Masone2ae797d2011-08-23 20:41:00 -070078const char DefaultProfileTest::kTestStoragePath[] = "/no/where";
79
Chris Masone88cbd5f2011-07-03 14:30:04 -070080TEST_F(DefaultProfileTest, GetProperties) {
81 Error error(Error::kInvalidProperty, "");
82 {
83 map<string, ::DBus::Variant> props;
84 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070085 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070086 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
87 EXPECT_FALSE(props[flimflam::kOfflineModeProperty].reader().get_bool());
88 }
89 properties_.offline_mode = true;
90 {
91 map<string, ::DBus::Variant> props;
92 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070093 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070094 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
95 EXPECT_TRUE(props[flimflam::kOfflineModeProperty].reader().get_bool());
96 }
97 {
98 Error error(Error::kInvalidProperty, "");
99 EXPECT_FALSE(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700100 profile_->mutable_store()->SetBoolProperty(
101 flimflam::kOfflineModeProperty,
102 true,
103 &error));
Chris Masone88cbd5f2011-07-03 14:30:04 -0700104 }
105}
106
Chris Masoneaa482372011-09-14 16:40:37 -0700107TEST_F(DefaultProfileTest, Save) {
Chris Masoneb9c00592011-10-06 13:10:39 -0700108 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700109 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
110 DefaultProfile::kStorageArpGateway,
111 true))
112 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700113 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
114 DefaultProfile::kStorageName,
115 DefaultProfile::kDefaultId))
Chris Masoneaa482372011-09-14 16:40:37 -0700116 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700117 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
Paul Stewartd32f4842012-01-11 16:08:13 -0800118 DefaultProfile::kStorageHostName,
Chris Masoneb9c00592011-10-06 13:10:39 -0700119 ""))
Chris Masoneaa482372011-09-14 16:40:37 -0700120 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700121 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
122 DefaultProfile::kStorageOfflineMode,
123 false))
Chris Masoneaa482372011-09-14 16:40:37 -0700124 .WillOnce(Return(true));
Paul Stewartd32f4842012-01-11 16:08:13 -0800125 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
126 DefaultProfile::kStorageCheckPortalList,
127 ""))
128 .WillOnce(Return(true));
Paul Stewart036dba02012-08-07 12:34:41 -0700129 EXPECT_CALL(*storage.get(),
130 SetString(DefaultProfile::kStorageId,
Paul Stewart4d5efb72012-09-17 12:24:34 -0700131 DefaultProfile::kStorageIgnoredDNSSearchPaths,
132 ""))
133 .WillOnce(Return(true));
134 EXPECT_CALL(*storage.get(),
135 SetString(DefaultProfile::kStorageId,
Paul Stewart036dba02012-08-07 12:34:41 -0700136 DefaultProfile::kStorageLinkMonitorTechnologies,
137 ""))
138 .WillOnce(Return(true));
Paul Stewarte6927402012-01-23 16:11:30 -0800139 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
140 DefaultProfile::kStoragePortalURL,
141 ""))
142 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800143 EXPECT_CALL(*storage.get(),
144 SetString(DefaultProfile::kStorageId,
145 DefaultProfile::kStoragePortalCheckInterval,
146 "0"))
147 .WillOnce(Return(true));
Paul Stewartbf667612012-06-29 14:49:54 -0700148 EXPECT_CALL(*storage.get(),
149 SetString(DefaultProfile::kStorageId,
150 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
151 ""))
152 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700153 EXPECT_CALL(*storage.get(), Flush()).WillOnce(Return(true));
Chris Masone877ff982011-09-21 16:18:24 -0700154
Paul Stewart212d60f2012-07-12 10:59:13 -0700155 EXPECT_CALL(*device_.get(), Save(storage.get())).Times(0);
Chris Masoneb9c00592011-10-06 13:10:39 -0700156 profile_->set_storage(storage.release());
Chris Masone877ff982011-09-21 16:18:24 -0700157
158 manager()->RegisterDevice(device_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700159 ASSERT_TRUE(profile_->Save());
Chris Masone877ff982011-09-21 16:18:24 -0700160 manager()->DeregisterDevice(device_);
Chris Masoneaa482372011-09-14 16:40:37 -0700161}
162
Paul Stewarte6927402012-01-23 16:11:30 -0800163TEST_F(DefaultProfileTest, LoadManagerDefaultProperties) {
164 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700165 Manager::Properties manager_props;
166 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
167 DefaultProfile::kStorageArpGateway,
168 &manager_props.arp_gateway))
169 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800170 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
171 DefaultProfile::kStorageHostName,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700172 &manager_props.host_name))
Paul Stewarte6927402012-01-23 16:11:30 -0800173 .WillOnce(Return(false));
174 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
175 DefaultProfile::kStorageOfflineMode,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700176 &manager_props.offline_mode))
Paul Stewarte6927402012-01-23 16:11:30 -0800177 .WillOnce(Return(false));
178 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
179 DefaultProfile::kStorageCheckPortalList,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700180 &manager_props.check_portal_list))
Paul Stewarte6927402012-01-23 16:11:30 -0800181 .WillOnce(Return(false));
Paul Stewart036dba02012-08-07 12:34:41 -0700182 EXPECT_CALL(*storage.get(),
183 GetString(DefaultProfile::kStorageId,
Paul Stewart4d5efb72012-09-17 12:24:34 -0700184 DefaultProfile::kStorageIgnoredDNSSearchPaths,
185 &manager_props.ignored_dns_search_paths))
186 .WillOnce(Return(false));
187 EXPECT_CALL(*storage.get(),
188 GetString(DefaultProfile::kStorageId,
Paul Stewart036dba02012-08-07 12:34:41 -0700189 DefaultProfile::kStorageLinkMonitorTechnologies,
190 _))
191 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800192 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
193 DefaultProfile::kStoragePortalURL,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700194 &manager_props.portal_url))
Paul Stewarte6927402012-01-23 16:11:30 -0800195 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800196 EXPECT_CALL(*storage.get(),
197 GetString(DefaultProfile::kStorageId,
198 DefaultProfile::kStoragePortalCheckInterval,
199 _))
200 .WillOnce(Return(false));
Paul Stewartbf667612012-06-29 14:49:54 -0700201 EXPECT_CALL(*storage.get(),
202 GetString(DefaultProfile::kStorageId,
203 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
204 _))
205 .WillOnce(Return(false));
Paul Stewart036dba02012-08-07 12:34:41 -0700206
Paul Stewarte6927402012-01-23 16:11:30 -0800207 profile_->set_storage(storage.release());
208
Paul Stewarte6927402012-01-23 16:11:30 -0800209 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700210 EXPECT_TRUE(manager_props.arp_gateway);
Paul Stewarte6927402012-01-23 16:11:30 -0800211 EXPECT_EQ("", manager_props.host_name);
212 EXPECT_FALSE(manager_props.offline_mode);
Paul Stewartf555cf82012-03-15 14:42:43 -0700213 EXPECT_EQ(PortalDetector::kDefaultCheckPortalList,
214 manager_props.check_portal_list);
Paul Stewart4d5efb72012-09-17 12:24:34 -0700215 EXPECT_EQ(Resolver::kDefaultIgnoredSearchList,
216 manager_props.ignored_dns_search_paths);
Paul Stewart036dba02012-08-07 12:34:41 -0700217 EXPECT_EQ(LinkMonitor::kDefaultLinkMonitorTechnologies,
218 manager_props.link_monitor_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800219 EXPECT_EQ(PortalDetector::kDefaultURL, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800220 EXPECT_EQ(PortalDetector::kDefaultCheckIntervalSeconds,
221 manager_props.portal_check_interval_seconds);
Paul Stewartbf667612012-06-29 14:49:54 -0700222 EXPECT_EQ(Resolver::kDefaultShortTimeoutTechnologies,
223 manager_props.short_dns_timeout_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800224}
225
Paul Stewart870523b2012-01-11 17:00:42 -0800226TEST_F(DefaultProfileTest, LoadManagerProperties) {
227 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd32f4842012-01-11 16:08:13 -0800228 const string host_name("hostname");
Paul Stewartd408fdf2012-05-07 17:15:57 -0700229 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
230 DefaultProfile::kStorageArpGateway,
231 _))
232 .WillOnce(DoAll(SetArgumentPointee<2>(false), Return(true)));
Paul Stewartd32f4842012-01-11 16:08:13 -0800233 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
234 DefaultProfile::kStorageHostName,
235 _))
236 .WillOnce(DoAll(SetArgumentPointee<2>(host_name), Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800237 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
238 DefaultProfile::kStorageOfflineMode,
239 _))
240 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(true)));
241 const string portal_list("technology1,technology2");
242 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
243 DefaultProfile::kStorageCheckPortalList,
244 _))
245 .WillOnce(DoAll(SetArgumentPointee<2>(portal_list), Return(true)));
Paul Stewart4d5efb72012-09-17 12:24:34 -0700246 const string ignored_paths("chromium.org,google.com");
247 EXPECT_CALL(*storage.get(),
248 GetString(DefaultProfile::kStorageId,
249 DefaultProfile::kStorageIgnoredDNSSearchPaths,
250 _))
251 .WillOnce(DoAll(SetArgumentPointee<2>(ignored_paths), Return(true)));
Paul Stewart036dba02012-08-07 12:34:41 -0700252 const string link_monitor_technologies("ethernet,wimax");
253 EXPECT_CALL(*storage.get(),
254 GetString(DefaultProfile::kStorageId,
255 DefaultProfile::kStorageLinkMonitorTechnologies,
256 _))
257 .WillOnce(DoAll(SetArgumentPointee<2>(link_monitor_technologies),
258 Return(true)));
Paul Stewarte6927402012-01-23 16:11:30 -0800259 const string portal_url("http://www.chromium.org");
260 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
261 DefaultProfile::kStoragePortalURL,
262 _))
263 .WillOnce(DoAll(SetArgumentPointee<2>(portal_url), Return(true)));
Paul Stewartc681fa02012-03-02 19:40:04 -0800264 const string portal_check_interval_string("10");
265 const int portal_check_interval_int = 10;
266 EXPECT_CALL(*storage.get(),
267 GetString(DefaultProfile::kStorageId,
268 DefaultProfile::kStoragePortalCheckInterval,
269 _))
270 .WillOnce(DoAll(SetArgumentPointee<2>(portal_check_interval_string),
271 Return(true)));
Paul Stewartbf667612012-06-29 14:49:54 -0700272 const string short_dns_timeout_technologies("wimax,cellular");
273 EXPECT_CALL(*storage.get(),
274 GetString(DefaultProfile::kStorageId,
275 DefaultProfile::kStorageShortDNSTimeoutTechnologies,
276 _))
277 .WillOnce(DoAll(SetArgumentPointee<2>(short_dns_timeout_technologies),
278 Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800279 profile_->set_storage(storage.release());
280
281 Manager::Properties manager_props;
282 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd408fdf2012-05-07 17:15:57 -0700283 EXPECT_FALSE(manager_props.arp_gateway);
Paul Stewartd32f4842012-01-11 16:08:13 -0800284 EXPECT_EQ(host_name, manager_props.host_name);
Paul Stewart870523b2012-01-11 17:00:42 -0800285 EXPECT_TRUE(manager_props.offline_mode);
286 EXPECT_EQ(portal_list, manager_props.check_portal_list);
Paul Stewart4d5efb72012-09-17 12:24:34 -0700287 EXPECT_EQ(ignored_paths, manager_props.ignored_dns_search_paths);
Paul Stewart036dba02012-08-07 12:34:41 -0700288 EXPECT_EQ(link_monitor_technologies,
289 manager_props.link_monitor_technologies);
Paul Stewarte6927402012-01-23 16:11:30 -0800290 EXPECT_EQ(portal_url, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800291 EXPECT_EQ(portal_check_interval_int,
292 manager_props.portal_check_interval_seconds);
Paul Stewartbf667612012-06-29 14:49:54 -0700293 EXPECT_EQ(short_dns_timeout_technologies,
294 manager_props.short_dns_timeout_technologies);
Paul Stewart870523b2012-01-11 17:00:42 -0800295}
296
Chris Masone2ae797d2011-08-23 20:41:00 -0700297TEST_F(DefaultProfileTest, GetStoragePath) {
298 FilePath path;
299 EXPECT_TRUE(profile_->GetStoragePath(&path));
Chris Masone6515aab2011-10-12 16:19:09 -0700300 EXPECT_EQ(storage_path() + "/default.profile", path.value());
Chris Masone2ae797d2011-08-23 20:41:00 -0700301}
302
Paul Stewartf284a232012-05-01 10:24:37 -0700303TEST_F(DefaultProfileTest, ConfigureService) {
304 scoped_ptr<MockStore> storage(new MockStore);
305 EXPECT_CALL(*storage, ContainsGroup(_))
306 .WillRepeatedly(Return(false));
307 EXPECT_CALL(*storage, Flush())
308 .WillOnce(Return(true));
309
310 scoped_refptr<MockService> unknown_service(new MockService(
311 control_interface(),
312 dispatcher(),
313 metrics(),
314 manager()));
315 EXPECT_CALL(*unknown_service, technology())
316 .WillOnce(Return(Technology::kUnknown));
317 EXPECT_CALL(*unknown_service, Save(_)) .Times(0);
318
319 scoped_refptr<MockService> ethernet_service(new MockService(
320 control_interface(),
321 dispatcher(),
322 metrics(),
323 manager()));
324 EXPECT_CALL(*ethernet_service, technology())
325 .WillOnce(Return(Technology::kEthernet));
326 EXPECT_CALL(*ethernet_service, Save(storage.get()))
327 .WillOnce(Return(true));
328
329 profile_->set_storage(storage.release());
330 EXPECT_FALSE(profile_->ConfigureService(unknown_service));
331 EXPECT_TRUE(profile_->ConfigureService(ethernet_service));
332}
333
Darin Petkove7c6ad32012-06-29 10:22:09 +0200334TEST_F(DefaultProfileTest, UpdateDevice) {
335 scoped_ptr<MockStore> storage(new MockStore());
336 EXPECT_CALL(*storage, Flush()).WillOnce(Return(true));
337 EXPECT_CALL(*device_, Save(storage.get()))
338 .WillOnce(Return(true))
339 .WillOnce(Return(false));
340 profile_->set_storage(storage.release());
341 EXPECT_TRUE(profile_->UpdateDevice(device_));
342 EXPECT_FALSE(profile_->UpdateDevice(device_));
343}
344
Chris Masone88cbd5f2011-07-03 14:30:04 -0700345} // namespace shill