blob: 38c83db838dd2593242eea145d54615f91a091fd [file] [log] [blame]
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone853b81b2011-06-24 14:11:41 -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/wifi.h"
6
mukesh agrawalf2f68a52011-09-01 12:15:48 -07007#include <netinet/ether.h>
8#include <linux/if.h>
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07009#include <sys/socket.h>
10#include <linux/netlink.h> // Needs typedefs from sys/socket.h.
mukesh agrawalf2f68a52011-09-01 12:15:48 -070011
Chris Masone853b81b2011-06-24 14:11:41 -070012#include <map>
Paul Stewarta41e38d2011-11-11 07:47:29 -080013#include <set>
Chris Masone853b81b2011-06-24 14:11:41 -070014#include <string>
15#include <vector>
16
Darin Petkov60ceaf32012-10-18 10:36:01 +020017#include <base/file_util.h>
mukesh agrawal7ec71312011-11-10 02:08:26 +000018#include <base/memory/ref_counted.h>
mukesh agrawaldc42bb32011-07-28 10:40:26 -070019#include <base/memory/scoped_ptr.h>
Paul Stewarta41e38d2011-11-11 07:47:29 -080020#include <base/stringprintf.h>
mukesh agrawal31950242011-07-14 11:53:38 -070021#include <base/string_number_conversions.h>
Darin Petkov4a66cc52012-06-15 10:08:29 +020022#include <base/string_split.h>
mukesh agrawal31950242011-07-14 11:53:38 -070023#include <base/string_util.h>
Chris Masone853b81b2011-06-24 14:11:41 -070024#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070025#include <dbus-c++/dbus.h>
Chris Masone7156c922011-08-23 20:36:21 -070026#include <gmock/gmock.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070027#include <gtest/gtest.h>
Chris Masone853b81b2011-06-24 14:11:41 -070028
29#include "shill/dbus_adaptor.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070030#include "shill/event_dispatcher.h"
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070031#include "shill/geolocation_info.h"
mukesh agrawal8ede0522011-10-03 14:57:44 -070032#include "shill/ieee80211.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070033#include "shill/key_value_store.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070034#include "shill/logging.h"
Chris Masone853b81b2011-06-24 14:11:41 -070035#include "shill/manager.h"
Darin Petkov2b8e44e2012-06-25 15:13:26 +020036#include "shill/mock_dbus_manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070037#include "shill/mock_device.h"
mukesh agrawalc01f3982012-01-24 13:48:39 -080038#include "shill/mock_device_info.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070039#include "shill/mock_dhcp_config.h"
40#include "shill/mock_dhcp_provider.h"
Paul Stewarte369ece2012-05-22 09:11:03 -070041#include "shill/mock_event_dispatcher.h"
Paul Stewart3c508e12012-08-09 11:40:06 -070042#include "shill/mock_link_monitor.h"
mukesh agrawalcf24a242012-05-21 16:46:11 -070043#include "shill/mock_log.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070044#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080045#include "shill/mock_metrics.h"
Paul Stewart10ccbb32012-04-26 15:59:30 -070046#include "shill/mock_profile.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070047#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080048#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080049#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070050#include "shill/mock_supplicant_interface_proxy.h"
51#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080052#include "shill/mock_time.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000053#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070054#include "shill/nice_mock_control.h"
Darin Petkov4a66cc52012-06-15 10:08:29 +020055#include "shill/property_store_inspector.h"
Chris Masone853b81b2011-06-24 14:11:41 -070056#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070057#include "shill/proxy_factory.h"
58#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070059#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080060#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070061
Gary Morainac1bdb42012-02-16 17:42:29 -080062
Chris Masone853b81b2011-06-24 14:11:41 -070063using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080064using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070065using std::string;
66using std::vector;
67using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070068using ::testing::AnyNumber;
69using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080070using ::testing::DoAll;
mukesh agrawalcf24a242012-05-21 16:46:11 -070071using ::testing::EndsWith;
mukesh agrawal31950242011-07-14 11:53:38 -070072using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080073using ::testing::Invoke;
Paul Stewart549d44c2012-07-03 12:40:25 -070074using ::testing::InvokeWithoutArgs;
mukesh agrawal7ec71312011-11-10 02:08:26 +000075using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070076using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070077using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080078using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080079using ::testing::SetArgumentPointee;
80using ::testing::StrEq;
81using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070082using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070083using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070084using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070085
86namespace shill {
87
mukesh agrawal31950242011-07-14 11:53:38 -070088class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070089 public:
mukesh agrawal31950242011-07-14 11:53:38 -070090 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080091 : device_(new WiFi(control_interface(),
92 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070093 }
mukesh agrawal31950242011-07-14 11:53:38 -070094 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070095
96 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080097 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070098};
99
mukesh agrawal31950242011-07-14 11:53:38 -0700100TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700101 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
102 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -0700103}
104
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800105TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 {
107 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800108 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700109 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 flimflam::kBgscanSignalThresholdProperty,
111 PropertyStoreTest::kInt32V,
112 &error));
113 }
114 {
115 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800116 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
117 flimflam::kScanIntervalProperty,
118 PropertyStoreTest::kUint16V,
119 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700120 }
Chris Masone853b81b2011-06-24 14:11:41 -0700121 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700122 {
123 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800124 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
125 flimflam::kScanningProperty,
126 PropertyStoreTest::kBoolV,
127 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700128 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700129 }
Chris Masone853b81b2011-06-24 14:11:41 -0700130
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800131 {
132 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800133 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800134 device_->mutable_store(),
135 flimflam::kBgscanMethodProperty,
136 DBusAdaptor::StringToVariant(
137 wpa_supplicant::kNetworkBgscanMethodSimple),
138 &error));
139 }
140
141 {
142 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800143 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800144 device_->mutable_store(),
145 flimflam::kBgscanMethodProperty,
146 DBusAdaptor::StringToVariant("not a real scan method"),
147 &error));
148 }
149}
150
Darin Petkov4a66cc52012-06-15 10:08:29 +0200151TEST_F(WiFiPropertyTest, BgscanMethodProperty) {
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800152 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
153 WiFi::kDefaultBgscanMethod);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200154 EXPECT_TRUE(device_->bgscan_method_.empty());
155
156 string method;
157 PropertyStoreInspector inspector(&device_->store());
158 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
159 &method));
160 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
161 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodSimple, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800162
163 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800164 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800165 device_->mutable_store(),
166 flimflam::kBgscanMethodProperty,
167 DBusAdaptor::StringToVariant(
168 wpa_supplicant::kNetworkBgscanMethodLearn),
169 &error));
170 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200171 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
172 &method));
173 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800174
175 EXPECT_TRUE(DBusAdaptor::ClearProperty(
176 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
Darin Petkov4a66cc52012-06-15 10:08:29 +0200177 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
178 &method));
179 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
180 EXPECT_TRUE(device_->bgscan_method_.empty());
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800181}
182
Paul Stewarte369ece2012-05-22 09:11:03 -0700183class WiFiObjectTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700184 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700185 WiFiObjectTest(EventDispatcher *dispatcher)
186 : event_dispatcher_(dispatcher),
187 manager_(&control_interface_, NULL, &metrics_, &glib_),
188 device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700189 wifi_(new WiFi(&control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700190 dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -0800191 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700192 &manager_,
193 kDeviceName,
194 kDeviceAddress,
195 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700196 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
197 supplicant_interface_proxy_(
198 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800199 supplicant_bss_proxy_(
200 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700201 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700202 kDeviceName)),
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200203 dbus_manager_(new NiceMock<MockDBusManager>()),
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700204 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700205 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000206 // Except for WiFiServices created via WiFi::GetService, we expect
207 // that any WiFiService has been registered with the Manager. So
208 // default Manager.HasService to true, to make the common case
209 // easy.
210 ON_CALL(manager_, HasService(_)).
211 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800212
Paul Stewartd408fdf2012-05-07 17:15:57 -0700213 ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
mukesh agrawalc01f3982012-01-24 13:48:39 -0800214 WillByDefault(Return(dhcp_config_));
215 ON_CALL(*dhcp_config_.get(), RequestIP()).
216 WillByDefault(Return(true));
Gary Morainac1bdb42012-02-16 17:42:29 -0800217
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200218 manager_.dbus_manager_.reset(dbus_manager_); // Transfers ownership.
219
mukesh agrawal5c05b292012-03-07 10:12:52 -0800220 wifi_->time_ = &time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700221 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700222
223 virtual void SetUp() {
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700224 // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
225 ScopeLogger::GetInstance()->EnableScopesByName("wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700226 ScopeLogger::GetInstance()->set_verbose_level(3);
Darin Petkovab565bb2011-10-06 02:55:51 -0700227 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700228 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
229 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800230 ON_CALL(manager_, device_info()).
231 WillByDefault(Return(&device_info_));
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200232 EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
Chris Masoneb9c00592011-10-06 13:10:39 -0700233 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800234 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700235 }
236
237 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800238 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500239 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800240 if (supplicant_bss_proxy_.get()) {
241 EXPECT_CALL(*supplicant_bss_proxy_, Die());
242 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700243 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700244 // must Stop WiFi instance, to clear its list of services.
245 // otherwise, the WiFi instance will not be deleted. (because
246 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500247 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700248 wifi_->set_dhcp_provider(NULL);
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700249 // Reset scope logging, to avoid interfering with other tests.
250 ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700251 ScopeLogger::GetInstance()->set_verbose_level(0);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700252 }
253
Paul Stewart549d44c2012-07-03 12:40:25 -0700254 // Needs to be public since it is called via Invoke().
255 void StopWiFi() {
Paul Stewart549d44c2012-07-03 12:40:25 -0700256 wifi_->SetEnabled(false); // Stop(NULL, ResultCallback());
257 }
258
Christopher Wileyc6184482012-10-24 15:31:56 -0700259 // Needs to be public since it is called via Invoke().
260 void ThrowDBusError() {
261 throw DBus::Error("SomeDBusType", "A handy message");
262 }
263
Paul Stewart549d44c2012-07-03 12:40:25 -0700264 void UnloadService(const ServiceRefPtr &service) {
265 service->Unload();
266 }
267
mukesh agrawal31950242011-07-14 11:53:38 -0700268 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000269 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
270
mukesh agrawal31950242011-07-14 11:53:38 -0700271 class TestProxyFactory : public ProxyFactory {
272 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700273 explicit TestProxyFactory(WiFiObjectTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700274
275 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700276 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700277 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700278 }
279
280 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700281 const WiFiRefPtr &/*wifi*/,
282 const DBus::Path &/*object_path*/,
283 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700284 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700285 }
286
mukesh agrawalb20776f2012-02-10 16:00:36 -0800287 MOCK_METHOD3(CreateSupplicantBSSProxy,
288 SupplicantBSSProxyInterface *(
289 WiFiEndpoint *wifi_endpoint,
290 const DBus::Path &object_path,
291 const char *dbus_addr));
292
mukesh agrawal31950242011-07-14 11:53:38 -0700293 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800294 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
295 WiFiEndpoint */*wifi_endpoint*/,
296 const DBus::Path &/*object_path*/,
297 const char */*dbus_addr*/) {
298 return test_->supplicant_bss_proxy_.release();
299 }
300
Paul Stewarte369ece2012-05-22 09:11:03 -0700301 WiFiObjectTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700302 };
303
mukesh agrawalb66c6462012-05-07 11:45:25 -0700304 void CancelScanTimer() {
305 wifi_->scan_timer_callback_.Cancel();
306 }
mukesh agrawal15908392011-11-16 18:29:25 +0000307 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
308 bool hidden_ssid = false;
309 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
310 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700311 void FireScanTimer() {
312 wifi_->ScanTimerHandler();
313 }
Christopher Wileyc68c8672012-11-20 16:52:21 -0800314 void TriggerScan() {
315 wifi_->Scan(NULL);
316 }
mukesh agrawal15908392011-11-16 18:29:25 +0000317 const WiFiServiceRefPtr &GetCurrentService() {
318 return wifi_->current_service_;
319 }
Paul Stewartbc6e7392012-05-24 07:07:48 -0700320 void SetCurrentService(const WiFiServiceRefPtr &service) {
321 wifi_->current_service_ = service;
322 }
mukesh agrawal31950242011-07-14 11:53:38 -0700323 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000324 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700325 }
mukesh agrawal15908392011-11-16 18:29:25 +0000326 const WiFiServiceRefPtr &GetPendingService() {
327 return wifi_->pending_service_;
328 }
Paul Stewart2b05e622012-07-13 20:38:44 -0700329 const base::CancelableClosure &GetPendingTimeout() {
330 return wifi_->pending_timeout_callback_;
331 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700332 const base::CancelableClosure &GetReconnectTimeoutCallback() {
Paul Stewart44663922012-07-30 11:03:03 -0700333 return wifi_->reconnect_timeout_callback_;
334 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700335 int GetReconnectTimeoutSeconds() {
336 return WiFi::kReconnectTimeoutSeconds;
337 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700338 const base::CancelableClosure &GetScanTimer() {
339 return wifi_->scan_timer_callback_;
340 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000341 const vector<WiFiServiceRefPtr> &GetServices() {
342 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700343 }
344 // note: the tests need the proxies referenced by WiFi (not the
Paul Stewarte369ece2012-05-22 09:11:03 -0700345 // proxies instantiated by WiFiObjectTest), to ensure that WiFi
mukesh agrawal31950242011-07-14 11:53:38 -0700346 // sets up its proxies correctly.
347 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
348 return wifi_->supplicant_process_proxy_.get();
349 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000350 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
351 return dynamic_cast<MockSupplicantInterfaceProxy *>(
352 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700353 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000354 const string &GetSupplicantState() {
355 return wifi_->supplicant_state_;
356 }
357 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700358 map<string, ::DBus::Variant> params;
359 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700360 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000361 void InitiateDisconnect(WiFiServiceRefPtr service) {
362 wifi_->DisconnectFrom(service);
363 }
mukesh agrawal15908392011-11-16 18:29:25 +0000364 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawale1d90e92012-02-15 17:36:08 -0800365 return WiFiEndpoint::MakeOpenEndpoint(
366 &proxy_factory_, NULL, ssid, bssid, 0, 0);
mukesh agrawal15908392011-11-16 18:29:25 +0000367 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700368 MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
mukesh agrawal7ec71312011-11-10 02:08:26 +0000369 vector<uint8_t> ssid(1, 'a');
370 return new MockWiFiService(
371 &control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700372 event_dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800373 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000374 &manager_,
375 wifi_,
376 ssid,
377 flimflam::kModeManaged,
mukesh agrawalcf24a242012-05-21 16:46:11 -0700378 security,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000379 false);
380 }
Ben Chan381fdcc2012-10-14 21:10:36 -0700381 bool RemoveNetwork(const ::DBus::Path &network) {
382 return wifi_->RemoveNetwork(network);
383 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000384 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700385 void ReportBSS(const ::DBus::Path &bss_path,
386 const string &ssid,
387 const string &bssid,
388 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000389 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700390 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800391 void ClearCachedCredentials() {
392 wifi_->ClearCachedCredentials();
393 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800394 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100395 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800396 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700397 void ReportLinkUp() {
398 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
399 }
mukesh agrawal31950242011-07-14 11:53:38 -0700400 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700401 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700402 }
mukesh agrawal15908392011-11-16 18:29:25 +0000403 void ReportCurrentBSSChanged(const string &new_bss) {
404 wifi_->CurrentBSSChanged(new_bss);
405 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000406 void ReportStateChanged(const string &new_state) {
407 wifi_->StateChanged(new_state);
408 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700409 void SetPendingService(const WiFiServiceRefPtr &service) {
410 wifi_->pending_service_ = service;
411 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700412 void SetScanInterval(uint16_t interval_seconds) {
413 wifi_->SetScanInterval(interval_seconds, NULL);
414 }
Paul Stewarte369ece2012-05-22 09:11:03 -0700415 uint16_t GetScanInterval() {
416 return wifi_->GetScanInterval(NULL);
417 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200418 void StartWiFi(bool supplicant_present) {
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200419 wifi_->supplicant_present_ = supplicant_present;
mukesh agrawalb66c6462012-05-07 11:45:25 -0700420 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700421 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200422 void StartWiFi() {
423 StartWiFi(true);
424 }
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700425 void OnAfterResume() {
426 wifi_->OnAfterResume();
427 }
428 void OnBeforeSuspend() {
429 wifi_->OnBeforeSuspend();
430 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200431 void OnSupplicantAppear() {
432 wifi_->OnSupplicantAppear(":1.7");
433 EXPECT_TRUE(wifi_->supplicant_present_);
434 }
435 void OnSupplicantVanish() {
436 wifi_->OnSupplicantVanish();
437 EXPECT_FALSE(wifi_->supplicant_present_);
438 }
439 bool GetSupplicantPresent() {
440 return wifi_->supplicant_present_;
441 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700442 WiFiServiceRefPtr GetOpenService(const char *service_type,
443 const char *ssid,
444 const char *mode,
445 Error *result) {
446 return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700447 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700448 WiFiServiceRefPtr GetService(const char *service_type,
449 const char *ssid,
450 const char *mode,
451 const char *security,
452 const char *passphrase,
453 Error *result) {
454 return GetServiceInner(service_type, ssid, mode, security, passphrase,
455 false, result);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800456 }
457 WiFiServiceRefPtr GetServiceInner(const char *service_type,
458 const char *ssid,
459 const char *mode,
460 const char *security,
461 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800462 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800463 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700464 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700465 // in general, we want to avoid D-Bus specific code for any RPCs
466 // that come in via adaptors. we make an exception here, because
467 // calls to GetWifiService are rerouted from the Manager object to
468 // the Wifi class.
469 if (service_type != NULL)
470 args[flimflam::kTypeProperty].writer().append_string(service_type);
471 if (ssid != NULL)
472 args[flimflam::kSSIDProperty].writer().append_string(ssid);
473 if (mode != NULL)
474 args[flimflam::kModeProperty].writer().append_string(mode);
475 if (security != NULL)
476 args[flimflam::kSecurityProperty].writer().append_string(security);
477 if (passphrase != NULL)
478 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800479 if (!allow_hidden)
480 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700481
Paul Stewartced6a0b2011-11-08 15:32:04 -0800482 Error e;
483 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700484 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800485 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700486 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700487
488 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
489 Error *result) {
490 return wifi_->GetService(args, result);
491 }
492
Paul Stewarta41e38d2011-11-11 07:47:29 -0800493 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
494 const string &mode,
495 const string &security) {
496 return wifi_->FindService(ssid, mode, security);
497 }
498 bool LoadHiddenServices(StoreInterface *storage) {
499 return wifi_->LoadHiddenServices(storage);
500 }
501 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
502 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
503 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
504 flimflam::kTypeWifi,
505 kDeviceAddress,
506 hex_ssid.c_str(),
507 flimflam::kModeManaged,
508 flimflam::kSecurityNone));
509 const char *groups[] = { id->c_str() };
510 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
511 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
512 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
513 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
514 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
515 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
516 }
Darin Petkov4a66cc52012-06-15 10:08:29 +0200517
Paul Stewart549d44c2012-07-03 12:40:25 -0700518 WiFiService *SetupConnectedService(const DBus::Path &network_path) {
519 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
520 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
521 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
522 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
523 if (!network_path.empty()) {
524 EXPECT_CALL(*supplicant_interface_proxy_, AddNetwork(_))
525 .WillOnce(Return(network_path));
526 }
527
528 StartWiFi();
Paul Stewart44663922012-07-30 11:03:03 -0700529 ReportBSS(kBSSName, kSSIDName, "00:00:00:00:00:00", 0, 0,
530 kNetworkModeAdHoc);
Paul Stewart549d44c2012-07-03 12:40:25 -0700531 WiFiService *service(GetServices().begin()->get());
Paul Stewart2b05e622012-07-13 20:38:44 -0700532 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700533 InitiateConnect(service);
Paul Stewart2b05e622012-07-13 20:38:44 -0700534 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -0700535 ReportCurrentBSSChanged(kBSSName);
Paul Stewart2b05e622012-07-13 20:38:44 -0700536 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700537 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
538
539 EXPECT_EQ(service, GetCurrentService());
540
541 return service;
542 }
543
Darin Petkov4a66cc52012-06-15 10:08:29 +0200544 bool SetBgscanMethod(const string &method) {
545 ::DBus::Error error;
546 return DBusAdaptor::SetProperty(
547 wifi_->mutable_store(),
548 flimflam::kBgscanMethodProperty,
549 DBusAdaptor::StringToVariant(method),
550 &error);
551 }
552
553 void AppendBgscan(WiFiService *service,
554 std::map<std::string, DBus::Variant> *service_params) {
555 wifi_->AppendBgscan(service, service_params);
556 }
557
Paul Stewartbc6e7392012-05-24 07:07:48 -0700558 void ReportCertification(const map<string, ::DBus::Variant> &properties) {
559 wifi_->CertificationTask(properties);
560 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700561
Paul Stewarte369ece2012-05-22 09:11:03 -0700562 void RestartFastScanAttempts() {
563 wifi_->RestartFastScanAttempts();
564 }
565
Paul Stewart1aff7302012-08-04 20:04:47 -0700566 void StartReconnectTimer() {
567 wifi_->StartReconnectTimer();
568 }
569
570 void StopReconnectTimer() {
571 wifi_->StopReconnectTimer();
572 }
573
Paul Stewart3c508e12012-08-09 11:40:06 -0700574 void SetLinkMonitor(LinkMonitor *link_monitor) {
575 wifi_->set_link_monitor(link_monitor);
576 }
577
578 void OnLinkMonitorFailure() {
579 wifi_->OnLinkMonitorFailure();
580 }
581
Paul Stewart10ccbb32012-04-26 15:59:30 -0700582 NiceMockControl *control_interface() {
583 return &control_interface_;
584 }
585
mukesh agrawal32399322011-09-01 10:53:43 -0700586 MockManager *manager() {
587 return &manager_;
588 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800589
590 MockDeviceInfo *device_info() {
591 return &device_info_;
592 }
593
594 MockDHCPProvider *dhcp_provider() {
595 return &dhcp_provider_;
596 }
597
mukesh agrawal32399322011-09-01 10:53:43 -0700598 const WiFiConstRefPtr wifi() const {
599 return wifi_;
600 }
601
mukesh agrawalb20776f2012-02-10 16:00:36 -0800602 TestProxyFactory *proxy_factory() {
603 return &proxy_factory_;
604 }
605
Paul Stewarte369ece2012-05-22 09:11:03 -0700606 EventDispatcher *event_dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700607 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800608 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700609
610 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700611 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800612 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700613 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700614 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800615 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700616 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700617
618 // protected fields interspersed between private fields, due to
619 // initialization order
620 protected:
621 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700622 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700623 static const char kNetworkModeAdHoc[];
624 static const char kNetworkModeInfrastructure[];
Paul Stewart44663922012-07-30 11:03:03 -0700625 static const char kBSSName[];
626 static const char kSSIDName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700627
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700628 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
629 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800630 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700631 MockDHCPProvider dhcp_provider_;
632 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200633 NiceMock<MockDBusManager> *dbus_manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700634
635 private:
636 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700637};
638
Paul Stewarte369ece2012-05-22 09:11:03 -0700639const char WiFiObjectTest::kDeviceName[] = "wlan0";
640const char WiFiObjectTest::kDeviceAddress[] = "000102030405";
641const char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
642const char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
Paul Stewart44663922012-07-30 11:03:03 -0700643const char WiFiObjectTest::kBSSName[] = "bss0";
644const char WiFiObjectTest::kSSIDName[] = "ssid0";
mukesh agrawal31950242011-07-14 11:53:38 -0700645
Paul Stewarte369ece2012-05-22 09:11:03 -0700646void WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000647 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000648}
649
Paul Stewarte369ece2012-05-22 09:11:03 -0700650void WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
mukesh agrawal31950242011-07-14 11:53:38 -0700651 const string &ssid,
652 const string &bssid,
653 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000654 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700655 const char *mode) {
656 map<string, ::DBus::Variant> bss_properties;
657
658 {
659 DBus::MessageIter writer(bss_properties["SSID"].writer());
660 writer << vector<uint8_t>(ssid.begin(), ssid.end());
661 }
662 {
663 string bssid_nosep;
664 vector<uint8_t> bssid_bytes;
665 RemoveChars(bssid, ":", &bssid_nosep);
666 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
667
668 DBus::MessageIter writer(bss_properties["BSSID"].writer());
669 writer << bssid_bytes;
670 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000671 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
672 append_int16(signal_strength);
673 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
674 append_uint16(frequency);
675 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000676 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700677}
678
Paul Stewarte369ece2012-05-22 09:11:03 -0700679WiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
mukesh agrawalb20776f2012-02-10 16:00:36 -0800680 : test_(test) {
681 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
682 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
683 .WillByDefault(
684 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
685}
686
Paul Stewarte369ece2012-05-22 09:11:03 -0700687// Most of our tests involve using a real EventDispatcher object.
688class WiFiMainTest : public WiFiObjectTest {
689 public:
690 WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
691
692 protected:
693 EventDispatcher dispatcher_;
694};
695
mukesh agrawal31950242011-07-14 11:53:38 -0700696TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
697 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
698 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
699
700 StartWiFi();
701 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
702 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
703}
704
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200705TEST_F(WiFiMainTest, SupplicantPresent) {
706 EXPECT_FALSE(GetSupplicantPresent());
707}
708
709TEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
710 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
711
712 EXPECT_CALL(*dbus_manager_, WatchName(wpa_supplicant::kDBusAddr, _, _));
713 StartWiFi(false); // No supplicant present.
714 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
715
716 OnSupplicantAppear();
717 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200718
719 // If supplicant reappears while the device is started, the device should be
720 // restarted.
721 EXPECT_CALL(*manager(), DeregisterDevice(_));
722 EXPECT_CALL(*manager(), RegisterDevice(_));
723 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200724}
725
726TEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
727 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
728
729 OnSupplicantAppear();
730 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200731
732 // If supplicant reappears while the device is stopped, the device should not
733 // be restarted.
734 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
735 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200736}
737
738TEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
739 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
740
741 StartWiFi();
742 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
743 EXPECT_TRUE(GetSupplicantPresent());
744
745 EXPECT_CALL(*manager(), DeregisterDevice(_));
746 EXPECT_CALL(*manager(), RegisterDevice(_));
747 OnSupplicantVanish();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200748}
749
750TEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
751 OnSupplicantAppear();
752 EXPECT_TRUE(GetSupplicantPresent());
753 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
754 OnSupplicantVanish();
755}
756
Paul Stewart549d44c2012-07-03 12:40:25 -0700757TEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
758 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
759 *supplicant_interface_proxy_;
760 WiFiService *service(SetupConnectedService(DBus::Path()));
761 ScopedMockLog log;
762 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
Christopher Wileyc6184482012-10-24 15:31:56 -0700763 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
Paul Stewart549d44c2012-07-03 12:40:25 -0700764 EndsWith("silently resetting current_service_.")));
765 EXPECT_CALL(*manager(), DeregisterDevice(_))
766 .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
767 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
768 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
769 EXPECT_CALL(supplicant_interface_proxy, Disconnect()).Times(0);
770 EXPECT_CALL(*manager(), RegisterDevice(_));
771 OnSupplicantVanish();
772 EXPECT_TRUE(GetCurrentService() == NULL);
773}
774
mukesh agrawal31950242011-07-14 11:53:38 -0700775TEST_F(WiFiMainTest, CleanStart) {
776 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
777 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
778 .Times(AnyNumber())
779 .WillRepeatedly(Throw(
780 DBus::Error(
781 "fi.w1.wpa_supplicant1.InterfaceUnknown",
782 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart87a4ae82012-10-26 15:49:32 -0700783 EXPECT_CALL(*manager(), LoadDeviceFromProfiles(_));
mukesh agrawal31950242011-07-14 11:53:38 -0700784 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700785 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700786 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700787 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700788 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700789}
790
Ben Chan381fdcc2012-10-14 21:10:36 -0700791TEST_F(WiFiMainTest, RemoveNetwork) {
792 DBus::Path network = "/test/path";
793 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network));
794 StartWiFi();
795 EXPECT_TRUE(RemoveNetwork(network));
796}
797
798TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
799 DBus::Path network = "/test/path";
800 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network))
801 .WillRepeatedly(Throw(
802 DBus::Error(
803 "fi.w1.wpa_supplicant1.NetworkUnknown",
804 "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
805 StartWiFi();
806 EXPECT_TRUE(RemoveNetwork(network));
807}
808
809TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
810 DBus::Path network = "/test/path";
811 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network))
812 .WillRepeatedly(Throw(
813 DBus::Error(
814 "fi.w1.wpa_supplicant1.InvalidArgs",
815 "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
816 StartWiFi();
817 EXPECT_FALSE(RemoveNetwork(network));
818}
819
820TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
821 DBus::Path network = "/test/path";
822 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network))
823 .WillRepeatedly(Throw(
824 DBus::Error(
825 "fi.w1.wpa_supplicant1.UnknownError",
826 "test threw fi.w1.wpa_supplicant1.UnknownError")));
827 StartWiFi();
828 EXPECT_FALSE(RemoveNetwork(network));
829}
830
mukesh agrawal31950242011-07-14 11:53:38 -0700831TEST_F(WiFiMainTest, Restart) {
832 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
833 .Times(AnyNumber())
834 .WillRepeatedly(Throw(
835 DBus::Error(
836 "fi.w1.wpa_supplicant1.InterfaceExists",
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200837 "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
mukesh agrawal31950242011-07-14 11:53:38 -0700838 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
839 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
840 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700841 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700842}
843
844TEST_F(WiFiMainTest, StartClearsState) {
845 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
846 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
847 StartWiFi();
848}
849
Christopher Wileyc68c8672012-11-20 16:52:21 -0800850TEST_F(WiFiMainTest, NoScansWhileConnecting) {
851 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
852 StartWiFi();
853 SetPendingService(service);
854 // If we're connecting, we ignore scan requests to stay on channel.
855 service->state_ = Service::kStateConfiguring;
856 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
857 TriggerScan();
858 dispatcher_.DispatchPendingEvents();
859 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
860 // But otherwise we'll honor the request.
861 service->state_ = Service::kStateConnected;
862 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
863 TriggerScan();
864 dispatcher_.DispatchPendingEvents();
865 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
866 // Similarly, ignore scans when our connected service is reconnecting.
867 SetPendingService(NULL);
868 SetCurrentService(service);
869 service->state_ = Service::kStateAssociating;
870 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
871 TriggerScan();
872 dispatcher_.DispatchPendingEvents();
873 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
874 // But otherwise we'll honor the request.
875 service->state_ = Service::kStateIdle;
876 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
877 TriggerScan();
878 dispatcher_.DispatchPendingEvents();
879 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
880}
881
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700882TEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800883 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
884 StartWiFi();
885 dispatcher_.DispatchPendingEvents();
886 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800887 ReportScanDone();
Gary Morainac1bdb42012-02-16 17:42:29 -0800888 ASSERT_TRUE(wifi()->IsIdle());
889 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700890 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -0800891 dispatcher_.DispatchPendingEvents();
892}
893
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700894TEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800895 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
896 StartWiFi();
897 dispatcher_.DispatchPendingEvents();
898 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Gary Morainac1bdb42012-02-16 17:42:29 -0800899 ASSERT_TRUE(wifi()->IsIdle());
900 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700901 OnBeforeSuspend();
Gary Morainac1bdb42012-02-16 17:42:29 -0800902 dispatcher_.DispatchPendingEvents();
903}
904
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700905TEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800906 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
907 StartWiFi();
908
909 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
910 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
911 Error error;
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700912 ScopedMockLog log;
Gary Morainac1bdb42012-02-16 17:42:29 -0800913 service->AddEndpoint(ap);
914 service->AutoConnect();
Christopher Wileyc68c8672012-11-20 16:52:21 -0800915 service->SetState(Service::kStateOnline);
Gary Morainac1bdb42012-02-16 17:42:29 -0800916 EXPECT_FALSE(wifi()->IsIdle());
917 dispatcher_.DispatchPendingEvents();
918 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Gary Morainac1bdb42012-02-16 17:42:29 -0800919 ASSERT_FALSE(wifi()->IsIdle());
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700920 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
921 EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
Gary Morainac1bdb42012-02-16 17:42:29 -0800922 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700923 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -0800924 dispatcher_.DispatchPendingEvents();
925}
926
mukesh agrawal31950242011-07-14 11:53:38 -0700927TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800928 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700929 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000930 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700931 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000932 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700933 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000934 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700935 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000936 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
937 const uint16 frequency = 2412;
938 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
939 kNetworkModeAdHoc);
940
941 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
942 EXPECT_EQ(5, endpoints_by_rpcid.size());
943
944 WiFi::EndpointMap::const_iterator i;
945 WiFiEndpointRefPtr endpoint;
946 for (i = endpoints_by_rpcid.begin();
947 i != endpoints_by_rpcid.end();
948 ++i) {
949 if (i->second->bssid_string() == "00:00:00:00:00:04")
950 break;
951 }
952 ASSERT_TRUE(i != endpoints_by_rpcid.end());
953 EXPECT_EQ(4, i->second->signal_strength());
954 EXPECT_EQ(frequency, i->second->frequency());
955 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700956}
957
958TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800959 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
960 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
961 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700962 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000963 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700964 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000965 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700966 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000967 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700968 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000969 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
970 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000971
972 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
973 EXPECT_EQ(3, endpoints_by_rpcid.size());
974
975 WiFi::EndpointMap::const_iterator i;
976 WiFiEndpointRefPtr endpoint;
977 for (i = endpoints_by_rpcid.begin();
978 i != endpoints_by_rpcid.end();
979 ++i) {
980 if (i->second->bssid_string() == "00:00:00:00:00:00")
981 break;
982 }
983 ASSERT_TRUE(i != endpoints_by_rpcid.end());
984 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700985}
986
987TEST_F(WiFiMainTest, ScanCompleted) {
988 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000989 EXPECT_CALL(*manager(), RegisterService(_))
990 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000991 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700992 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000993 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700994 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000995 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700996 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000997 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800998
mukesh agrawale9adda12012-02-09 18:33:48 -0800999 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +00001000 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -08001001 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -08001002 EXPECT_EQ(3, GetServices().size());
1003
mukesh agrawale9adda12012-02-09 18:33:48 -08001004 // BSSes with empty SSIDs should be filtered.
1005 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1006 EXPECT_EQ(3, GetEndpointMap().size());
1007 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +00001008}
1009
1010TEST_F(WiFiMainTest, EndpointGroupingTogether) {
1011 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +00001012
1013 InSequence s;
1014 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -08001015 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001016 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001017 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1018 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +00001019 ReportScanDone();
1020 EXPECT_EQ(1, GetServices().size());
1021}
1022
1023TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
1024 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +00001025 EXPECT_CALL(*manager(), RegisterService(_))
1026 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +00001027 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1028 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +00001029 ReportScanDone();
1030 EXPECT_EQ(2, GetServices().size());
1031}
1032
1033TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
1034 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +00001035 EXPECT_CALL(*manager(), RegisterService(_))
1036 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +00001037 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1038 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
1039 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +00001040 ReportScanDone();
1041 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -07001042}
1043
mukesh agrawal261daca2011-12-02 18:56:56 +00001044TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
1045 // Removal of non-existent BSS should not cause a crash.
1046 StartWiFi();
1047 RemoveBSS("bss0");
1048 EXPECT_EQ(0, GetServices().size());
1049}
1050
mukesh agrawale9adda12012-02-09 18:33:48 -08001051TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
1052 // Removal of BSS with an empty SSID should not cause a crash.
1053 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
1054 StartWiFi();
1055 RemoveBSS("bss");
1056 EXPECT_EQ(0, GetServices().size());
1057}
1058
1059TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
1060 // Removal of BSS with a NULL SSID should not cause a crash.
1061 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
1062 StartWiFi();
1063 RemoveBSS("bss");
1064 EXPECT_EQ(0, GetServices().size());
1065}
1066
mukesh agrawal261daca2011-12-02 18:56:56 +00001067TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001068 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001069 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001070 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001071 ReportScanDone();
1072 EXPECT_EQ(1, GetServices().size());
1073 EXPECT_TRUE(GetServices().front()->IsVisible());
1074
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001075 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001076 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001077 EXPECT_TRUE(GetServices().empty());
1078}
1079
1080TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001081 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001082 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001083 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001084 ReportScanDone();
1085 ReportCurrentBSSChanged("bss0");
1086
1087 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1088 EXPECT_CALL(*manager(), DeregisterService(_));
1089 RemoveBSS("bss0");
1090 EXPECT_TRUE(GetServices().empty());
1091}
1092
1093TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001094 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1095 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001096 StartWiFi();
1097
1098 Error e;
1099 WiFiServiceRefPtr service =
1100 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
1101 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +00001102 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001103
Thieu Lee41a72d2012-02-06 20:46:51 +00001104 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
1105 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001106 ReportScanDone();
1107 ReportCurrentBSSChanged("bss");
1108 EXPECT_EQ(1, GetServices().size());
1109
1110 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001111 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001112 EXPECT_EQ(1, GetServices().size());
1113 // Verify expectations now, because WiFi may call UpdateService when
1114 // WiFi is Stop()-ed (during TearDown()).
1115 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -08001116 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001117}
1118
1119TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001120 EXPECT_CALL(*manager(), RegisterService(_));
1121 EXPECT_CALL(*manager(), HasService(_));
1122 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001123 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001124 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1125 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001126 ReportScanDone();
1127 EXPECT_EQ(1, GetServices().size());
1128 EXPECT_TRUE(GetServices().front()->IsVisible());
1129
1130 EXPECT_CALL(*manager(), UpdateService(_));
1131 RemoveBSS("bss0");
1132 EXPECT_TRUE(GetServices().front()->IsVisible());
1133 EXPECT_EQ(1, GetServices().size());
1134}
1135
mukesh agrawal31950242011-07-14 11:53:38 -07001136TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001137 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001138 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1139 *supplicant_interface_proxy_;
1140
mukesh agrawal31950242011-07-14 11:53:38 -07001141 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001142 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -07001143 ReportScanDone();
1144
1145 {
1146 InSequence s;
1147 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +00001148 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -07001149
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001150 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -07001151 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001152 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -07001153 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -07001154 EXPECT_EQ(static_cast<Service *>(service),
1155 wifi()->selected_service_.get());
Paul Stewart2b05e622012-07-13 20:38:44 -07001156 EXPECT_EQ(Service::kStateAssociating, service->state());
1157 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -07001158 }
1159}
1160
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001161TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001162 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001163 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1164 *supplicant_interface_proxy_;
1165
1166 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001167 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001168 WiFiService *service(GetServices().begin()->get());
1169 InitiateConnect(service);
1170
1171 EXPECT_FALSE(GetPendingService() == NULL);
Paul Stewartff96a842012-08-13 15:59:10 -07001172 EXPECT_TRUE(service->IsConnecting());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001173 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1174 InitiateDisconnect(service);
Paul Stewartff96a842012-08-13 15:59:10 -07001175 EXPECT_FALSE(service->IsConnecting());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001176
1177 EXPECT_TRUE(GetPendingService() == NULL);
1178}
1179
1180TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001181 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001182 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001183 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1184 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001185 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1186 *supplicant_interface_proxy_;
1187
1188 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001189 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1190 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001191 WiFiService *service0(GetServices()[0].get());
1192 WiFiService *service1(GetServices()[1].get());
1193
1194 InitiateConnect(service0);
1195 ReportCurrentBSSChanged("bss0");
1196 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1197 InitiateConnect(service1);
1198
1199 EXPECT_EQ(service0, GetCurrentService());
1200 EXPECT_EQ(service1, GetPendingService());
1201 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1202 InitiateDisconnect(service1);
1203
1204 // |current_service_| will be unchanged until supplicant signals
1205 // that CurrentBSS has changed.
1206 EXPECT_EQ(service0, GetCurrentService());
1207 // |pending_service_| is updated immediately.
1208 EXPECT_TRUE(GetPendingService() == NULL);
Paul Stewart2b05e622012-07-13 20:38:44 -07001209 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001210}
1211
1212TEST_F(WiFiMainTest, DisconnectCurrentService) {
1213 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1214 *supplicant_interface_proxy_;
Paul Stewart549d44c2012-07-03 12:40:25 -07001215 WiFiService *service(SetupConnectedService(DBus::Path()));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001216 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1217 InitiateDisconnect(service);
1218
1219 // |current_service_| should not change until supplicant reports
1220 // a BSS change.
1221 EXPECT_EQ(service, GetCurrentService());
1222}
1223
Christopher Wileyc6184482012-10-24 15:31:56 -07001224TEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
1225 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1226 *supplicant_interface_proxy_;
1227 WiFiService *service(SetupConnectedService(DBus::Path()));
1228 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1229 .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
1230 InitiateDisconnect(service);
1231
1232 // We may sometimes fail to disconnect via supplicant, and we patch up some
1233 // state when this happens.
1234 EXPECT_EQ(NULL, GetCurrentService().get());
1235 EXPECT_EQ(NULL, wifi()->selected_service().get());
1236}
1237
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001238TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001239 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001240 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001241 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1242 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001243 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1244 *supplicant_interface_proxy_;
1245
1246 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001247 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1248 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001249 WiFiService *service0(GetServices()[0].get());
1250 WiFiService *service1(GetServices()[1].get());
1251
1252 InitiateConnect(service0);
1253 ReportCurrentBSSChanged("bss0");
1254 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1255 InitiateConnect(service1);
1256
1257 EXPECT_EQ(service0, GetCurrentService());
1258 EXPECT_EQ(service1, GetPendingService());
1259 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1260 .Times(0);
1261 InitiateDisconnect(service0);
1262
1263 EXPECT_EQ(service0, GetCurrentService());
1264 EXPECT_EQ(service1, GetPendingService());
Paul Stewart2b05e622012-07-13 20:38:44 -07001265 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
1266}
1267
1268TEST_F(WiFiMainTest, TimeoutPendingService) {
1269 StartWiFi();
1270 dispatcher_.DispatchPendingEvents();
1271 const base::CancelableClosure &pending_timeout = GetPendingTimeout();
1272 EXPECT_TRUE(pending_timeout.IsCancelled());
1273
1274 InSequence seq;
1275 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1276 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
1277 InitiateConnect(service);
1278 EXPECT_FALSE(pending_timeout.IsCancelled());
1279 EXPECT_EQ(service, GetPendingService());
1280
Paul Stewartff96a842012-08-13 15:59:10 -07001281 {
1282 InSequence seq;
1283 EXPECT_CALL(*service, SetState(Service::kStateIdle));
1284 EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
1285 pending_timeout.callback().Run();
1286 }
Paul Stewart2b05e622012-07-13 20:38:44 -07001287 EXPECT_EQ(NULL, GetPendingService().get());
1288
1289 // Verify expectations now, because WiFi may report other state changes
1290 // when WiFi is Stop()-ed (during TearDown()).
1291 Mock::VerifyAndClearExpectations(service.get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001292}
1293
1294TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001295 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001296 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1297 *supplicant_interface_proxy_;
1298
1299 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001300 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001301 WiFiService *service(GetServices().begin()->get());
1302 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1303 .Times(0);
1304 InitiateDisconnect(service);
1305}
1306
1307TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
1308 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1309 *supplicant_interface_proxy_;
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001310 DBus::Path fake_path("/fake/path");
Paul Stewart549d44c2012-07-03 12:40:25 -07001311 WiFiService *service(SetupConnectedService(fake_path));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001312 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1313 .WillRepeatedly(Throw(
1314 DBus::Error(
1315 "fi.w1.wpa_supplicant1.NotConnected",
1316 "test threw fi.w1.wpa_supplicant1.NotConnected")));
1317 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
1318 InitiateDisconnect(service);
1319
1320 EXPECT_TRUE(GetCurrentService() == NULL);
1321}
1322
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001323TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001324 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001325 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001326 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001327 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001328
mukesh agrawalc01f3982012-01-24 13:48:39 -08001329 EXPECT_CALL(*manager(), DeregisterService(_));
1330 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001331 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawalc4f368f2012-06-04 19:45:52 -07001332 EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001333}
1334
Paul Stewart549d44c2012-07-03 12:40:25 -07001335TEST_F(WiFiMainTest, StopWhileConnected) {
1336 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1337 *supplicant_interface_proxy_;
1338 WiFiService *service(SetupConnectedService(DBus::Path()));
1339 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
1340 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
1341 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1342 StopWiFi();
1343 EXPECT_TRUE(GetCurrentService() == NULL);
1344}
1345
Paul Stewart44663922012-07-30 11:03:03 -07001346TEST_F(WiFiMainTest, ReconnectTimer) {
1347 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1348 *supplicant_interface_proxy_;
1349 WiFiService *service(SetupConnectedService(DBus::Path()));
1350 service->SetState(Service::kStateConnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001351 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001352 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001353 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001354 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
Paul Stewart1aff7302012-08-04 20:04:47 -07001355 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001356 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001357 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001358 ReportCurrentBSSChanged(kBSSName);
Paul Stewart1aff7302012-08-04 20:04:47 -07001359 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001360 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001361 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001362 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
Paul Stewart1aff7302012-08-04 20:04:47 -07001363 GetReconnectTimeoutCallback().callback().Run();
Paul Stewart44663922012-07-30 11:03:03 -07001364 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Paul Stewart1aff7302012-08-04 20:04:47 -07001365 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001366}
1367
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001368TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1369 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001370 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001371 EXPECT_TRUE(e.IsSuccess());
1372}
1373
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001374TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1375 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001376 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001377 EXPECT_EQ(Error::kInvalidArguments, e.type());
1378 EXPECT_EQ("must specify SSID", e.message());
1379}
1380
1381TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1382 Error e;
1383 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001384 flimflam::kTypeWifi, "123456789012345678901234567890123",
1385 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001386 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1387 EXPECT_EQ("SSID is too long", e.message());
1388}
1389
1390TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1391 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001392 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001393 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1394 EXPECT_EQ("SSID is too short", e.message());
1395}
1396
1397TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1398 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001399 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001400 EXPECT_EQ(Error::kNotSupported, e.type());
1401 EXPECT_EQ("service mode is unsupported", e.message());
1402}
1403
1404TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1405 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001406 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001407 EXPECT_TRUE(e.IsSuccess());
1408}
1409
1410TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1411 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001412 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1413 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001414 EXPECT_TRUE(e.IsSuccess());
1415}
1416
1417TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001418 // When configuring hidden networks, Chrome expects to be able to
1419 // GetService w/o a password, and supply the password with
1420 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001421 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001422 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1423 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001424 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001425}
1426
1427TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1428 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001429 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1430 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001431 EXPECT_EQ(Error::kNotSupported, e.type());
1432 EXPECT_EQ("security mode is unsupported", e.message());
1433}
1434
1435TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001436 // When configuring hidden networks, Chrome expects to be able to
1437 // GetService w/o a password, and supply the password with
1438 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001439 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001440 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1441 flimflam::kSecurityWep, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001442 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001443}
1444
1445TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1446 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001447 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1448 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001449 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1450}
1451
1452TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1453 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001454 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1455 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001456 EXPECT_TRUE(e.IsSuccess());
1457}
1458
1459TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1460 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001461 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1462 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001463 EXPECT_TRUE(e.IsSuccess());
1464}
1465
1466TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1467 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001468 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1469 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001470 EXPECT_TRUE(e.IsSuccess());
1471}
1472
1473TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1474 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001475 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1476 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001477 EXPECT_TRUE(e.IsSuccess());
1478}
1479
1480TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1481 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001482 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1483 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001484 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1485}
1486
1487TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1488 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001489 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1490 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001491 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1492}
1493
1494TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1495 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001496 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1497 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001498 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1499}
1500
1501TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1502 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001503 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1504 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001505 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1506}
1507
1508TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1509 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001510 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1511 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001512 EXPECT_TRUE(e.IsSuccess());
1513}
1514
1515TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1516 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001517 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1518 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001519 EXPECT_TRUE(e.IsSuccess());
1520}
1521
1522TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1523 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001524 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1525 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001526 EXPECT_TRUE(e.IsSuccess());
1527}
1528
1529TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1530 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001531 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1532 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001533 EXPECT_TRUE(e.IsSuccess());
1534}
1535
mukesh agrawal8ede0522011-10-03 14:57:44 -07001536class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1537class WiFiGetServiceFailureTest : public WiFiMainTest {};
1538
1539TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1540 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001541 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1542 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001543 EXPECT_TRUE(e.IsSuccess());
1544}
1545
1546TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1547 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001548 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1549 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001550 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1551}
1552
1553INSTANTIATE_TEST_CASE_P(
1554 WiFiGetServiceSuccessTestInstance,
1555 WiFiGetServiceSuccessTest,
1556 Values(
1557 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1558 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1559 // subtle: invalid length for hex key, but valid as ascii passphrase
1560 string(IEEE_80211::kWPAHexLen-1, '1'),
1561 string(IEEE_80211::kWPAHexLen, '1')));
1562
1563INSTANTIATE_TEST_CASE_P(
1564 WiFiGetServiceFailureTestInstance,
1565 WiFiGetServiceFailureTest,
1566 Values(
1567 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1568 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1569 string(IEEE_80211::kWPAHexLen+1, '1')));
1570
Paul Stewart6ab23a92011-11-09 17:17:47 -08001571TEST_F(WiFiMainTest, FindServiceWEP) {
1572 const string ssid("an_ssid");
1573 {
1574 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001575 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001576 flimflam::kSecurityWep, "abcde", &e);
1577 EXPECT_TRUE(e.IsSuccess());
1578 }
1579 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1580
Paul Stewarta41e38d2011-11-11 07:47:29 -08001581 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1582 flimflam::kSecurityWep).get());
1583 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1584 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001585}
1586
1587TEST_F(WiFiMainTest, FindServiceWPA) {
1588 const string ssid("an_ssid");
1589 {
1590 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001591 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001592 flimflam::kSecurityRsn, "abcdefgh", &e);
1593 EXPECT_TRUE(e.IsSuccess());
1594 }
1595 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001596 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1597 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001598 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001599 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1600 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001601 EXPECT_TRUE(rsn_service.get());
1602 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001603 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1604 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001605 EXPECT_EQ(wpa_service.get(), psk_service.get());
1606 // Indirectly test FindService by doing a GetService on something that
1607 // already exists.
1608 {
1609 Error e;
1610 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001611 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1612 flimflam::kModeManaged, flimflam::kSecurityWpa,
1613 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001614 EXPECT_TRUE(e.IsSuccess());
1615 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1616 }
1617}
1618
Paul Stewartcb59fed2012-03-21 21:14:46 -07001619TEST_F(WiFiMainTest, GetServiceWithGUID) {
1620 // Perform a GetService that also configures properties in the base Service
1621 // class using Service::Configure().
1622 KeyValueStore args;
1623 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1624 args.SetString(flimflam::kSSIDProperty, "ssid");
1625 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1626 const string kGUID = "aguid"; // Stored as a registered Service property.
1627 args.SetString(flimflam::kGuidProperty, kGUID);
1628 Error e;
1629 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1630 EXPECT_TRUE(e.IsSuccess());
1631 EXPECT_EQ(kGUID, service->guid());
1632}
1633
Paul Stewartced6a0b2011-11-08 15:32:04 -08001634MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001635 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001636 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1637 if (it == arg.end()) {
1638 return false;
1639 }
1640
1641 const DBus::Variant &ssids_variant = it->second;
1642 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1643 const ByteArrays &ssids = it->second.operator ByteArrays();
1644 // A valid Scan containing a single hidden SSID should contain
1645 // two SSID entries: one containing the SSID we are looking for,
1646 // and an empty entry, signifying that we also want to do a
1647 // broadcast probe request for all non-hidden APs as well.
1648 return ssids.size() == 2 &&
1649 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1650 ssids[1].empty();
1651}
1652
1653TEST_F(WiFiMainTest, ScanHidden) {
1654 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1655 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1656 .Times(AnyNumber())
1657 .WillRepeatedly(Throw(
1658 DBus::Error(
1659 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1660 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart10ccbb32012-04-26 15:59:30 -07001661 scoped_refptr<MockProfile> profile(
1662 new NiceMock<MockProfile>(control_interface(), manager(), ""));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001663 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001664 // Create a hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001665 Error e;
1666 WiFiServiceRefPtr service =
1667 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1668 NULL, NULL, true, &e);
1669 EXPECT_TRUE(e.IsSuccess());
1670 EXPECT_TRUE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001671 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001672 }
1673 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001674 // Create a hidden service without an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001675 Error e;
1676 WiFiServiceRefPtr service =
1677 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1678 NULL, NULL, true, &e);
1679 EXPECT_TRUE(e.IsSuccess());
1680 EXPECT_TRUE(service->hidden_ssid());
1681 }
1682 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001683 // Create a non-hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001684 Error e;
1685 WiFiServiceRefPtr service =
1686 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1687 NULL, NULL, false, &e);
1688 EXPECT_TRUE(e.IsSuccess());
1689 EXPECT_FALSE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001690 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001691 }
1692 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001693 StartWiFi();
1694 dispatcher_.DispatchPendingEvents();
1695}
1696
Paul Stewartfae4dae2012-09-13 07:43:32 -07001697TEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1698 ScopedMockLog log;
1699 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1700 EXPECT_CALL(log, Log(_, _, EndsWith(
1701 "Ignoring scan request while device is not enabled."))).Times(1);
1702 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_)).Times(0);
1703 StartWiFi();
1704 StopWiFi();
1705 // A scan is queued when WiFi resumes.
1706 OnAfterResume();
1707 dispatcher_.DispatchPendingEvents();
1708}
1709
mukesh agrawal7ec71312011-11-10 02:08:26 +00001710TEST_F(WiFiMainTest, InitialSupplicantState) {
1711 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1712}
1713
1714TEST_F(WiFiMainTest, StateChangeNoService) {
1715 // State change should succeed even if there is no pending Service.
1716 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1717 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1718}
1719
1720TEST_F(WiFiMainTest, StateChangeWithService) {
1721 // Forward transition should trigger a Service state change.
1722 StartWiFi();
1723 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001724 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001725 InitiateConnect(service);
1726 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1727 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1728 // Verify expectations now, because WiFi may report other state changes
1729 // when WiFi is Stop()-ed (during TearDown()).
1730 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001731 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001732}
1733
1734TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1735 // Some backwards transitions should not trigger a Service state change.
1736 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001737 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001738 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001739 StartWiFi();
1740 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001741 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Paul Stewart2b05e622012-07-13 20:38:44 -07001742 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
Gary Moraind9f893f2012-02-06 10:03:40 -08001743 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001744 InitiateConnect(service);
1745 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001746 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1747 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1748 GetSupplicantState());
1749 // Verify expectations now, because WiFi may report other state changes
1750 // when WiFi is Stop()-ed (during TearDown()).
1751 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001752 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001753}
1754
Paul Stewarta41e38d2011-11-11 07:47:29 -08001755TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1756 StrictMock<MockStore> storage;
1757 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1758 .WillOnce(Return(set<string>()));
1759 EXPECT_FALSE(LoadHiddenServices(&storage));
1760}
1761
1762TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1763 string id;
1764 StrictMock<MockStore> storage;
1765 SetupHiddenStorage(&storage, "an_ssid", &id);
1766 // Missing "Hidden" property.
1767 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1768 .WillOnce(Return(false));
1769 EXPECT_FALSE(LoadHiddenServices(&storage));
1770}
1771
1772TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1773 string id;
1774 StrictMock<MockStore> storage;
1775 SetupHiddenStorage(&storage, "an_ssid", &id);
1776 // "Hidden" property set to "false".
1777 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1778 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1779 EXPECT_FALSE(LoadHiddenServices(&storage));
1780}
1781
1782TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1783 string id;
1784 StrictMock<MockStore> storage;
1785 SetupHiddenStorage(&storage, "an_ssid", &id);
1786 // Missing "SSID" property.
1787 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1788 .WillOnce(Return(false));
1789 EXPECT_FALSE(LoadHiddenServices(&storage));
1790}
1791
1792
1793TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1794 StrictMock<MockStore> storage;
1795 string id;
1796 SetupHiddenStorage(&storage, "an_ssid", &id);
1797 Error e;
1798 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1799 ASSERT_TRUE(e.IsSuccess());
1800 EXPECT_FALSE(LoadHiddenServices(&storage));
1801}
1802
1803TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001804 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001805 StrictMock<MockStore> storage;
1806 string ssid("an_ssid");
1807 string id;
1808 SetupHiddenStorage(&storage, ssid, &id);
1809 EXPECT_TRUE(LoadHiddenServices(&storage));
1810 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1811 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1812 flimflam::kSecurityNone).get());
1813}
1814
mukesh agrawal15908392011-11-16 18:29:25 +00001815TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001816 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001817 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001818 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1819 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001820 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1821 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1822
1823 // Note that the BSS handle used in this test ("an_ap") is not
1824 // intended to reflect the format used by supplicant. It's just
1825 // convenient for testing.
1826
1827 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001828 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001829 kNetworkModeInfrastructure);
1830 InitiateConnect(service);
1831 EXPECT_EQ(service, GetPendingService().get());
1832
1833 ReportCurrentBSSChanged("an_ap");
1834 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1835 EXPECT_EQ(Service::kStateConfiguring, service->state());
1836 EXPECT_EQ(service, GetCurrentService().get());
1837 EXPECT_EQ(NULL, GetPendingService().get());
1838
1839 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001840 EXPECT_EQ(Service::kStateIdle, service->state());
1841 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001842 EXPECT_EQ(NULL, GetCurrentService().get());
1843 EXPECT_EQ(NULL, GetPendingService().get());
1844}
1845
1846TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001847 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001848 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001849 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1850 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001851 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1852 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1853 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1854 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1855
1856 // Note that the BSS handles used in this test ("ap1", "ap2") are
1857 // not intended to reflect the format used by supplicant. They're
1858 // just convenient for testing.
1859
1860 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001861 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001862 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001863 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001864 kNetworkModeInfrastructure);
1865 InitiateConnect(service1);
1866 ReportCurrentBSSChanged("ap1");
1867 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1868 EXPECT_EQ(service1.get(), GetCurrentService().get());
1869
mukesh agrawalc01f3982012-01-24 13:48:39 -08001870 // Note that we deliberately omit intermediate supplicant states
1871 // (e.g. kInterfaceStateAssociating), on the theory that they are
1872 // unreliable. Specifically, they may be quashed if the association
1873 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001874 ReportCurrentBSSChanged("ap2");
1875 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1876 EXPECT_EQ(service2.get(), GetCurrentService().get());
1877 EXPECT_EQ(Service::kStateIdle, service1->state());
1878 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1879}
1880
1881TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001882 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1883 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001884 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001885 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001886 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1887 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1888
1889 // Note that the BSS handle used in this test ("an_ap") is not
1890 // intended to reflect the format used by supplicant. It's just
1891 // convenient for testing.
1892
1893 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001894 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001895 kNetworkModeInfrastructure);
1896 InitiateConnect(service);
1897 ReportCurrentBSSChanged("an_ap");
1898 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1899 EXPECT_EQ(service.get(), GetCurrentService().get());
1900 EXPECT_EQ(Service::kStateConfiguring, service->state());
1901}
1902
Thieu Lee41a72d2012-02-06 20:46:51 +00001903TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001904 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1905 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1906 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1907
Thieu Lee41a72d2012-02-06 20:46:51 +00001908 const uint16 frequency1 = 2412;
1909 const uint16 frequency2 = 2442;
1910 StartWiFi();
1911 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1912 kNetworkModeInfrastructure);
1913 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1914 kNetworkModeInfrastructure);
1915 EXPECT_EQ(1, GetServices().size());
1916 WiFiService *service(GetServices()[0].get());
1917 InitiateConnect(service);
1918 ReportCurrentBSSChanged("bss1");
1919 EXPECT_EQ(frequency1, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001920 EXPECT_EQ("00:00:00:00:00:01", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001921 ReportCurrentBSSChanged("bss2");
1922 EXPECT_EQ(frequency2, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001923 EXPECT_EQ("00:00:00:00:00:02", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001924}
1925
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001926TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1927 Error e;
1928 EXPECT_CALL(*manager(), RegisterService(_))
1929 .Times(0);
1930 EXPECT_CALL(*manager(), HasService(_))
1931 .WillOnce(Return(false));
1932 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1933 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001934 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001935 kNetworkModeInfrastructure);
1936}
1937
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001938TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001939 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1940 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001941 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1942 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1943 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1944 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1945
1946 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001947 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001948 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001949 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001950 kNetworkModeInfrastructure);
1951 InitiateConnect(service1);
1952 EXPECT_EQ(service1.get(), GetPendingService().get());
1953
1954 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1955 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1956 InitiateConnect(service2);
1957 EXPECT_EQ(service2.get(), GetPendingService().get());
1958}
1959
1960TEST_F(WiFiMainTest, IsIdle) {
1961 StartWiFi();
1962 EXPECT_TRUE(wifi()->IsIdle());
1963
1964 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1965 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1966 Error error;
1967 service->AddEndpoint(ap);
1968 service->AutoConnect();
1969 EXPECT_FALSE(wifi()->IsIdle());
1970}
1971
Darin Petkov4a66cc52012-06-15 10:08:29 +02001972MATCHER_P(WiFiAddedArgs, bgscan, "") {
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001973 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
Darin Petkov4a66cc52012-06-15 10:08:29 +02001974 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan) == bgscan;
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001975}
1976
1977TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001978 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001979 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1980 *supplicant_interface_proxy_;
1981
1982 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001983 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001984 WiFiService *service(GetServices().begin()->get());
Darin Petkov4a66cc52012-06-15 10:08:29 +02001985 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(true)));
1986 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001987 InitiateConnect(service);
1988}
1989
Darin Petkov4a66cc52012-06-15 10:08:29 +02001990TEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
1991 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1992 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1993 *supplicant_interface_proxy_;
1994
1995 StartWiFi();
1996 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1997 WiFiService *service(GetServices().begin()->get());
1998 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(false)));
1999 InitiateConnect(service);
2000}
2001
2002TEST_F(WiFiMainTest, AppendBgscan) {
2003 StartWiFi();
2004 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2005 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap1);
2006 service->AddEndpoint(ap1);
2007 EXPECT_EQ(1, service->GetEndpointCount());
2008 {
2009 // 1 endpoint, default bgscan method -- background scan disabled.
2010 std::map<std::string, DBus::Variant> params;
2011 AppendBgscan(service.get(), &params);
2012 EXPECT_FALSE(ContainsKey(params, wpa_supplicant::kNetworkPropertyBgscan));
2013 }
2014 WiFiEndpointRefPtr ap2 = MakeEndpoint("an_ssid", "01:02:03:04:05:06");
2015 service->AddEndpoint(ap2);
2016 EXPECT_EQ(2, service->GetEndpointCount());
2017 {
2018 // 2 endpoints, default bgscan method -- background scan frequency reduced.
2019 map<string, DBus::Variant> params;
2020 AppendBgscan(service.get(), &params);
2021 string config_string;
2022 EXPECT_TRUE(
2023 DBusProperties::GetString(params,
2024 wpa_supplicant::kNetworkPropertyBgscan,
2025 &config_string));
2026 vector<string> elements;
2027 base::SplitString(config_string, ':', &elements);
2028 ASSERT_EQ(4, elements.size());
2029 EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
2030 EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
2031 elements[3]);
2032 }
2033 {
2034 // Explicit bgscan method -- regular background scan frequency.
2035 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
2036 std::map<std::string, DBus::Variant> params;
2037 AppendBgscan(service.get(), &params);
2038 string config_string;
2039 EXPECT_TRUE(
2040 DBusProperties::GetString(params,
2041 wpa_supplicant::kNetworkPropertyBgscan,
2042 &config_string));
2043 vector<string> elements;
2044 base::SplitString(config_string, ':', &elements);
2045 ASSERT_EQ(4, elements.size());
2046 EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
2047 elements[3]);
2048 }
Christopher Wiley5c929e22012-07-16 14:06:04 -07002049 {
2050 // No scan method, simply returns without appending properties
2051 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodNone));
2052 std::map<std::string, DBus::Variant> params;
2053 AppendBgscan(service.get(), &params);
2054 string config_string;
2055 EXPECT_FALSE(
2056 DBusProperties::GetString(params,
2057 wpa_supplicant::kNetworkPropertyBgscan,
2058 &config_string));
2059 }
Darin Petkov4a66cc52012-06-15 10:08:29 +02002060}
2061
mukesh agrawalc01f3982012-01-24 13:48:39 -08002062TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2063 StartWiFi();
mukesh agrawalcf24a242012-05-21 16:46:11 -07002064 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawalc01f3982012-01-24 13:48:39 -08002065 InitiateConnect(service);
2066 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2067 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2068 ReportLinkUp();
2069
2070 // Verify expectations now, because WiFi may cause |service| state
2071 // changes during TearDown().
2072 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08002073 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002074}
2075
2076TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08002077 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07002078 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08002079 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002080 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2081 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2082
2083 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00002084 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08002085 kNetworkModeInfrastructure);
2086 InitiateConnect(service);
2087
2088 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
2089 ReportCurrentBSSChanged("ap");
2090 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2091 EXPECT_EQ(Service::kStateConfiguring, service->state());
2092}
2093
2094TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08002095 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
2096 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
2097 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
2098 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07002099 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08002100 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08002101 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002102 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2103 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2104
mukesh agrawalc01f3982012-01-24 13:48:39 -08002105 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00002106 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08002107 kNetworkModeInfrastructure);
2108 InitiateConnect(service);
2109 ReportCurrentBSSChanged("ap");
2110 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
Christopher Wiley8f81e2a2012-10-17 16:51:32 -07002111 Mock::VerifyAndClearExpectations(dhcp_config_.get());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002112 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
Christopher Wiley8f81e2a2012-10-17 16:51:32 -07002113 // Simulate a rekeying event from the AP. These show as transitions from
2114 // completed->completed from wpa_supplicant.
2115 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2116 ReportIPConfigComplete();
2117 // Similarly, rekeying events after we have an IP don't trigger L3
2118 // configuration.
mukesh agrawalc01f3982012-01-24 13:48:39 -08002119 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2120}
2121
Paul Stewart66c86002012-01-30 18:00:52 -08002122TEST_F(WiFiMainTest, ClearCachedCredentials) {
Paul Stewartf48eca42012-10-11 12:10:02 -07002123 {
2124 ClearCachedCredentials();
2125 ScopedMockLog log;
2126 EXPECT_CALL(log, Log(_, _, EndsWith("supplicant proxy is NULL.")));
2127 // Also expect no crash due to supplicant interface proxy being NULL.
2128 dispatcher_.DispatchPendingEvents();
2129 }
2130
Paul Stewart66c86002012-01-30 18:00:52 -08002131 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2132 *supplicant_interface_proxy_;
2133
2134 StartWiFi();
2135
2136 // Ensure call to the proxy is deferred.
2137 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2138 .Times(0);
2139 ClearCachedCredentials();
2140
2141 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2142
2143 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2144 .Times(1);
2145 dispatcher_.DispatchPendingEvents();
2146
2147 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2148
2149 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2150 .Times(0);
2151 ClearCachedCredentials();
2152 ClearCachedCredentials();
2153
2154 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2155
2156 // Ensure multiple calls to ClearCachedCredentials() results in only
2157 // one call to the proxy.
2158 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2159 .Times(1);
2160 dispatcher_.DispatchPendingEvents();
2161}
2162
mukesh agrawalb20776f2012-02-10 16:00:36 -08002163TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2164 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2165 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2166 // we can test the interaction between WiFi and WiFiEndpoint. (Right
2167 // now, we're testing across multiple layers.)
2168 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2169 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2170 StartWiFi();
2171 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2172}
2173
2174TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2175 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2176 // factory for WiFiEndpoints.
2177 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2178
2179 // Get the pointer before we transfer ownership.
2180 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2181 EXPECT_CALL(*proxy, Die());
2182 StartWiFi();
2183 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2184 RemoveBSS("bss0");
2185 // Check this now, to make sure RemoveBSS killed the proxy (rather
2186 // than TearDown).
2187 Mock::VerifyAndClearExpectations(proxy);
2188}
2189
mukesh agrawal5c05b292012-03-07 10:12:52 -08002190TEST_F(WiFiMainTest, FlushBSSOnResume) {
2191 const struct timeval resume_time = {1, 0};
2192 const struct timeval scan_done_time = {6, 0};
2193 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2194 *supplicant_interface_proxy_;
2195
2196 StartWiFi();
2197
2198 EXPECT_CALL(time_, GetTimeMonotonic(_))
2199 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
2200 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
2201 EXPECT_CALL(supplicant_interface_proxy,
2202 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07002203 OnAfterResume();
mukesh agrawal5c05b292012-03-07 10:12:52 -08002204 ReportScanDone();
2205}
2206
mukesh agrawalb66c6462012-05-07 11:45:25 -07002207TEST_F(WiFiMainTest, ScanTimerIdle) {
2208 StartWiFi();
2209 dispatcher_.DispatchPendingEvents();
2210 ReportScanDone();
2211 CancelScanTimer();
2212 EXPECT_TRUE(GetScanTimer().IsCancelled());
2213
2214 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2215 FireScanTimer();
2216 dispatcher_.DispatchPendingEvents();
2217 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2218}
2219
2220TEST_F(WiFiMainTest, ScanTimerScanning) {
2221 StartWiFi();
2222 dispatcher_.DispatchPendingEvents();
2223 CancelScanTimer();
2224 EXPECT_TRUE(GetScanTimer().IsCancelled());
2225
2226 // Should not call Scan, since we're already scanning.
2227 // (Scanning is triggered by StartWiFi.)
2228 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2229 FireScanTimer();
2230 dispatcher_.DispatchPendingEvents();
2231 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2232}
2233
2234TEST_F(WiFiMainTest, ScanTimerConnecting) {
2235 StartWiFi();
2236 dispatcher_.DispatchPendingEvents();
2237 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2238 ReportScanDone();
2239 WiFiService *service(GetServices().begin()->get());
2240 InitiateConnect(service);
2241 CancelScanTimer();
2242 EXPECT_TRUE(GetScanTimer().IsCancelled());
2243
2244 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2245 FireScanTimer();
2246 dispatcher_.DispatchPendingEvents();
2247 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2248}
2249
2250TEST_F(WiFiMainTest, ScanTimerReconfigured) {
2251 StartWiFi();
2252 CancelScanTimer();
2253 EXPECT_TRUE(GetScanTimer().IsCancelled());
2254
2255 SetScanInterval(1);
2256 EXPECT_FALSE(GetScanTimer().IsCancelled());
2257}
2258
2259TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2260 StartWiFi();
2261 CancelScanTimer();
2262 EXPECT_TRUE(GetScanTimer().IsCancelled());
2263
2264 ReportScanDone();
2265 EXPECT_FALSE(GetScanTimer().IsCancelled());
2266}
2267
2268TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2269 StartWiFi();
2270 EXPECT_FALSE(GetScanTimer().IsCancelled());
2271
2272 SetScanInterval(0);
2273 EXPECT_TRUE(GetScanTimer().IsCancelled());
2274}
2275
2276TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2277 Error e;
2278 scoped_refptr<MockProfile> profile(
2279 new NiceMock<MockProfile>(control_interface(), manager(), ""));
2280 WiFiServiceRefPtr hidden_service =
2281 GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
2282 flimflam::kModeManaged, NULL, NULL, true, &e);
2283 hidden_service->set_profile(profile);
2284
2285 StartWiFi();
2286 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2287 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2288 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2289 kNetworkModeInfrastructure);
2290 InitiateConnect(service);
2291 ReportCurrentBSSChanged("an_ap");
2292 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2293 dispatcher_.DispatchPendingEvents();
2294
2295 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2296 Scan(HasHiddenSSID("hidden_ssid")));
2297 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2298 dispatcher_.DispatchPendingEvents();
2299}
2300
2301TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2302 StartWiFi();
2303 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2304 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2305 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2306 kNetworkModeInfrastructure);
2307 InitiateConnect(service);
2308 ReportCurrentBSSChanged("an_ap");
2309 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2310 dispatcher_.DispatchPendingEvents();
2311
2312 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2313 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2314 dispatcher_.DispatchPendingEvents();
2315}
2316
Paul Stewart3c508e12012-08-09 11:40:06 -07002317TEST_F(WiFiMainTest, LinkMonitorFailure) {
2318 StartWiFi();
2319 ScopedMockLog log;
2320 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2321 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
2322 SetLinkMonitor(link_monitor);
2323 EXPECT_CALL(*link_monitor, IsGatewayFound())
2324 .WillOnce(Return(false))
2325 .WillRepeatedly(Return(true));
2326 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2327 EndsWith("gateway was never found."))).Times(1);
2328 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
2329 OnLinkMonitorFailure();
2330 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2331 EndsWith("Called Reassociate()."))).Times(1);
2332 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
2333 OnLinkMonitorFailure();
2334 OnSupplicantVanish();
2335 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
2336 EndsWith("Cannot reassociate."))).Times(1);
2337 OnLinkMonitorFailure();
2338}
2339
mukesh agrawalcf24a242012-05-21 16:46:11 -07002340TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2341 Error e;
2342 WiFiServiceRefPtr service = GetOpenService(
2343 flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
2344 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2345 EXPECT_FALSE(service->has_ever_connected());
2346 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2347}
2348
2349TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
2350 Error e;
2351 WiFiServiceRefPtr service =
2352 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2353 flimflam::kSecurityWpa, "abcdefgh", &e);
2354 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2355 EXPECT_FALSE(service->has_ever_connected());
2356 EXPECT_TRUE(wifi()->SuspectCredentials(*service));
2357}
2358
2359TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
2360 Error e;
2361 WiFiServiceRefPtr service =
2362 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2363 flimflam::kSecurityWpa, "abcdefgh", &e);
2364 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2365 service->has_ever_connected_ = true;
2366 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2367}
2368
2369TEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
2370 ScopedMockLog log;
2371 Error e;
2372 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
2373 SetPendingService(service);
2374 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2375 EXPECT_FALSE(service->has_ever_connected());
2376
Paul Stewartf2d60912012-07-15 08:37:30 -07002377 EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
mukesh agrawal56e32202012-07-26 16:32:11 -07002378 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
2379 EXPECT_CALL(*service, SetState(_)).Times(0);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002380 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2381 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
2382 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002383}
2384
Paul Stewarte369ece2012-05-22 09:11:03 -07002385// Scanning tests will use a mock of the event dispatcher instead of a real
2386// one.
Paul Stewart1aff7302012-08-04 20:04:47 -07002387class WiFiTimerTest : public WiFiObjectTest {
Paul Stewarte369ece2012-05-22 09:11:03 -07002388 public:
Paul Stewart1aff7302012-08-04 20:04:47 -07002389 WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
Paul Stewarte369ece2012-05-22 09:11:03 -07002390
2391 protected:
2392 void ExpectInitialScanSequence();
2393
2394 StrictMock<MockEventDispatcher> mock_dispatcher_;
2395};
2396
Paul Stewart1aff7302012-08-04 20:04:47 -07002397void WiFiTimerTest::ExpectInitialScanSequence() {
Paul Stewarte369ece2012-05-22 09:11:03 -07002398 // Choose a number of iterations some multiple higher than the fast scan
2399 // count.
2400 const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2401
2402 // Each time we call FireScanTimer() below, WiFi will post a task to actually
2403 // run Scan() on the wpa_supplicant proxy.
2404 EXPECT_CALL(mock_dispatcher_, PostTask(_))
2405 .Times(kScanTimes);
2406 {
2407 InSequence seq;
2408 // The scans immediately after the initial scan should happen at the short
2409 // interval. If we add the initial scan (not invoked in this function) to
2410 // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2411 // the fast scan interval.
2412 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2413 _, WiFi::kFastScanIntervalSeconds * 1000))
2414 .Times(WiFi::kNumFastScanAttempts - 1)
2415 .WillRepeatedly(Return(true));
2416
2417 // After this, the WiFi device should use the normal scan interval.
2418 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2419 _, GetScanInterval() * 1000))
2420 .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2421 .WillRepeatedly(Return(true));
2422
2423 for (int i = 0; i < kScanTimes; i++) {
2424 FireScanTimer();
2425 }
2426 }
2427}
2428
Paul Stewart1aff7302012-08-04 20:04:47 -07002429TEST_F(WiFiTimerTest, FastRescan) {
Paul Stewarte369ece2012-05-22 09:11:03 -07002430 // This PostTask is a result of the call to Scan(NULL), and is meant to
2431 // post a task to call Scan() on the wpa_supplicant proxy immediately.
2432 EXPECT_CALL(mock_dispatcher_, PostTask(_));
2433 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2434 _, WiFi::kFastScanIntervalSeconds * 1000))
2435 .WillOnce(Return(true));
2436 StartWiFi();
2437
2438 ExpectInitialScanSequence();
2439
2440 // If we end up disconnecting, the sequence should repeat.
2441 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2442 _, WiFi::kFastScanIntervalSeconds * 1000))
2443 .WillOnce(Return(true));
2444 RestartFastScanAttempts();
2445
2446 ExpectInitialScanSequence();
2447}
2448
Paul Stewart1aff7302012-08-04 20:04:47 -07002449TEST_F(WiFiTimerTest, ReconnectTimer) {
2450 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
2451 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
2452 SetupConnectedService(DBus::Path());
2453 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2454
2455 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2456 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2457 StartReconnectTimer();
2458 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2459 StopReconnectTimer();
2460
2461 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2462 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2463 StartReconnectTimer();
2464 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2465 GetReconnectTimeoutCallback().callback().Run();
2466
2467 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2468 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2469 StartReconnectTimer();
2470 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2471
2472 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2473 _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
2474 StartReconnectTimer();
2475}
2476
Paul Stewartbc6e7392012-05-24 07:07:48 -07002477TEST_F(WiFiMainTest, EAPCertification) {
2478 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2479 EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2480
2481 ScopedMockLog log;
2482 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2483 map<string, ::DBus::Variant> args;
2484 ReportCertification(args);
2485 Mock::VerifyAndClearExpectations(&log);
2486
2487 SetCurrentService(service);
2488 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2489 ReportCertification(args);
2490 Mock::VerifyAndClearExpectations(&log);
2491
2492 const uint32 kDepth = 123;
2493 args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2494
2495 EXPECT_CALL(log,
2496 Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2497 ReportCertification(args);
2498 Mock::VerifyAndClearExpectations(&log);
2499
2500 const string kSubject("subject");
2501 args[wpa_supplicant::kInterfacePropertySubject].writer()
2502 .append_string(kSubject.c_str());
2503 EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2504 ReportCertification(args);
2505}
2506
mukesh agrawalc4f368f2012-06-04 19:45:52 -07002507TEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2508 // Scan is one task that should be skipped after Stop. Others are
2509 // skipped by the same mechanism (invalidating weak pointers), so we
2510 // don't test them individually.
2511 //
2512 // Note that we can't test behavior by setting expectations on the
2513 // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2514 StartWiFi();
2515 StopWiFi();
2516 dispatcher_.DispatchPendingEvents();
2517}
2518
Darin Petkov60ceaf32012-10-18 10:36:01 +02002519TEST_F(WiFiMainTest, VerifyPaths) {
2520 string path = WiFi::kSupplicantConfPath;
2521 TrimString(path, FilePath::kSeparators, &path);
2522 EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)));
2523}
2524
Gaurav Shah6d2c72d2012-10-16 16:30:44 -07002525struct BSS {
2526 string bsspath;
2527 string ssid;
2528 string bssid;
2529 int16_t signal_strength;
2530 uint16 frequency;
2531 const char* mode;
2532};
2533
2534TEST_F(WiFiMainTest, GetGeolocationObjects) {
2535 BSS bsses[] = {
2536 {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
2537 kNetworkModeInfrastructure},
2538 {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
2539 kNetworkModeInfrastructure},
2540 // Same SSID but different BSSID is an additional geolocation object.
2541 {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
2542 kNetworkModeInfrastructure}
2543 };
2544 StartWiFi();
2545 vector<GeolocationInfo> objects;
2546 EXPECT_EQ(objects.size(), 0);
2547
2548 for (size_t i = 0; i < arraysize(bsses); ++i) {
2549 ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
2550 bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
2551 objects = wifi()->GetGeolocationObjects();
2552 EXPECT_EQ(objects.size(), i + 1);
2553
2554 GeolocationInfo expected_info;
2555 expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
2556 expected_info.AddField(kGeoSignalStrengthProperty,
2557 StringPrintf("%d", bsses[i].signal_strength));
2558 expected_info.AddField(kGeoChannelProperty, StringPrintf(
2559 "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
2560 EXPECT_TRUE(objects[i].Equals(expected_info));
2561 };
2562};
2563
Chris Masone853b81b2011-06-24 14:11:41 -07002564} // namespace shill