blob: ab9372b99bf005a0b8baf547fbcafe3a5b9a6d8a [file] [log] [blame]
Chris Masone9be4a9d2011-05-16 15:44:09 -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.
Chris Masone3bd3c8c2011-06-13 08:20:26 -07004
5#include "shill/manager.h"
6
Chris Masone6791a432011-07-12 13:23:19 -07007#include <set>
8
Chris Masone9be4a9d2011-05-16 15:44:09 -07009#include <glib.h>
10
Chris Masone9be4a9d2011-05-16 15:44:09 -070011#include <base/logging.h>
Paul Stewart5dc40aa2011-10-28 19:43:43 -070012#include <base/memory/scoped_temp_dir.h>
Chris Masone6791a432011-07-12 13:23:19 -070013#include <base/stl_util-inl.h>
Paul Stewart5dc40aa2011-10-28 19:43:43 -070014#include <base/stringprintf.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070015#include <chromeos/dbus/service_constants.h>
Chris Masone7156c922011-08-23 20:36:21 -070016#include <gmock/gmock.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070017#include <gtest/gtest.h>
Chris Masone9be4a9d2011-05-16 15:44:09 -070018
mukesh agrawal32399322011-09-01 10:53:43 -070019#include "shill/adaptor_interfaces.h"
Chris Masone6515aab2011-10-12 16:19:09 -070020#include "shill/ephemeral_profile.h"
mukesh agrawal32399322011-09-01 10:53:43 -070021#include "shill/error.h"
Chris Masone6515aab2011-10-12 16:19:09 -070022#include "shill/glib.h"
23#include "shill/key_file_store.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070024#include "shill/key_value_store.h"
mukesh agrawal32399322011-09-01 10:53:43 -070025#include "shill/mock_adaptors.h"
Paul Stewartc1dec4d2011-12-08 15:25:28 -080026#include "shill/mock_connection.h"
Chris Masoned7732e42011-05-20 11:08:56 -070027#include "shill/mock_control.h"
Chris Masone9be4a9d2011-05-16 15:44:09 -070028#include "shill/mock_device.h"
Paul Stewartc1dec4d2011-12-08 15:25:28 -080029#include "shill/mock_device_info.h"
Chris Masone7aa5f902011-07-11 11:13:35 -070030#include "shill/mock_glib.h"
31#include "shill/mock_profile.h"
Chris Masone9be4a9d2011-05-16 15:44:09 -070032#include "shill/mock_service.h"
Chris Masoneb9c00592011-10-06 13:10:39 -070033#include "shill/mock_store.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070034#include "shill/mock_wifi.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070035#include "shill/property_store_unittest.h"
Chris Masone6515aab2011-10-12 16:19:09 -070036#include "shill/service_under_test.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070037#include "shill/wifi_service.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070038
39using std::map;
Chris Masone6791a432011-07-12 13:23:19 -070040using std::set;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070041using std::string;
42using std::vector;
43
Chris Masone9be4a9d2011-05-16 15:44:09 -070044namespace shill {
Chris Masone9be4a9d2011-05-16 15:44:09 -070045using ::testing::_;
Chris Masone6515aab2011-10-12 16:19:09 -070046using ::testing::AnyNumber;
Gaurav Shah435de2c2011-11-17 19:01:07 -080047using ::testing::ContainerEq;
Paul Stewart22aa71b2011-09-16 12:15:11 -070048using ::testing::Ne;
Chris Masone9be4a9d2011-05-16 15:44:09 -070049using ::testing::NiceMock;
50using ::testing::Return;
Gaurav Shah435de2c2011-11-17 19:01:07 -080051using ::testing::StrEq;
Chris Masone9d779932011-08-25 16:33:41 -070052using ::testing::Test;
Chris Masone9be4a9d2011-05-16 15:44:09 -070053
Chris Masone3bd3c8c2011-06-13 08:20:26 -070054class ManagerTest : public PropertyStoreTest {
Chris Masone9be4a9d2011-05-16 15:44:09 -070055 public:
Chris Masone3c3f6a12011-07-01 10:01:41 -070056 ManagerTest()
Paul Stewart22aa71b2011-09-16 12:15:11 -070057 : mock_wifi_(new NiceMock<MockWiFi>(control_interface(),
mukesh agrawal7a4e4002011-09-06 11:26:05 -070058 dispatcher(),
59 manager(),
60 "wifi0",
61 "addr4",
Paul Stewartc1dec4d2011-12-08 15:25:28 -080062 4)),
63 device_info_(new NiceMock<MockDeviceInfo>(
64 control_interface(),
65 reinterpret_cast<EventDispatcher*>(NULL),
66 reinterpret_cast<Manager*>(NULL))),
67 manager_adaptor_(new NiceMock<ManagerMockAdaptor>()) {
Paul Stewart22aa71b2011-09-16 12:15:11 -070068 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(),
69 dispatcher(),
70 manager(),
71 "null0",
72 "addr0",
73 0));
74 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(),
75 dispatcher(),
76 manager(),
77 "null1",
78 "addr1",
79 1));
80 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(),
81 dispatcher(),
82 manager(),
83 "null2",
84 "addr2",
85 2));
Gaurav Shah435de2c2011-11-17 19:01:07 -080086 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(),
87 dispatcher(),
88 manager(),
89 "null3",
90 "addr3",
91 3));
Paul Stewart5dc40aa2011-10-28 19:43:43 -070092 manager()->connect_profiles_to_rpc_ = false;
Paul Stewartc1dec4d2011-12-08 15:25:28 -080093
94 // Replace the manager's adaptor with a quieter one, and one
95 // we can do EXPECT*() against. Passes ownership.
96 manager()->adaptor_.reset(manager_adaptor_);
Chris Masone3c3f6a12011-07-01 10:01:41 -070097 }
Chris Masone3bd3c8c2011-06-13 08:20:26 -070098 virtual ~ManagerTest() {}
Chris Masone9be4a9d2011-05-16 15:44:09 -070099
Paul Stewartfdd16072011-09-16 12:41:35 -0700100 bool IsDeviceRegistered(const DeviceRefPtr &device,
101 Technology::Identifier tech) {
Chris Masonec1e50412011-06-07 13:04:53 -0700102 vector<DeviceRefPtr> devices;
Chris Masone9d779932011-08-25 16:33:41 -0700103 manager()->FilterByTechnology(tech, &devices);
Chris Masone2b105542011-06-22 10:58:09 -0700104 return (devices.size() == 1 && devices[0].get() == device.get());
Chris Masone9be4a9d2011-05-16 15:44:09 -0700105 }
Paul Stewart22aa71b2011-09-16 12:15:11 -0700106 bool ServiceOrderIs(ServiceRefPtr svc1, ServiceRefPtr svc2);
Chris Masone9be4a9d2011-05-16 15:44:09 -0700107
Paul Stewarta849a3d2011-11-03 05:54:09 -0700108 void AdoptProfile(Manager *manager, ProfileRefPtr profile) {
109 manager->profiles_.push_back(profile);
110 }
111
Chris Masone6515aab2011-10-12 16:19:09 -0700112 Profile *CreateProfileForManager(Manager *manager, GLib *glib) {
113 Profile::Identifier id("rather", "irrelevant");
114 scoped_ptr<Profile> profile(new Profile(control_interface(),
115 manager,
116 id,
117 "",
118 false));
119 FilePath final_path(storage_path());
120 final_path = final_path.Append("test.profile");
121 scoped_ptr<KeyFileStore> storage(new KeyFileStore(glib));
122 storage->set_path(final_path);
123 if (!storage->Open())
124 return NULL;
125 profile->set_storage(storage.release()); // Passes ownership.
126 return profile.release();
127 }
128
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700129 bool CreateBackingStoreForService(ScopedTempDir *temp_dir,
130 const string &profile_identifier,
131 const string &service_name) {
132 GLib glib;
133 KeyFileStore store(&glib);
134 store.set_path(temp_dir->path().Append(profile_identifier + ".profile"));
135 return store.Open() &&
136 store.SetString(service_name, "rather", "irrelevant") &&
137 store.Close();
138 }
139
140 Error::Type TestCreateProfile(Manager *manager, const string &name) {
141 Error error;
142 manager->CreateProfile(name, &error);
143 return error.type();
144 }
145
146 Error::Type TestPopAnyProfile(Manager *manager) {
147 Error error;
148 manager->PopAnyProfile(&error);
149 return error.type();
150 }
151
152 Error::Type TestPopProfile(Manager *manager, const string &name) {
153 Error error;
154 manager->PopProfile(name, &error);
155 return error.type();
156 }
157
158 Error::Type TestPushProfile(Manager *manager, const string &name) {
159 Error error;
160 manager->PushProfile(name, &error);
161 return error.type();
162 }
Paul Stewartf1ce5d22011-05-19 13:10:20 -0700163 protected:
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700164 scoped_refptr<MockWiFi> mock_wifi_;
Paul Stewart22aa71b2011-09-16 12:15:11 -0700165 vector<scoped_refptr<MockDevice> > mock_devices_;
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800166 scoped_ptr<MockDeviceInfo> device_info_;
167
168 // This pointer is owned by the manager, and only tracked here for EXPECT*()
169 ManagerMockAdaptor *manager_adaptor_;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700170};
171
Paul Stewart22aa71b2011-09-16 12:15:11 -0700172bool ManagerTest::ServiceOrderIs(ServiceRefPtr svc0, ServiceRefPtr svc1) {
173 return (svc0.get() == manager()->services_[0].get() &&
174 svc1.get() == manager()->services_[1].get());
175}
176
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700177TEST_F(ManagerTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700178 EXPECT_TRUE(manager()->store().Contains(flimflam::kStateProperty));
179 EXPECT_FALSE(manager()->store().Contains(""));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700180}
181
Chris Masone9be4a9d2011-05-16 15:44:09 -0700182TEST_F(ManagerTest, DeviceRegistration) {
Paul Stewart22aa71b2011-09-16 12:15:11 -0700183 ON_CALL(*mock_devices_[0].get(), TechnologyIs(Technology::kEthernet))
Chris Masone3c3f6a12011-07-01 10:01:41 -0700184 .WillByDefault(Return(true));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700185 ON_CALL(*mock_devices_[1].get(), TechnologyIs(Technology::kWifi))
Chris Masone9be4a9d2011-05-16 15:44:09 -0700186 .WillByDefault(Return(true));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700187 ON_CALL(*mock_devices_[2].get(), TechnologyIs(Technology::kCellular))
Darin Petkov6f9eaa32011-08-09 15:26:44 -0700188 .WillByDefault(Return(true));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700189
Paul Stewart22aa71b2011-09-16 12:15:11 -0700190 manager()->RegisterDevice(mock_devices_[0]);
191 manager()->RegisterDevice(mock_devices_[1]);
192 manager()->RegisterDevice(mock_devices_[2]);
Chris Masone9be4a9d2011-05-16 15:44:09 -0700193
Paul Stewart22aa71b2011-09-16 12:15:11 -0700194 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet));
195 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi));
196 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[2], Technology::kCellular));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700197}
198
Paul Stewarta41e38d2011-11-11 07:47:29 -0800199TEST_F(ManagerTest, DeviceRegistrationAndStart) {
200 manager()->running_ = true;
201 mock_devices_[0]->powered_ = true;
202 mock_devices_[1]->powered_ = false;
203 EXPECT_CALL(*mock_devices_[0].get(), Start())
204 .Times(1);
205 EXPECT_CALL(*mock_devices_[1].get(), Start())
206 .Times(0);
207 manager()->RegisterDevice(mock_devices_[0]);
208 manager()->RegisterDevice(mock_devices_[1]);
209}
210
211TEST_F(ManagerTest, DeviceRegistrationWithProfile) {
212 MockProfile *profile = new MockProfile(control_interface(), manager(), "");
213 DeviceRefPtr device_ref(mock_devices_[0].get());
214 AdoptProfile(manager(), profile); // Passes ownership.
215 EXPECT_CALL(*profile, ConfigureDevice(device_ref));
216 EXPECT_CALL(*profile, Save());
217 manager()->RegisterDevice(mock_devices_[0]);
218}
219
Chris Masone9be4a9d2011-05-16 15:44:09 -0700220TEST_F(ManagerTest, DeviceDeregistration) {
Paul Stewart22aa71b2011-09-16 12:15:11 -0700221 ON_CALL(*mock_devices_[0].get(), TechnologyIs(Technology::kEthernet))
Chris Masone3c3f6a12011-07-01 10:01:41 -0700222 .WillByDefault(Return(true));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700223 ON_CALL(*mock_devices_[1].get(), TechnologyIs(Technology::kWifi))
Chris Masone9be4a9d2011-05-16 15:44:09 -0700224 .WillByDefault(Return(true));
225
Gaurav Shah435de2c2011-11-17 19:01:07 -0800226 manager()->RegisterDevice(mock_devices_[0]);
227 manager()->RegisterDevice(mock_devices_[1]);
Chris Masone9be4a9d2011-05-16 15:44:09 -0700228
Paul Stewart22aa71b2011-09-16 12:15:11 -0700229 ASSERT_TRUE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet));
230 ASSERT_TRUE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700231
Paul Stewart22aa71b2011-09-16 12:15:11 -0700232 EXPECT_CALL(*mock_devices_[0].get(), Stop());
Gaurav Shah435de2c2011-11-17 19:01:07 -0800233 manager()->DeregisterDevice(mock_devices_[0]);
Paul Stewart22aa71b2011-09-16 12:15:11 -0700234 EXPECT_FALSE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700235
Paul Stewart22aa71b2011-09-16 12:15:11 -0700236 EXPECT_CALL(*mock_devices_[1].get(), Stop());
Gaurav Shah435de2c2011-11-17 19:01:07 -0800237 manager()->DeregisterDevice(mock_devices_[1]);
Paul Stewart22aa71b2011-09-16 12:15:11 -0700238 EXPECT_FALSE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700239}
240
241TEST_F(ManagerTest, ServiceRegistration) {
Chris Masone9d779932011-08-25 16:33:41 -0700242 // It's much easier and safer to use a real GLib for this test.
243 GLib glib;
Chris Masone2176a882011-09-14 22:29:15 -0700244 Manager manager(control_interface(),
245 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700246 &glib,
247 run_path(),
248 storage_path(),
249 string());
Chris Masone6515aab2011-10-12 16:19:09 -0700250 ProfileRefPtr profile(CreateProfileForManager(&manager, &glib));
251 ASSERT_TRUE(profile.get());
Paul Stewarta849a3d2011-11-03 05:54:09 -0700252 AdoptProfile(&manager, profile);
Chris Masone6515aab2011-10-12 16:19:09 -0700253
Chris Masone9be4a9d2011-05-16 15:44:09 -0700254 scoped_refptr<MockService> mock_service(
Chris Masone2176a882011-09-14 22:29:15 -0700255 new NiceMock<MockService>(control_interface(),
256 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700257 &manager));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700258 scoped_refptr<MockService> mock_service2(
Chris Masone2176a882011-09-14 22:29:15 -0700259 new NiceMock<MockService>(control_interface(),
260 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700261 &manager));
mukesh agrawal51a7e932011-07-27 16:18:26 -0700262 string service1_name(mock_service->UniqueName());
263 string service2_name(mock_service2->UniqueName());
264
265 EXPECT_CALL(*mock_service.get(), GetRpcIdentifier())
266 .WillRepeatedly(Return(service1_name));
Chris Masone6791a432011-07-12 13:23:19 -0700267 EXPECT_CALL(*mock_service2.get(), GetRpcIdentifier())
mukesh agrawal51a7e932011-07-27 16:18:26 -0700268 .WillRepeatedly(Return(service2_name));
mukesh agrawal32399322011-09-01 10:53:43 -0700269 // TODO(quiche): make this EXPECT_CALL work (crosbug.com/20154)
Chris Masone9d779932011-08-25 16:33:41 -0700270 // EXPECT_CALL(*dynamic_cast<ManagerMockAdaptor *>(manager.adaptor_.get()),
mukesh agrawal32399322011-09-01 10:53:43 -0700271 // EmitRpcIdentifierArrayChanged(flimflam::kServicesProperty, _));
Chris Masone9be4a9d2011-05-16 15:44:09 -0700272
Chris Masone9d779932011-08-25 16:33:41 -0700273 manager.RegisterService(mock_service);
274 manager.RegisterService(mock_service2);
Chris Masone9be4a9d2011-05-16 15:44:09 -0700275
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800276 Error error;
277 vector<string> rpc_ids = manager.EnumerateAvailableServices(&error);
Chris Masone6791a432011-07-12 13:23:19 -0700278 set<string> ids(rpc_ids.begin(), rpc_ids.end());
mukesh agrawal51a7e932011-07-27 16:18:26 -0700279 EXPECT_EQ(2, ids.size());
280 EXPECT_TRUE(ContainsKey(ids, mock_service->GetRpcIdentifier()));
281 EXPECT_TRUE(ContainsKey(ids, mock_service2->GetRpcIdentifier()));
Chris Masone6791a432011-07-12 13:23:19 -0700282
Chris Masone9d779932011-08-25 16:33:41 -0700283 EXPECT_TRUE(manager.FindService(service1_name).get() != NULL);
284 EXPECT_TRUE(manager.FindService(service2_name).get() != NULL);
285
286 manager.Stop();
Chris Masone9be4a9d2011-05-16 15:44:09 -0700287}
288
Chris Masone6515aab2011-10-12 16:19:09 -0700289TEST_F(ManagerTest, RegisterKnownService) {
290 // It's much easier and safer to use a real GLib for this test.
291 GLib glib;
292 Manager manager(control_interface(),
293 dispatcher(),
294 &glib,
295 run_path(),
296 storage_path(),
297 string());
298 ProfileRefPtr profile(CreateProfileForManager(&manager, &glib));
299 ASSERT_TRUE(profile.get());
Paul Stewarta849a3d2011-11-03 05:54:09 -0700300 AdoptProfile(&manager, profile);
Chris Masone6515aab2011-10-12 16:19:09 -0700301 {
302 ServiceRefPtr service1(new ServiceUnderTest(control_interface(),
303 dispatcher(),
304 &manager));
Chris Masone6515aab2011-10-12 16:19:09 -0700305 ASSERT_TRUE(profile->AdoptService(service1));
306 ASSERT_TRUE(profile->ContainsService(service1));
307 } // Force destruction of service1.
308
309 ServiceRefPtr service2(new ServiceUnderTest(control_interface(),
310 dispatcher(),
311 &manager));
312 manager.RegisterService(service2);
313 EXPECT_EQ(service2->profile().get(), profile.get());
314 manager.Stop();
315}
316
317TEST_F(ManagerTest, RegisterUnknownService) {
318 // It's much easier and safer to use a real GLib for this test.
319 GLib glib;
320 Manager manager(control_interface(),
321 dispatcher(),
322 &glib,
323 run_path(),
324 storage_path(),
325 string());
326 ProfileRefPtr profile(CreateProfileForManager(&manager, &glib));
327 ASSERT_TRUE(profile.get());
Paul Stewarta849a3d2011-11-03 05:54:09 -0700328 AdoptProfile(&manager, profile);
Chris Masone6515aab2011-10-12 16:19:09 -0700329 {
330 ServiceRefPtr service1(new ServiceUnderTest(control_interface(),
331 dispatcher(),
332 &manager));
Chris Masone6515aab2011-10-12 16:19:09 -0700333 ASSERT_TRUE(profile->AdoptService(service1));
334 ASSERT_TRUE(profile->ContainsService(service1));
335 } // Force destruction of service1.
336 scoped_refptr<MockService> mock_service2(
337 new NiceMock<MockService>(control_interface(),
338 dispatcher(),
339 &manager));
340 EXPECT_CALL(*mock_service2.get(), GetStorageIdentifier())
341 .WillRepeatedly(Return(mock_service2->UniqueName()));
342 manager.RegisterService(mock_service2);
343 EXPECT_NE(mock_service2->profile().get(), profile.get());
344 manager.Stop();
345}
346
Chris Masonea8a2c252011-06-27 22:16:30 -0700347TEST_F(ManagerTest, GetProperties) {
Chris Masoneb9c00592011-10-06 13:10:39 -0700348 ProfileRefPtr profile(new MockProfile(control_interface(), manager(), ""));
Paul Stewarta849a3d2011-11-03 05:54:09 -0700349 AdoptProfile(manager(), profile);
Chris Masonea8a2c252011-06-27 22:16:30 -0700350 map<string, ::DBus::Variant> props;
351 Error error(Error::kInvalidProperty, "");
352 {
353 ::DBus::Error dbus_error;
354 string expected("portal_list");
mukesh agrawalde29fa82011-09-16 16:16:36 -0700355 manager()->mutable_store()->SetStringProperty(
356 flimflam::kCheckPortalListProperty,
357 expected,
358 &error);
Chris Masone9d779932011-08-25 16:33:41 -0700359 DBusAdaptor::GetProperties(manager()->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700360 ASSERT_FALSE(props.find(flimflam::kCheckPortalListProperty) == props.end());
361 EXPECT_EQ(props[flimflam::kCheckPortalListProperty].reader().get_string(),
362 expected);
363 }
364 {
365 ::DBus::Error dbus_error;
366 bool expected = true;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700367 manager()->mutable_store()->SetBoolProperty(flimflam::kOfflineModeProperty,
368 expected,
369 &error);
Chris Masone9d779932011-08-25 16:33:41 -0700370 DBusAdaptor::GetProperties(manager()->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700371 ASSERT_FALSE(props.find(flimflam::kOfflineModeProperty) == props.end());
372 EXPECT_EQ(props[flimflam::kOfflineModeProperty].reader().get_bool(),
373 expected);
374 }
375}
376
Chris Masone3c3f6a12011-07-01 10:01:41 -0700377TEST_F(ManagerTest, GetDevicesProperty) {
Chris Masoneb9c00592011-10-06 13:10:39 -0700378 ProfileRefPtr profile(new MockProfile(control_interface(), manager(), ""));
Paul Stewarta849a3d2011-11-03 05:54:09 -0700379 AdoptProfile(manager(), profile);
Gaurav Shah435de2c2011-11-17 19:01:07 -0800380 manager()->RegisterDevice(mock_devices_[0]);
381 manager()->RegisterDevice(mock_devices_[1]);
Chris Masone3c3f6a12011-07-01 10:01:41 -0700382 {
383 map<string, ::DBus::Variant> props;
384 ::DBus::Error dbus_error;
Chris Masone9d779932011-08-25 16:33:41 -0700385 DBusAdaptor::GetProperties(manager()->store(), &props, &dbus_error);
Chris Masone3c3f6a12011-07-01 10:01:41 -0700386 ASSERT_FALSE(props.find(flimflam::kDevicesProperty) == props.end());
387 Strings devices =
388 props[flimflam::kDevicesProperty].operator vector<string>();
389 EXPECT_EQ(2, devices.size());
390 }
Chris Masone3c3f6a12011-07-01 10:01:41 -0700391}
392
Chris Masone6791a432011-07-12 13:23:19 -0700393TEST_F(ManagerTest, MoveService) {
Chris Masone2176a882011-09-14 22:29:15 -0700394 Manager manager(control_interface(),
395 dispatcher(),
Chris Masone6515aab2011-10-12 16:19:09 -0700396 glib(),
Chris Masone9d779932011-08-25 16:33:41 -0700397 run_path(),
398 storage_path(),
399 string());
Chris Masone6515aab2011-10-12 16:19:09 -0700400 scoped_refptr<MockService> s2(new MockService(control_interface(),
401 dispatcher(),
402 &manager));
403 // Inject an actual profile, backed by a fake StoreInterface
Chris Masoneb9c00592011-10-06 13:10:39 -0700404 {
Chris Masone6515aab2011-10-12 16:19:09 -0700405 Profile::Identifier id("irrelevant");
Chris Masoneb9c00592011-10-06 13:10:39 -0700406 ProfileRefPtr profile(
407 new Profile(control_interface(), &manager, id, "", false));
408 MockStore *storage = new MockStore;
Chris Masone6515aab2011-10-12 16:19:09 -0700409 // Say we don't have |s2| the first time asked, then that we do.
410 EXPECT_CALL(*storage, ContainsGroup(s2->GetStorageIdentifier()))
411 .WillOnce(Return(false))
412 .WillRepeatedly(Return(true));
413 EXPECT_CALL(*storage, Flush())
414 .Times(AnyNumber())
415 .WillRepeatedly(Return(true));
Chris Masoneb9c00592011-10-06 13:10:39 -0700416 profile->set_storage(storage);
Paul Stewarta849a3d2011-11-03 05:54:09 -0700417 AdoptProfile(&manager, profile);
Chris Masoneb9c00592011-10-06 13:10:39 -0700418 }
Chris Masone6515aab2011-10-12 16:19:09 -0700419 // Create a profile that already has |s2| in it.
420 ProfileRefPtr profile(new EphemeralProfile(control_interface(), &manager));
421 profile->AdoptService(s2);
Chris Masone9d779932011-08-25 16:33:41 -0700422
Chris Masone6515aab2011-10-12 16:19:09 -0700423 // Now, move the Service |s2| to another profile.
424 EXPECT_CALL(*s2.get(), Save(_)).WillOnce(Return(true));
425 ASSERT_TRUE(manager.MoveServiceToProfile(s2, manager.ActiveProfile()));
Chris Masone6791a432011-07-12 13:23:19 -0700426
427 // Force destruction of the original Profile, to ensure that the Service
428 // is kept alive and populated with data.
429 profile = NULL;
Chris Masone6515aab2011-10-12 16:19:09 -0700430 ASSERT_TRUE(manager.ActiveProfile()->ContainsService(s2));
Chris Masone9d779932011-08-25 16:33:41 -0700431 manager.Stop();
Chris Masone6791a432011-07-12 13:23:19 -0700432}
433
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700434TEST_F(ManagerTest, CreateProfile) {
435 // It's much easier to use real Glib here since we want the storage
436 // side-effects.
437 GLib glib;
438 ScopedTempDir temp_dir;
439 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
440
441 Manager manager(control_interface(),
442 dispatcher(),
443 &glib,
444 run_path(),
445 storage_path(),
446 temp_dir.path().value());
447
448 // Invalid name should be rejected.
449 EXPECT_EQ(Error::kInvalidArguments, TestCreateProfile(&manager, ""));
450
451 // Valid name is still rejected because we can't create a profile
452 // that doesn't have a user component. Such profile names are
453 // reserved for the single DefaultProfile the manager creates
454 // at startup.
455 EXPECT_EQ(Error::kInvalidArguments, TestCreateProfile(&manager, "valid"));
456
457 // We should succeed in creating a valid user profile.
458 const char kProfile[] = "~user/profile";
459 EXPECT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile));
460
461 // We should fail in creating it a second time (already exists).
462 EXPECT_EQ(Error::kAlreadyExists, TestCreateProfile(&manager, kProfile));
463}
464
465TEST_F(ManagerTest, PushPopProfile) {
466 // It's much easier to use real Glib in creating a Manager for this
467 // test here since we want the storage side-effects.
468 GLib glib;
469 ScopedTempDir temp_dir;
470 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
471 Manager manager(control_interface(),
472 dispatcher(),
473 &glib,
474 run_path(),
475 storage_path(),
476 temp_dir.path().value());
477
478 // Pushing an invalid profile should fail.
479 EXPECT_EQ(Error::kInvalidArguments, TestPushProfile(&manager, ""));
480
481 // Pushing a default profile name should fail.
482 EXPECT_EQ(Error::kInvalidArguments, TestPushProfile(&manager, "default"));
483
484 const char kProfile0[] = "~user/profile0";
485 const char kProfile1[] = "~user/profile1";
486
487 // Create a couple of profiles.
488 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile0));
489 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile1));
490
491 // Push these profiles on the stack.
492 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile0));
493 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile1));
494
495 // Pushing a profile a second time should fail.
496 EXPECT_EQ(Error::kAlreadyExists, TestPushProfile(&manager, kProfile0));
497 EXPECT_EQ(Error::kAlreadyExists, TestPushProfile(&manager, kProfile1));
498
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800499 Error error;
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700500 // Active profile should be the last one we pushed.
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800501 EXPECT_EQ(kProfile1, "~" + manager.GetActiveProfileName(&error));
Paul Stewart5dc40aa2011-10-28 19:43:43 -0700502
503 // Make sure a profile name that doesn't exist fails.
504 const char kProfile2Id[] = "profile2";
505 const string kProfile2 = base::StringPrintf("~user/%s", kProfile2Id);
506 EXPECT_EQ(Error::kNotFound, TestPushProfile(&manager, kProfile2));
507
508 // Create a new service, with a specific storage name.
509 scoped_refptr<MockService> service(
510 new NiceMock<MockService>(control_interface(),
511 dispatcher(),
512 &manager));
513 const char kServiceName[] = "service_storage_name";
514 EXPECT_CALL(*service.get(), GetStorageIdentifier())
515 .WillRepeatedly(Return(kServiceName));
516 EXPECT_CALL(*service.get(), Load(_))
517 .WillRepeatedly(Return(true));
518
519 // Add this service to the manager -- it should end up in the ephemeral
520 // profile.
521 manager.RegisterService(service);
522 ASSERT_EQ(manager.ephemeral_profile_, service->profile());
523
524 // Create storage for a profile that contains the service storage name.
525 ASSERT_TRUE(CreateBackingStoreForService(&temp_dir, kProfile2Id,
526 kServiceName));
527
528 // When we push the profile, the service should move away from the
529 // ephemeral profile to this new profile since it has an entry for
530 // this service.
531 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile2));
532 EXPECT_NE(manager.ephemeral_profile_, service->profile());
533 EXPECT_EQ(kProfile2, "~" + service->profile()->GetFriendlyName());
534
535 // Insert another profile that should supersede ownership of the service.
536 const char kProfile3Id[] = "profile3";
537 const string kProfile3 = base::StringPrintf("~user/%s", kProfile3Id);
538 ASSERT_TRUE(CreateBackingStoreForService(&temp_dir, kProfile3Id,
539 kServiceName));
540 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile3));
541 EXPECT_EQ(kProfile3, "~" + service->profile()->GetFriendlyName());
542
543 // Popping an invalid profile name should fail.
544 EXPECT_EQ(Error::kInvalidArguments, TestPopProfile(&manager, "~"));
545
546 // Popping an profile that is not at the top of the stack should fail.
547 EXPECT_EQ(Error::kNotSupported, TestPopProfile(&manager, kProfile0));
548
549 // Popping the top profile should succeed.
550 EXPECT_EQ(Error::kSuccess, TestPopProfile(&manager, kProfile3));
551
552 // Moreover the service should have switched profiles to profile 2.
553 EXPECT_EQ(kProfile2, "~" + service->profile()->GetFriendlyName());
554
555 // Popping the top profile should succeed.
556 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager));
557
558 // The service should now revert to the ephemeral profile.
559 EXPECT_EQ(manager.ephemeral_profile_, service->profile());
560
561 // Pop the remaining two services off the stack.
562 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager));
563 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager));
564
565 // Next pop should fail with "stack is empty".
566 EXPECT_EQ(Error::kNotFound, TestPopAnyProfile(&manager));
567}
568
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700569TEST_F(ManagerTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700570 {
571 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700572 EXPECT_TRUE(DBusAdaptor::DispatchOnType(manager()->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700573 flimflam::kOfflineModeProperty,
574 PropertyStoreTest::kBoolV,
575 &error));
576 }
577 {
578 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700579 EXPECT_TRUE(DBusAdaptor::DispatchOnType(manager()->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700580 flimflam::kCountryProperty,
581 PropertyStoreTest::kStringV,
582 &error));
583 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700584 // Attempt to write with value of wrong type should return InvalidArgs.
Chris Masonea8a2c252011-06-27 22:16:30 -0700585 {
586 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700587 EXPECT_FALSE(DBusAdaptor::DispatchOnType(manager()->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700588 flimflam::kCountryProperty,
589 PropertyStoreTest::kBoolV,
590 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700591 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700592 }
593 {
594 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700595 EXPECT_FALSE(DBusAdaptor::DispatchOnType(manager()->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700596 flimflam::kOfflineModeProperty,
597 PropertyStoreTest::kStringV,
598 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700599 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700600 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700601 // Attempt to write R/O property should return InvalidArgs.
Chris Masonea8a2c252011-06-27 22:16:30 -0700602 {
603 ::DBus::Error error;
604 EXPECT_FALSE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700605 manager()->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700606 flimflam::kEnabledTechnologiesProperty,
607 PropertyStoreTest::kStringsV,
608 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700609 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700610 }
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700611}
612
mukesh agrawal32399322011-09-01 10:53:43 -0700613TEST_F(ManagerTest, RequestScan) {
614 {
615 Error error;
Paul Stewart22aa71b2011-09-16 12:15:11 -0700616 manager()->RegisterDevice(mock_devices_[0].get());
617 manager()->RegisterDevice(mock_devices_[1].get());
618 EXPECT_CALL(*mock_devices_[0], TechnologyIs(Technology::kWifi))
mukesh agrawal32399322011-09-01 10:53:43 -0700619 .WillRepeatedly(Return(true));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700620 EXPECT_CALL(*mock_devices_[0], Scan(_));
621 EXPECT_CALL(*mock_devices_[1], TechnologyIs(Technology::kWifi))
mukesh agrawal32399322011-09-01 10:53:43 -0700622 .WillRepeatedly(Return(false));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700623 EXPECT_CALL(*mock_devices_[1], Scan(_)).Times(0);
Chris Masone9d779932011-08-25 16:33:41 -0700624 manager()->RequestScan(flimflam::kTypeWifi, &error);
mukesh agrawal32399322011-09-01 10:53:43 -0700625 }
626
627 {
628 Error error;
Chris Masone9d779932011-08-25 16:33:41 -0700629 manager()->RequestScan("bogus_device_type", &error);
mukesh agrawal32399322011-09-01 10:53:43 -0700630 EXPECT_EQ(Error::kInvalidArguments, error.type());
631 }
632}
633
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700634TEST_F(ManagerTest, GetWifiServiceNoDevice) {
635 KeyValueStore args;
636 Error e;
637 manager()->GetWifiService(args, &e);
638 EXPECT_EQ(Error::kInvalidArguments, e.type());
639 EXPECT_EQ("no wifi devices available", e.message());
640}
641
642TEST_F(ManagerTest, GetWifiService) {
643 KeyValueStore args;
644 Error e;
645 WiFiServiceRefPtr wifi_service;
646
647 manager()->RegisterDevice(mock_wifi_);
648 EXPECT_CALL(*mock_wifi_, GetService(_, _))
649 .WillRepeatedly(Return(wifi_service));
650 manager()->GetWifiService(args, &e);
651}
652
Paul Stewart22aa71b2011-09-16 12:15:11 -0700653TEST_F(ManagerTest, TechnologyOrder) {
654 Error error;
655 manager()->SetTechnologyOrder(string(flimflam::kTypeEthernet) + "," +
656 string(flimflam::kTypeWifi), &error);
657 ASSERT_TRUE(error.IsSuccess());
658 EXPECT_EQ(manager()->GetTechnologyOrder(),
659 string(flimflam::kTypeEthernet) + "," +
660 string(flimflam::kTypeWifi));
661
662 manager()->SetTechnologyOrder(string(flimflam::kTypeEthernet) + "x," +
663 string(flimflam::kTypeWifi), &error);
664 ASSERT_FALSE(error.IsSuccess());
665 EXPECT_EQ(Error::kInvalidArguments, error.type());
666 EXPECT_EQ(string(flimflam::kTypeEthernet) + "," +
667 string(flimflam::kTypeWifi),
668 manager()->GetTechnologyOrder());
669}
670
671TEST_F(ManagerTest, SortServices) {
mukesh agrawal00917ce2011-11-22 23:56:55 +0000672 // TODO(quiche): Some of these tests would probably fit better in
673 // service_unittest, since the actual comparison of Services is
674 // implemented in Service. (crosbug.com/23370)
675
Paul Stewart22aa71b2011-09-16 12:15:11 -0700676 scoped_refptr<MockService> mock_service0(
677 new NiceMock<MockService>(control_interface(),
678 dispatcher(),
679 manager()));
680 scoped_refptr<MockService> mock_service1(
681 new NiceMock<MockService>(control_interface(),
682 dispatcher(),
683 manager()));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700684
685 manager()->RegisterService(mock_service0);
686 manager()->RegisterService(mock_service1);
687
688 // Services should already be sorted by UniqueName
689 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1));
690
691 // Asking explictly to sort services should not change anything
692 manager()->SortServices();
693 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1));
694
695 // Two otherwise equal services should be reordered by strength
696 mock_service1->set_strength(1);
697 manager()->UpdateService(mock_service1);
698 EXPECT_TRUE(ServiceOrderIs(mock_service1, mock_service0));
699
700 // Security
Paul Stewart1ca3e852011-11-04 07:50:49 -0700701 mock_service0->set_security_level(1);
Paul Stewart22aa71b2011-09-16 12:15:11 -0700702 manager()->UpdateService(mock_service0);
703 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1));
704
705 // Technology
706 EXPECT_CALL(*mock_service0.get(), TechnologyIs(Technology::kWifi))
707 .WillRepeatedly(Return(true));
708 EXPECT_CALL(*mock_service1.get(), TechnologyIs(Technology::kEthernet))
709 .WillRepeatedly(Return(true));
710 // NB: Redefine default (false) return values so we don't use the default rule
711 // which makes the logs noisier
712 EXPECT_CALL(*mock_service0.get(), TechnologyIs(Ne(Technology::kWifi)))
713 .WillRepeatedly(Return(false));
714 EXPECT_CALL(*mock_service1.get(), TechnologyIs(Ne(Technology::kEthernet)))
715 .WillRepeatedly(Return(false));
716
717 Error error;
718 manager()->SetTechnologyOrder(string(flimflam::kTypeEthernet) + "," +
719 string(flimflam::kTypeWifi), &error);
720 EXPECT_TRUE(error.IsSuccess());
721 EXPECT_TRUE(ServiceOrderIs(mock_service1, mock_service0));
722
723 manager()->SetTechnologyOrder(string(flimflam::kTypeWifi) + "," +
724 string(flimflam::kTypeEthernet), &error);
725 EXPECT_TRUE(error.IsSuccess());
726 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1));
727
Gaurav Shah435de2c2011-11-17 19:01:07 -0800728 // Priority.
Paul Stewart22aa71b2011-09-16 12:15:11 -0700729 mock_service0->set_priority(1);
730 manager()->UpdateService(mock_service0);
731 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1));
732
733 // Favorite
mukesh agrawal00917ce2011-11-22 23:56:55 +0000734 mock_service1->MakeFavorite();
Paul Stewart22aa71b2011-09-16 12:15:11 -0700735 manager()->UpdateService(mock_service1);
736 EXPECT_TRUE(ServiceOrderIs(mock_service1, mock_service0));
737
Gaurav Shah435de2c2011-11-17 19:01:07 -0800738 // Connecting.
Paul Stewart22aa71b2011-09-16 12:15:11 -0700739 EXPECT_CALL(*mock_service0.get(), state())
740 .WillRepeatedly(Return(Service::kStateAssociating));
Gaurav Shah435de2c2011-11-17 19:01:07 -0800741 EXPECT_CALL(*mock_service0.get(), IsConnecting())
742 .WillRepeatedly(Return(true));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700743 manager()->UpdateService(mock_service0);
744 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1));
745
Gaurav Shah435de2c2011-11-17 19:01:07 -0800746 // Connected.
Paul Stewart22aa71b2011-09-16 12:15:11 -0700747 EXPECT_CALL(*mock_service1.get(), state())
748 .WillRepeatedly(Return(Service::kStateConnected));
Gaurav Shah435de2c2011-11-17 19:01:07 -0800749 EXPECT_CALL(*mock_service1.get(), IsConnected())
750 .WillRepeatedly(Return(true));
Paul Stewart22aa71b2011-09-16 12:15:11 -0700751 manager()->UpdateService(mock_service1);
752 EXPECT_TRUE(ServiceOrderIs(mock_service1, mock_service0));
753
754 manager()->DeregisterService(mock_service0);
755 manager()->DeregisterService(mock_service1);
756}
757
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800758TEST_F(ManagerTest, SortServicesWithConnection) {
759 scoped_refptr<MockService> mock_service0(
760 new NiceMock<MockService>(control_interface(),
761 dispatcher(),
762 manager()));
763 scoped_refptr<MockService> mock_service1(
764 new NiceMock<MockService>(control_interface(),
765 dispatcher(),
766 manager()));
767
768 scoped_refptr<MockConnection> mock_connection0(
769 new NiceMock<MockConnection>(device_info_.get()));
770 scoped_refptr<MockConnection> mock_connection1(
771 new NiceMock<MockConnection>(device_info_.get()));
772
773 manager()->RegisterService(mock_service0);
774 manager()->RegisterService(mock_service1);
775
776 mock_service0->connection_ = mock_connection0;
777 mock_service1->connection_ = mock_connection1;
778
779 EXPECT_CALL(*mock_connection0.get(), SetIsDefault(true));
780 manager()->SortServices();
781
782 mock_service1->set_priority(1);
783 EXPECT_CALL(*mock_connection0.get(), SetIsDefault(false));
784 EXPECT_CALL(*mock_connection1.get(), SetIsDefault(true));
785 manager()->SortServices();
786
787 EXPECT_CALL(*mock_connection0.get(), SetIsDefault(true));
788 mock_service1->connection_ = NULL;
789 manager()->DeregisterService(mock_service1);
790
791 mock_service0->connection_ = NULL;
792 manager()->DeregisterService(mock_service0);
793}
794
Gaurav Shah435de2c2011-11-17 19:01:07 -0800795TEST_F(ManagerTest, AvailableTechnologies) {
796 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(),
797 dispatcher(),
798 manager(),
799 "null4",
800 "addr4",
801 0));
802 manager()->RegisterDevice(mock_devices_[0]);
803 manager()->RegisterDevice(mock_devices_[1]);
804 manager()->RegisterDevice(mock_devices_[2]);
805 manager()->RegisterDevice(mock_devices_[3]);
806
807 ON_CALL(*mock_devices_[0].get(), technology())
808 .WillByDefault(Return(Technology::kEthernet));
809 ON_CALL(*mock_devices_[1].get(), technology())
810 .WillByDefault(Return(Technology::kWifi));
811 ON_CALL(*mock_devices_[2].get(), technology())
812 .WillByDefault(Return(Technology::kCellular));
813 ON_CALL(*mock_devices_[3].get(), technology())
814 .WillByDefault(Return(Technology::kWifi));
815
816 set<string> expected_technologies;
817 expected_technologies.insert(Technology::NameFromIdentifier(
818 Technology::kEthernet));
819 expected_technologies.insert(Technology::NameFromIdentifier(
820 Technology::kWifi));
821 expected_technologies.insert(Technology::NameFromIdentifier(
822 Technology::kCellular));
823 Error error;
824 vector<string> technologies = manager()->AvailableTechnologies(&error);
825
826 EXPECT_THAT(set<string>(technologies.begin(), technologies.end()),
827 ContainerEq(expected_technologies));
828}
829
830TEST_F(ManagerTest, ConnectedTechnologies) {
831 scoped_refptr<MockService> connected_service1(
832 new NiceMock<MockService>(control_interface(),
833 dispatcher(),
834 manager()));
835 scoped_refptr<MockService> connected_service2(
836 new NiceMock<MockService>(control_interface(),
837 dispatcher(),
838 manager()));
839 scoped_refptr<MockService> disconnected_service1(
840 new NiceMock<MockService>(control_interface(),
841 dispatcher(),
842 manager()));
843 scoped_refptr<MockService> disconnected_service2(
844 new NiceMock<MockService>(control_interface(),
845 dispatcher(),
846 manager()));
847
848 ON_CALL(*connected_service1.get(), IsConnected())
849 .WillByDefault(Return(true));
850 ON_CALL(*connected_service2.get(), IsConnected())
851 .WillByDefault(Return(true));
852
853 manager()->RegisterService(connected_service1);
854 manager()->RegisterService(connected_service2);
855 manager()->RegisterService(disconnected_service1);
856 manager()->RegisterService(disconnected_service2);
857
858 manager()->RegisterDevice(mock_devices_[0]);
859 manager()->RegisterDevice(mock_devices_[1]);
860 manager()->RegisterDevice(mock_devices_[2]);
861 manager()->RegisterDevice(mock_devices_[3]);
862
863 ON_CALL(*mock_devices_[0].get(), technology())
864 .WillByDefault(Return(Technology::kEthernet));
865 ON_CALL(*mock_devices_[1].get(), technology())
866 .WillByDefault(Return(Technology::kWifi));
867 ON_CALL(*mock_devices_[2].get(), technology())
868 .WillByDefault(Return(Technology::kCellular));
869 ON_CALL(*mock_devices_[3].get(), technology())
870 .WillByDefault(Return(Technology::kWifi));
871
872 mock_devices_[0]->SelectService(connected_service1);
873 mock_devices_[1]->SelectService(disconnected_service1);
874 mock_devices_[2]->SelectService(disconnected_service2);
875 mock_devices_[3]->SelectService(connected_service2);
876
877 set<string> expected_technologies;
878 expected_technologies.insert(Technology::NameFromIdentifier(
879 Technology::kEthernet));
880 expected_technologies.insert(Technology::NameFromIdentifier(
881 Technology::kWifi));
882 Error error;
883
884 vector<string> technologies = manager()->ConnectedTechnologies(&error);
885 EXPECT_THAT(set<string>(technologies.begin(), technologies.end()),
886 ContainerEq(expected_technologies));
887}
888
889TEST_F(ManagerTest, DefaultTechnology) {
890 scoped_refptr<MockService> connected_service(
891 new NiceMock<MockService>(control_interface(),
892 dispatcher(),
893 manager()));
894 scoped_refptr<MockService> disconnected_service(
895 new NiceMock<MockService>(control_interface(),
896 dispatcher(),
897 manager()));
898
899 // Connected. WiFi.
900 ON_CALL(*connected_service.get(), IsConnected())
901 .WillByDefault(Return(true));
902 ON_CALL(*connected_service.get(), state())
903 .WillByDefault(Return(Service::kStateConnected));
904 ON_CALL(*connected_service.get(), technology())
905 .WillByDefault(Return(Technology::kWifi));
906
907 // Disconnected. Ethernet.
908 ON_CALL(*disconnected_service.get(), technology())
909 .WillByDefault(Return(Technology::kEthernet));
910
911 manager()->RegisterService(disconnected_service);
912 Error error;
913 EXPECT_THAT(manager()->DefaultTechnology(&error), StrEq(""));
914
915
916 manager()->RegisterService(connected_service);
917 // Connected service should be brought to the front now.
918 string expected_technology =
919 Technology::NameFromIdentifier(Technology::kWifi);
920 EXPECT_THAT(manager()->DefaultTechnology(&error), StrEq(expected_technology));
921}
922
Thieu Le1271d682011-11-02 22:48:19 +0000923TEST_F(ManagerTest, DisconnectServicesOnStop) {
924 scoped_refptr<MockService> mock_service(
925 new NiceMock<MockService>(control_interface(),
926 dispatcher(),
927 manager()));
928 manager()->RegisterService(mock_service);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000929 EXPECT_CALL(*mock_service.get(), Disconnect(_)).Times(1);
Thieu Le1271d682011-11-02 22:48:19 +0000930 manager()->Stop();
931}
932
mukesh agrawal00917ce2011-11-22 23:56:55 +0000933TEST_F(ManagerTest, UpdateServiceConnected) {
934 scoped_refptr<MockService> mock_service(
935 new NiceMock<MockService>(control_interface(),
936 dispatcher(),
937 manager()));
938 manager()->RegisterService(mock_service);
939 EXPECT_FALSE(mock_service->favorite());
940 EXPECT_FALSE(mock_service->auto_connect());
941
Gaurav Shah435de2c2011-11-17 19:01:07 -0800942 EXPECT_CALL(*mock_service.get(), IsConnected())
943 .WillRepeatedly(Return(true));
mukesh agrawal00917ce2011-11-22 23:56:55 +0000944 manager()->UpdateService(mock_service);
945 // We can't EXPECT_CALL(..., MakeFavorite), because that requires us
946 // to mock out MakeFavorite. And mocking that out would break the
947 // SortServices test. (crosbug.com/23370)
948 EXPECT_TRUE(mock_service->favorite());
949 EXPECT_TRUE(mock_service->auto_connect());
950}
951
Chris Masone9be4a9d2011-05-16 15:44:09 -0700952} // namespace shill