blob: ac4edb02bc7ab5ea94c09ee0b0d7dd9b67fce0d8 [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"
25
26using std::map;
27using std::string;
Chris Masone877ff982011-09-21 16:18:24 -070028using std::vector;
Chris Masone88cbd5f2011-07-03 14:30:04 -070029using ::testing::_;
Paul Stewart870523b2012-01-11 17:00:42 -080030using ::testing::DoAll;
Chris Masoneaa482372011-09-14 16:40:37 -070031using ::testing::Return;
Paul Stewart870523b2012-01-11 17:00:42 -080032using ::testing::SetArgumentPointee;
Chris Masone88cbd5f2011-07-03 14:30:04 -070033
34namespace shill {
35
36class DefaultProfileTest : public PropertyStoreTest {
37 public:
Chris Masone7aa5f902011-07-11 11:13:35 -070038 DefaultProfileTest()
Chris Masone2176a882011-09-14 22:29:15 -070039 : profile_(new DefaultProfile(control_interface(),
Chris Masone9d779932011-08-25 16:33:41 -070040 manager(),
Chris Masone6515aab2011-10-12 16:19:09 -070041 FilePath(storage_path()),
Paul Stewartd0a3b812012-03-28 22:48:22 -070042 DefaultProfile::kDefaultId,
Chris Masone877ff982011-09-21 16:18:24 -070043 properties_)),
44 device_(new MockDevice(control_interface(),
45 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -080046 metrics(),
Chris Masone877ff982011-09-21 16:18:24 -070047 manager(),
48 "null0",
49 "addr0",
50 0)) {
Chris Masone7aa5f902011-07-11 11:13:35 -070051 }
Chris Masone88cbd5f2011-07-03 14:30:04 -070052
53 virtual ~DefaultProfileTest() {}
54
Chris Masone6515aab2011-10-12 16:19:09 -070055 virtual void SetUp() {
56 PropertyStoreTest::SetUp();
57 FilePath final_path;
58 ASSERT_TRUE(profile_->GetStoragePath(&final_path));
59 scoped_ptr<KeyFileStore> storage(new KeyFileStore(&real_glib_));
60 storage->set_path(final_path);
61 ASSERT_TRUE(storage->Open());
62 profile_->set_storage(storage.release()); // Passes ownership.
63 }
64
Chris Masone88cbd5f2011-07-03 14:30:04 -070065 protected:
Chris Masone2ae797d2011-08-23 20:41:00 -070066 static const char kTestStoragePath[];
67
Chris Masone6515aab2011-10-12 16:19:09 -070068 GLib real_glib_;
Paul Stewart870523b2012-01-11 17:00:42 -080069 scoped_refptr<DefaultProfile> profile_;
Chris Masone877ff982011-09-21 16:18:24 -070070 scoped_refptr<MockDevice> device_;
Chris Masone88cbd5f2011-07-03 14:30:04 -070071 Manager::Properties properties_;
72};
73
Chris Masone2ae797d2011-08-23 20:41:00 -070074const char DefaultProfileTest::kTestStoragePath[] = "/no/where";
75
Chris Masone88cbd5f2011-07-03 14:30:04 -070076TEST_F(DefaultProfileTest, GetProperties) {
77 Error error(Error::kInvalidProperty, "");
78 {
79 map<string, ::DBus::Variant> props;
80 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070081 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070082 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
83 EXPECT_FALSE(props[flimflam::kOfflineModeProperty].reader().get_bool());
84 }
85 properties_.offline_mode = true;
86 {
87 map<string, ::DBus::Variant> props;
88 ::DBus::Error dbus_error;
Chris Masone7aa5f902011-07-11 11:13:35 -070089 DBusAdaptor::GetProperties(profile_->store(), &props, &dbus_error);
Chris Masone88cbd5f2011-07-03 14:30:04 -070090 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
91 EXPECT_TRUE(props[flimflam::kOfflineModeProperty].reader().get_bool());
92 }
93 {
94 Error error(Error::kInvalidProperty, "");
95 EXPECT_FALSE(
mukesh agrawalde29fa82011-09-16 16:16:36 -070096 profile_->mutable_store()->SetBoolProperty(
97 flimflam::kOfflineModeProperty,
98 true,
99 &error));
Chris Masone88cbd5f2011-07-03 14:30:04 -0700100 }
101}
102
Chris Masoneaa482372011-09-14 16:40:37 -0700103TEST_F(DefaultProfileTest, Save) {
Chris Masoneb9c00592011-10-06 13:10:39 -0700104 scoped_ptr<MockStore> storage(new MockStore);
105 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
106 DefaultProfile::kStorageName,
107 DefaultProfile::kDefaultId))
Chris Masoneaa482372011-09-14 16:40:37 -0700108 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700109 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
Paul Stewartd32f4842012-01-11 16:08:13 -0800110 DefaultProfile::kStorageHostName,
Chris Masoneb9c00592011-10-06 13:10:39 -0700111 ""))
Chris Masoneaa482372011-09-14 16:40:37 -0700112 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700113 EXPECT_CALL(*storage.get(), SetBool(DefaultProfile::kStorageId,
114 DefaultProfile::kStorageOfflineMode,
115 false))
Chris Masoneaa482372011-09-14 16:40:37 -0700116 .WillOnce(Return(true));
Paul Stewartd32f4842012-01-11 16:08:13 -0800117 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
118 DefaultProfile::kStorageCheckPortalList,
119 ""))
120 .WillOnce(Return(true));
Paul Stewarte6927402012-01-23 16:11:30 -0800121 EXPECT_CALL(*storage.get(), SetString(DefaultProfile::kStorageId,
122 DefaultProfile::kStoragePortalURL,
123 ""))
124 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800125 EXPECT_CALL(*storage.get(),
126 SetString(DefaultProfile::kStorageId,
127 DefaultProfile::kStoragePortalCheckInterval,
128 "0"))
129 .WillOnce(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700130 EXPECT_CALL(*storage.get(), Flush()).WillOnce(Return(true));
Chris Masone877ff982011-09-21 16:18:24 -0700131
Chris Masoneb9c00592011-10-06 13:10:39 -0700132 EXPECT_CALL(*device_.get(), Save(storage.get())).WillOnce(Return(true));
133 profile_->set_storage(storage.release());
Chris Masone877ff982011-09-21 16:18:24 -0700134
135 manager()->RegisterDevice(device_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700136 ASSERT_TRUE(profile_->Save());
Chris Masone877ff982011-09-21 16:18:24 -0700137 manager()->DeregisterDevice(device_);
Chris Masoneaa482372011-09-14 16:40:37 -0700138}
139
Paul Stewarte6927402012-01-23 16:11:30 -0800140TEST_F(DefaultProfileTest, LoadManagerDefaultProperties) {
141 scoped_ptr<MockStore> storage(new MockStore);
142 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
143 DefaultProfile::kStorageHostName,
144 _))
145 .WillOnce(Return(false));
146 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
147 DefaultProfile::kStorageOfflineMode,
148 _))
149 .WillOnce(Return(false));
150 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
151 DefaultProfile::kStorageCheckPortalList,
152 _))
153 .WillOnce(Return(false));
154 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
155 DefaultProfile::kStoragePortalURL,
156 _))
157 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800158 EXPECT_CALL(*storage.get(),
159 GetString(DefaultProfile::kStorageId,
160 DefaultProfile::kStoragePortalCheckInterval,
161 _))
162 .WillOnce(Return(false));
Paul Stewarte6927402012-01-23 16:11:30 -0800163 profile_->set_storage(storage.release());
164
165 Manager::Properties manager_props;
166 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
167 EXPECT_EQ("", manager_props.host_name);
168 EXPECT_FALSE(manager_props.offline_mode);
Paul Stewartf555cf82012-03-15 14:42:43 -0700169 EXPECT_EQ(PortalDetector::kDefaultCheckPortalList,
170 manager_props.check_portal_list);
Paul Stewarte6927402012-01-23 16:11:30 -0800171 EXPECT_EQ(PortalDetector::kDefaultURL, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800172 EXPECT_EQ(PortalDetector::kDefaultCheckIntervalSeconds,
173 manager_props.portal_check_interval_seconds);
Paul Stewarte6927402012-01-23 16:11:30 -0800174}
175
Paul Stewart870523b2012-01-11 17:00:42 -0800176TEST_F(DefaultProfileTest, LoadManagerProperties) {
177 scoped_ptr<MockStore> storage(new MockStore);
Paul Stewartd32f4842012-01-11 16:08:13 -0800178 const string host_name("hostname");
179 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
180 DefaultProfile::kStorageHostName,
181 _))
182 .WillOnce(DoAll(SetArgumentPointee<2>(host_name), Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800183 EXPECT_CALL(*storage.get(), GetBool(DefaultProfile::kStorageId,
184 DefaultProfile::kStorageOfflineMode,
185 _))
186 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(true)));
187 const string portal_list("technology1,technology2");
188 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
189 DefaultProfile::kStorageCheckPortalList,
190 _))
191 .WillOnce(DoAll(SetArgumentPointee<2>(portal_list), Return(true)));
Paul Stewarte6927402012-01-23 16:11:30 -0800192 const string portal_url("http://www.chromium.org");
193 EXPECT_CALL(*storage.get(), GetString(DefaultProfile::kStorageId,
194 DefaultProfile::kStoragePortalURL,
195 _))
196 .WillOnce(DoAll(SetArgumentPointee<2>(portal_url), Return(true)));
Paul Stewartc681fa02012-03-02 19:40:04 -0800197 const string portal_check_interval_string("10");
198 const int portal_check_interval_int = 10;
199 EXPECT_CALL(*storage.get(),
200 GetString(DefaultProfile::kStorageId,
201 DefaultProfile::kStoragePortalCheckInterval,
202 _))
203 .WillOnce(DoAll(SetArgumentPointee<2>(portal_check_interval_string),
204 Return(true)));
Paul Stewart870523b2012-01-11 17:00:42 -0800205 profile_->set_storage(storage.release());
206
207 Manager::Properties manager_props;
208 ASSERT_TRUE(profile_->LoadManagerProperties(&manager_props));
Paul Stewartd32f4842012-01-11 16:08:13 -0800209 EXPECT_EQ(host_name, manager_props.host_name);
Paul Stewart870523b2012-01-11 17:00:42 -0800210 EXPECT_TRUE(manager_props.offline_mode);
211 EXPECT_EQ(portal_list, manager_props.check_portal_list);
Paul Stewarte6927402012-01-23 16:11:30 -0800212 EXPECT_EQ(portal_url, manager_props.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800213 EXPECT_EQ(portal_check_interval_int,
214 manager_props.portal_check_interval_seconds);
Paul Stewart870523b2012-01-11 17:00:42 -0800215}
216
Chris Masone2ae797d2011-08-23 20:41:00 -0700217TEST_F(DefaultProfileTest, GetStoragePath) {
218 FilePath path;
219 EXPECT_TRUE(profile_->GetStoragePath(&path));
Chris Masone6515aab2011-10-12 16:19:09 -0700220 EXPECT_EQ(storage_path() + "/default.profile", path.value());
Chris Masone2ae797d2011-08-23 20:41:00 -0700221}
222
Paul Stewartf284a232012-05-01 10:24:37 -0700223TEST_F(DefaultProfileTest, ConfigureService) {
224 scoped_ptr<MockStore> storage(new MockStore);
225 EXPECT_CALL(*storage, ContainsGroup(_))
226 .WillRepeatedly(Return(false));
227 EXPECT_CALL(*storage, Flush())
228 .WillOnce(Return(true));
229
230 scoped_refptr<MockService> unknown_service(new MockService(
231 control_interface(),
232 dispatcher(),
233 metrics(),
234 manager()));
235 EXPECT_CALL(*unknown_service, technology())
236 .WillOnce(Return(Technology::kUnknown));
237 EXPECT_CALL(*unknown_service, Save(_)) .Times(0);
238
239 scoped_refptr<MockService> ethernet_service(new MockService(
240 control_interface(),
241 dispatcher(),
242 metrics(),
243 manager()));
244 EXPECT_CALL(*ethernet_service, technology())
245 .WillOnce(Return(Technology::kEthernet));
246 EXPECT_CALL(*ethernet_service, Save(storage.get()))
247 .WillOnce(Return(true));
248
249 profile_->set_storage(storage.release());
250 EXPECT_FALSE(profile_->ConfigureService(unknown_service));
251 EXPECT_TRUE(profile_->ConfigureService(ethernet_service));
252}
253
Chris Masone88cbd5f2011-07-03 14:30:04 -0700254} // namespace shill