blob: 838dcf1b1bfe82d7579b6acb541de99c25f81934 [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
mukesh agrawal7ec71312011-11-10 02:08:26 +000017#include <base/memory/ref_counted.h>
mukesh agrawaldc42bb32011-07-28 10:40:26 -070018#include <base/memory/scoped_ptr.h>
Paul Stewarta41e38d2011-11-11 07:47:29 -080019#include <base/stringprintf.h>
mukesh agrawal31950242011-07-14 11:53:38 -070020#include <base/string_number_conversions.h>
21#include <base/string_util.h>
Chris Masone853b81b2011-06-24 14:11:41 -070022#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070023#include <dbus-c++/dbus.h>
Chris Masone7156c922011-08-23 20:36:21 -070024#include <gmock/gmock.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070025#include <gtest/gtest.h>
Chris Masone853b81b2011-06-24 14:11:41 -070026
27#include "shill/dbus_adaptor.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070028#include "shill/event_dispatcher.h"
mukesh agrawal8ede0522011-10-03 14:57:44 -070029#include "shill/ieee80211.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070030#include "shill/key_value_store.h"
Chris Masone853b81b2011-06-24 14:11:41 -070031#include "shill/manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070032#include "shill/mock_device.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070033#include "shill/mock_dhcp_config.h"
34#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070035#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080036#include "shill/mock_metrics.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070037#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080038#include "shill/mock_store.h"
mukesh agrawal31950242011-07-14 11:53:38 -070039#include "shill/mock_supplicant_interface_proxy.h"
40#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000041#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070042#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070043#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070044#include "shill/proxy_factory.h"
45#include "shill/wifi_endpoint.h"
46#include "shill/wifi.h"
mukesh agrawal32399322011-09-01 10:53:43 -070047#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080048#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070049
50using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080051using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070052using std::string;
53using std::vector;
54using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070055using ::testing::AnyNumber;
56using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080057using ::testing::DoAll;
mukesh agrawal31950242011-07-14 11:53:38 -070058using ::testing::InSequence;
mukesh agrawal7ec71312011-11-10 02:08:26 +000059using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070060using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070061using ::testing::Return;
Paul Stewarta41e38d2011-11-11 07:47:29 -080062using ::testing::SetArgumentPointee;
63using ::testing::StrEq;
64using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070065using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070066using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070067using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070068
69namespace shill {
70
mukesh agrawal31950242011-07-14 11:53:38 -070071class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070072 public:
mukesh agrawal31950242011-07-14 11:53:38 -070073 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080074 : device_(new WiFi(control_interface(),
75 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070076 }
mukesh agrawal31950242011-07-14 11:53:38 -070077 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070078
79 protected:
80 DeviceRefPtr device_;
81};
82
mukesh agrawal31950242011-07-14 11:53:38 -070083TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070084 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
85 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070086}
87
mukesh agrawal31950242011-07-14 11:53:38 -070088TEST_F(WiFiPropertyTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -070089 {
90 ::DBus::Error error;
Chris Masonea8a2c252011-06-27 22:16:30 -070091 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070092 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070093 flimflam::kBgscanSignalThresholdProperty,
94 PropertyStoreTest::kInt32V,
95 &error));
96 }
97 {
98 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070099 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 flimflam::kScanIntervalProperty,
101 PropertyStoreTest::kUint16V,
102 &error));
103 }
Chris Masone853b81b2011-06-24 14:11:41 -0700104 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 {
106 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700107 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 flimflam::kScanningProperty,
109 PropertyStoreTest::kBoolV,
110 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700111 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700112 }
Chris Masone853b81b2011-06-24 14:11:41 -0700113}
114
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800115TEST_F(WiFiPropertyTest, BgscanMethod) {
116 {
117 ::DBus::Error error;
118 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
119 device_->mutable_store(),
120 flimflam::kBgscanMethodProperty,
121 DBusAdaptor::StringToVariant(
122 wpa_supplicant::kNetworkBgscanMethodSimple),
123 &error));
124 }
125
126 {
127 ::DBus::Error error;
128 EXPECT_FALSE(DBusAdaptor::DispatchOnType(
129 device_->mutable_store(),
130 flimflam::kBgscanMethodProperty,
131 DBusAdaptor::StringToVariant("not a real scan method"),
132 &error));
133 }
134}
135
mukesh agrawal8ede0522011-10-03 14:57:44 -0700136class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700137 public:
138 WiFiMainTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800139 : manager_(&control_interface_, NULL, &metrics_, &glib_),
Chris Masone626719f2011-08-18 16:58:48 -0700140 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700141 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800142 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700143 &manager_,
144 kDeviceName,
145 kDeviceAddress,
146 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700147 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
148 supplicant_interface_proxy_(
149 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700150 dhcp_config_(new MockDHCPConfig(&control_interface_,
151 &dispatcher_,
152 &dhcp_provider_,
153 kDeviceName,
154 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700155 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700156 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000157 // Except for WiFiServices created via WiFi::GetService, we expect
158 // that any WiFiService has been registered with the Manager. So
159 // default Manager.HasService to true, to make the common case
160 // easy.
161 ON_CALL(manager_, HasService(_)).
162 WillByDefault(Return(true));
mukesh agrawal31950242011-07-14 11:53:38 -0700163 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700164
165 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700166 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700167 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
168 wifi_->set_dhcp_provider(&dhcp_provider_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700169 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700170 }
171
172 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700173 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700174 // must Stop WiFi instance, to clear its list of services.
175 // otherwise, the WiFi instance will not be deleted. (because
176 // services reference a WiFi instance, creating a cycle.)
177 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700178 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700179 }
180
mukesh agrawal31950242011-07-14 11:53:38 -0700181 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000182 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
183
mukesh agrawal31950242011-07-14 11:53:38 -0700184 class TestProxyFactory : public ProxyFactory {
185 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700186 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700187
188 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700189 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700190 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700191 }
192
193 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700194 const WiFiRefPtr &/*wifi*/,
195 const DBus::Path &/*object_path*/,
196 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700197 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700198 }
199
200 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700201 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700202 };
203
mukesh agrawal15908392011-11-16 18:29:25 +0000204 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
205 bool hidden_ssid = false;
206 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
207 }
208 const WiFiServiceRefPtr &GetCurrentService() {
209 return wifi_->current_service_;
210 }
mukesh agrawal31950242011-07-14 11:53:38 -0700211 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000212 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700213 }
mukesh agrawal15908392011-11-16 18:29:25 +0000214 const WiFiServiceRefPtr &GetPendingService() {
215 return wifi_->pending_service_;
216 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000217 const vector<WiFiServiceRefPtr> &GetServices() {
218 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700219 }
220 // note: the tests need the proxies referenced by WiFi (not the
221 // proxies instantiated by WiFiMainTest), to ensure that WiFi
222 // sets up its proxies correctly.
223 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
224 return wifi_->supplicant_process_proxy_.get();
225 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000226 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
227 return dynamic_cast<MockSupplicantInterfaceProxy *>(
228 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700229 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000230 const string &GetSupplicantState() {
231 return wifi_->supplicant_state_;
232 }
233 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700234 map<string, ::DBus::Variant> params;
235 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700236 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000237 void InitiateDisconnect(WiFiServiceRefPtr service) {
238 wifi_->DisconnectFrom(service);
239 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700240 bool IsLinkUp() {
241 return wifi_->link_up_;
242 }
mukesh agrawal15908392011-11-16 18:29:25 +0000243 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000244 return WiFiEndpoint::MakeOpenEndpoint(ssid, bssid);
mukesh agrawal15908392011-11-16 18:29:25 +0000245 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000246 MockWiFiServiceRefPtr MakeMockService() {
247 vector<uint8_t> ssid(1, 'a');
248 return new MockWiFiService(
249 &control_interface_,
250 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800251 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000252 &manager_,
253 wifi_,
254 ssid,
255 flimflam::kModeManaged,
256 flimflam::kSecurityNone,
257 false);
258 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000259 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700260 void ReportBSS(const ::DBus::Path &bss_path,
261 const string &ssid,
262 const string &bssid,
263 int16_t signal_strength,
264 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700265 void ReportLinkUp() {
266 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
267 }
mukesh agrawal31950242011-07-14 11:53:38 -0700268 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700269 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700270 }
mukesh agrawal15908392011-11-16 18:29:25 +0000271 void ReportCurrentBSSChanged(const string &new_bss) {
272 wifi_->CurrentBSSChanged(new_bss);
273 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000274 void ReportStateChanged(const string &new_state) {
275 wifi_->StateChanged(new_state);
276 }
mukesh agrawal31950242011-07-14 11:53:38 -0700277 void StartWiFi() {
278 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700279 }
280 void StopWiFi() {
281 wifi_->Stop();
282 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800283 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700284 const char *ssid,
285 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800286 Error *result) {
287 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700288 }
289 void GetService(const char *service_type,
290 const char *ssid,
291 const char *mode,
292 const char *security,
293 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800294 Error *result) {
295 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
296 result);
297 }
298 WiFiServiceRefPtr GetServiceInner(const char *service_type,
299 const char *ssid,
300 const char *mode,
301 const char *security,
302 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800303 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800304 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700305 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700306 // in general, we want to avoid D-Bus specific code for any RPCs
307 // that come in via adaptors. we make an exception here, because
308 // calls to GetWifiService are rerouted from the Manager object to
309 // the Wifi class.
310 if (service_type != NULL)
311 args[flimflam::kTypeProperty].writer().append_string(service_type);
312 if (ssid != NULL)
313 args[flimflam::kSSIDProperty].writer().append_string(ssid);
314 if (mode != NULL)
315 args[flimflam::kModeProperty].writer().append_string(mode);
316 if (security != NULL)
317 args[flimflam::kSecurityProperty].writer().append_string(security);
318 if (passphrase != NULL)
319 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800320 if (!allow_hidden)
321 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700322
Paul Stewartced6a0b2011-11-08 15:32:04 -0800323 Error e;
324 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700325 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800326 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700327 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800328 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
329 const string &mode,
330 const string &security) {
331 return wifi_->FindService(ssid, mode, security);
332 }
333 bool LoadHiddenServices(StoreInterface *storage) {
334 return wifi_->LoadHiddenServices(storage);
335 }
336 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
337 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
338 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
339 flimflam::kTypeWifi,
340 kDeviceAddress,
341 hex_ssid.c_str(),
342 flimflam::kModeManaged,
343 flimflam::kSecurityNone));
344 const char *groups[] = { id->c_str() };
345 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
346 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
347 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
348 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
349 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
350 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
351 }
mukesh agrawal32399322011-09-01 10:53:43 -0700352 MockManager *manager() {
353 return &manager_;
354 }
355 const WiFiConstRefPtr wifi() const {
356 return wifi_;
357 }
358
359 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700360 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700361
362 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700363 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800364 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700365 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700366 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700367 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700368
369 // protected fields interspersed between private fields, due to
370 // initialization order
371 protected:
372 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700373 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700374 static const char kNetworkModeAdHoc[];
375 static const char kNetworkModeInfrastructure[];
376
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700377 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
378 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700379 MockDHCPProvider dhcp_provider_;
380 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700381
382 private:
383 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700384};
385
386const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800387const char WiFiMainTest::kDeviceAddress[] = "000102030405";
mukesh agrawal31950242011-07-14 11:53:38 -0700388const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
389const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
390
mukesh agrawal261daca2011-12-02 18:56:56 +0000391void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000392 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000393}
394
mukesh agrawal31950242011-07-14 11:53:38 -0700395void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
396 const string &ssid,
397 const string &bssid,
398 int16_t signal_strength,
399 const char *mode) {
400 map<string, ::DBus::Variant> bss_properties;
401
402 {
403 DBus::MessageIter writer(bss_properties["SSID"].writer());
404 writer << vector<uint8_t>(ssid.begin(), ssid.end());
405 }
406 {
407 string bssid_nosep;
408 vector<uint8_t> bssid_bytes;
409 RemoveChars(bssid, ":", &bssid_nosep);
410 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
411
412 DBus::MessageIter writer(bss_properties["BSSID"].writer());
413 writer << bssid_bytes;
414 }
415 bss_properties["Signal"].writer().append_int16(signal_strength);
416 bss_properties["Mode"].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000417 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700418}
419
420TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
421 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
422 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
423
424 StartWiFi();
425 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
426 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
427}
428
429TEST_F(WiFiMainTest, CleanStart) {
430 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
431 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
432 .Times(AnyNumber())
433 .WillRepeatedly(Throw(
434 DBus::Error(
435 "fi.w1.wpa_supplicant1.InterfaceUnknown",
436 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
437 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
438 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700439 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700440}
441
442TEST_F(WiFiMainTest, Restart) {
443 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
444 .Times(AnyNumber())
445 .WillRepeatedly(Throw(
446 DBus::Error(
447 "fi.w1.wpa_supplicant1.InterfaceExists",
448 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
449 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
450 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
451 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700452 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700453}
454
455TEST_F(WiFiMainTest, StartClearsState) {
456 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
457 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
458 StartWiFi();
459}
460
461TEST_F(WiFiMainTest, ScanResults) {
462 StartWiFi();
463 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
464 ReportBSS(
465 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
466 ReportBSS(
467 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
468 ReportBSS(
469 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
470 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
471 EXPECT_EQ(5, GetEndpointMap().size());
472}
473
474TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
475 StartWiFi();
476 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
477 ReportBSS(
478 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
479 ReportBSS(
480 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
481 ReportBSS(
482 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
483 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000484
485 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
486 EXPECT_EQ(3, endpoints_by_rpcid.size());
487
488 WiFi::EndpointMap::const_iterator i;
489 WiFiEndpointRefPtr endpoint;
490 for (i = endpoints_by_rpcid.begin();
491 i != endpoints_by_rpcid.end();
492 ++i) {
493 if (i->second->bssid_string() == "00:00:00:00:00:00")
494 break;
495 }
496 ASSERT_TRUE(i != endpoints_by_rpcid.end());
497 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700498}
499
500TEST_F(WiFiMainTest, ScanCompleted) {
501 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000502 EXPECT_CALL(*manager(), RegisterService(_))
503 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700504 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
505 ReportBSS(
506 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
507 ReportBSS(
508 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
509 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000510 EXPECT_EQ(3, GetServices().size());
511}
512
513TEST_F(WiFiMainTest, EndpointGroupingTogether) {
514 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000515
516 InSequence s;
517 EXPECT_CALL(*manager(), RegisterService(_));
518 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal165e6142011-11-22 02:22:56 +0000519 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
520 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
521 ReportScanDone();
522 EXPECT_EQ(1, GetServices().size());
523}
524
525TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
526 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000527 EXPECT_CALL(*manager(), RegisterService(_))
528 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000529 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
530 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
531 ReportScanDone();
532 EXPECT_EQ(2, GetServices().size());
533}
534
535TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
536 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000537 EXPECT_CALL(*manager(), RegisterService(_))
538 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000539 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
540 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
541 ReportScanDone();
542 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700543}
544
mukesh agrawal261daca2011-12-02 18:56:56 +0000545TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
546 // Removal of non-existent BSS should not cause a crash.
547 StartWiFi();
548 RemoveBSS("bss0");
549 EXPECT_EQ(0, GetServices().size());
550}
551
552TEST_F(WiFiMainTest, LoneBSSRemoved) {
553 StartWiFi();
554 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
555 ReportScanDone();
556 EXPECT_EQ(1, GetServices().size());
557 EXPECT_TRUE(GetServices().front()->IsVisible());
558
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000559 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000560 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000561 EXPECT_TRUE(GetServices().empty());
562}
563
564TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
565 StartWiFi();
566 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
567 ReportScanDone();
568 ReportCurrentBSSChanged("bss0");
569
570 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
571 EXPECT_CALL(*manager(), DeregisterService(_));
572 RemoveBSS("bss0");
573 EXPECT_TRUE(GetServices().empty());
574}
575
576TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
577 StartWiFi();
578
579 Error e;
580 WiFiServiceRefPtr service =
581 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
582 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000583 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000584
585 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
586 ReportScanDone();
587 ReportCurrentBSSChanged("bss");
588 EXPECT_EQ(1, GetServices().size());
589
590 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
591 EXPECT_CALL(*manager(), UpdateService(_));
592 RemoveBSS("bss");
593 EXPECT_TRUE(manager()->HasService(service));
594 EXPECT_EQ(1, GetServices().size());
595 // Verify expectations now, because WiFi may call UpdateService when
596 // WiFi is Stop()-ed (during TearDown()).
597 Mock::VerifyAndClearExpectations(manager());
mukesh agrawal261daca2011-12-02 18:56:56 +0000598}
599
600TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
601 StartWiFi();
602 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
603 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
604 ReportScanDone();
605 EXPECT_EQ(1, GetServices().size());
606 EXPECT_TRUE(GetServices().front()->IsVisible());
607
608 EXPECT_CALL(*manager(), UpdateService(_));
609 RemoveBSS("bss0");
610 EXPECT_TRUE(GetServices().front()->IsVisible());
611 EXPECT_EQ(1, GetServices().size());
612}
613
mukesh agrawal31950242011-07-14 11:53:38 -0700614TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700615 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
616 *supplicant_interface_proxy_;
617
mukesh agrawal31950242011-07-14 11:53:38 -0700618 StartWiFi();
619 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
620 ReportScanDone();
621
622 {
623 InSequence s;
624 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000625 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700626
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700627 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700628 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700629 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700630 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700631 EXPECT_EQ(static_cast<Service *>(service),
632 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700633 }
634}
635
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000636TEST_F(WiFiMainTest, DisconnectPendingService) {
637 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
638 *supplicant_interface_proxy_;
639
640 StartWiFi();
641 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
642 WiFiService *service(GetServices().begin()->get());
643 InitiateConnect(service);
644
645 EXPECT_FALSE(GetPendingService() == NULL);
646 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
647 InitiateDisconnect(service);
648
649 EXPECT_TRUE(GetPendingService() == NULL);
650}
651
652TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
653 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
654 *supplicant_interface_proxy_;
655
656 StartWiFi();
657 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
658 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
659 WiFiService *service0(GetServices()[0].get());
660 WiFiService *service1(GetServices()[1].get());
661
662 InitiateConnect(service0);
663 ReportCurrentBSSChanged("bss0");
664 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
665 InitiateConnect(service1);
666
667 EXPECT_EQ(service0, GetCurrentService());
668 EXPECT_EQ(service1, GetPendingService());
669 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
670 InitiateDisconnect(service1);
671
672 // |current_service_| will be unchanged until supplicant signals
673 // that CurrentBSS has changed.
674 EXPECT_EQ(service0, GetCurrentService());
675 // |pending_service_| is updated immediately.
676 EXPECT_TRUE(GetPendingService() == NULL);
677}
678
679TEST_F(WiFiMainTest, DisconnectCurrentService) {
680 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
681 *supplicant_interface_proxy_;
682
683 StartWiFi();
684 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
685 WiFiService *service(GetServices().begin()->get());
686 InitiateConnect(service);
687 ReportCurrentBSSChanged("bss0");
688 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
689
690 EXPECT_EQ(service, GetCurrentService());
691 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
692 InitiateDisconnect(service);
693
694 // |current_service_| should not change until supplicant reports
695 // a BSS change.
696 EXPECT_EQ(service, GetCurrentService());
697}
698
699TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
700 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
701 *supplicant_interface_proxy_;
702
703 StartWiFi();
704 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
705 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
706 WiFiService *service0(GetServices()[0].get());
707 WiFiService *service1(GetServices()[1].get());
708
709 InitiateConnect(service0);
710 ReportCurrentBSSChanged("bss0");
711 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
712 InitiateConnect(service1);
713
714 EXPECT_EQ(service0, GetCurrentService());
715 EXPECT_EQ(service1, GetPendingService());
716 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
717 .Times(0);
718 InitiateDisconnect(service0);
719
720 EXPECT_EQ(service0, GetCurrentService());
721 EXPECT_EQ(service1, GetPendingService());
722}
723
724TEST_F(WiFiMainTest, DisconnectInvalidService) {
725 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
726 *supplicant_interface_proxy_;
727
728 StartWiFi();
729 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
730 WiFiService *service(GetServices().begin()->get());
731 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
732 .Times(0);
733 InitiateDisconnect(service);
734}
735
736TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
737 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
738 *supplicant_interface_proxy_;
739
740 StartWiFi();
741 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
742
743 WiFiService *service(GetServices().begin()->get());
744 DBus::Path fake_path("/fake/path");
745 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
746 .WillOnce(Return(fake_path));
747 InitiateConnect(service);
748 ReportCurrentBSSChanged("bss0");
749 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
750
751 EXPECT_EQ(service, GetCurrentService());
752 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
753 .WillRepeatedly(Throw(
754 DBus::Error(
755 "fi.w1.wpa_supplicant1.NotConnected",
756 "test threw fi.w1.wpa_supplicant1.NotConnected")));
757 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
758 InitiateDisconnect(service);
759
760 EXPECT_TRUE(GetCurrentService() == NULL);
761}
762
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700763TEST_F(WiFiMainTest, LinkEvent) {
764 EXPECT_FALSE(IsLinkUp());
765 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
766 WillOnce(Return(dhcp_config_));
767 ReportLinkUp();
768}
769
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700770TEST_F(WiFiMainTest, Stop) {
771 {
772 InSequence s;
773
774 StartWiFi();
775 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
776 ReportScanDone();
777 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
778 WillOnce(Return(dhcp_config_));
779 ReportLinkUp();
780 }
781
782 {
783 EXPECT_CALL(*manager(), DeregisterService(_));
784 StopWiFi();
785 }
786}
787
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700788TEST_F(WiFiMainTest, GetWifiServiceOpen) {
789 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800790 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700791 EXPECT_TRUE(e.IsSuccess());
792}
793
794TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
795 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800796 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700797 EXPECT_EQ(Error::kInvalidArguments, e.type());
798 EXPECT_EQ("must specify service type", e.message());
799}
800
801TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
802 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800803 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700804 EXPECT_EQ(Error::kInvalidArguments, e.type());
805 EXPECT_EQ("must specify SSID", e.message());
806}
807
808TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
809 Error e;
810 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800811 flimflam::kTypeWifi, "123456789012345678901234567890123",
812 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700813 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
814 EXPECT_EQ("SSID is too long", e.message());
815}
816
817TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
818 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800819 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700820 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
821 EXPECT_EQ("SSID is too short", e.message());
822}
823
824TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
825 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800826 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700827 EXPECT_EQ(Error::kNotSupported, e.type());
828 EXPECT_EQ("service mode is unsupported", e.message());
829}
830
831TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
832 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800833 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700834 EXPECT_TRUE(e.IsSuccess());
835}
836
837TEST_F(WiFiMainTest, GetWifiServiceRSN) {
838 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800839 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
840 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700841 EXPECT_TRUE(e.IsSuccess());
842}
843
844TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
845 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800846 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
847 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700848 EXPECT_EQ(Error::kInvalidArguments, e.type());
849 EXPECT_EQ("must specify passphrase", e.message());
850}
851
852TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
853 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800854 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
855 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700856 EXPECT_EQ(Error::kNotSupported, e.type());
857 EXPECT_EQ("security mode is unsupported", e.message());
858}
859
860TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
861 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800862 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
863 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700864 EXPECT_EQ(Error::kInvalidArguments, e.type());
865 EXPECT_EQ("must specify passphrase", e.message());
866}
867
868TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
869 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800870 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
871 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700872 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
873}
874
875TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
876 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800877 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
878 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700879 EXPECT_TRUE(e.IsSuccess());
880}
881
882TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
883 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800884 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
885 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700886 EXPECT_TRUE(e.IsSuccess());
887}
888
889TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
890 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800891 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
892 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700893 EXPECT_TRUE(e.IsSuccess());
894}
895
896TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
897 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800898 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
899 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700900 EXPECT_TRUE(e.IsSuccess());
901}
902
903TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
904 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800905 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
906 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700907 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
908}
909
910TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
911 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800912 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
913 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700914 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
915}
916
917TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
918 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800919 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
920 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700921 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
922}
923
924TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
925 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800926 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
927 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700928 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
929}
930
931TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
932 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800933 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
934 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700935 EXPECT_TRUE(e.IsSuccess());
936}
937
938TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
939 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800940 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
941 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700942 EXPECT_TRUE(e.IsSuccess());
943}
944
945TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
946 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800947 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
948 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700949 EXPECT_TRUE(e.IsSuccess());
950}
951
952TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
953 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800954 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
955 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700956 EXPECT_TRUE(e.IsSuccess());
957}
958
mukesh agrawal8ede0522011-10-03 14:57:44 -0700959class WiFiGetServiceSuccessTest : public WiFiMainTest {};
960class WiFiGetServiceFailureTest : public WiFiMainTest {};
961
962TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
963 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800964 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
965 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700966 EXPECT_TRUE(e.IsSuccess());
967}
968
969TEST_P(WiFiGetServiceFailureTest, Passphrase) {
970 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800971 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
972 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700973 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
974}
975
976INSTANTIATE_TEST_CASE_P(
977 WiFiGetServiceSuccessTestInstance,
978 WiFiGetServiceSuccessTest,
979 Values(
980 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
981 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
982 // subtle: invalid length for hex key, but valid as ascii passphrase
983 string(IEEE_80211::kWPAHexLen-1, '1'),
984 string(IEEE_80211::kWPAHexLen, '1')));
985
986INSTANTIATE_TEST_CASE_P(
987 WiFiGetServiceFailureTestInstance,
988 WiFiGetServiceFailureTest,
989 Values(
990 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
991 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
992 string(IEEE_80211::kWPAHexLen+1, '1')));
993
Paul Stewart6ab23a92011-11-09 17:17:47 -0800994TEST_F(WiFiMainTest, FindServiceWEP) {
995 const string ssid("an_ssid");
996 {
997 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800998 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800999 flimflam::kSecurityWep, "abcde", &e);
1000 EXPECT_TRUE(e.IsSuccess());
1001 }
1002 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1003
Paul Stewarta41e38d2011-11-11 07:47:29 -08001004 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1005 flimflam::kSecurityWep).get());
1006 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1007 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001008}
1009
1010TEST_F(WiFiMainTest, FindServiceWPA) {
1011 const string ssid("an_ssid");
1012 {
1013 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001014 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001015 flimflam::kSecurityRsn, "abcdefgh", &e);
1016 EXPECT_TRUE(e.IsSuccess());
1017 }
1018 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001019 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1020 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001021 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001022 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1023 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001024 EXPECT_TRUE(rsn_service.get());
1025 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001026 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1027 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001028 EXPECT_EQ(wpa_service.get(), psk_service.get());
1029 // Indirectly test FindService by doing a GetService on something that
1030 // already exists.
1031 {
1032 Error e;
1033 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001034 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1035 flimflam::kModeManaged, flimflam::kSecurityWpa,
1036 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001037 EXPECT_TRUE(e.IsSuccess());
1038 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1039 }
1040}
1041
Paul Stewartced6a0b2011-11-08 15:32:04 -08001042MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001043 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001044 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1045 if (it == arg.end()) {
1046 return false;
1047 }
1048
1049 const DBus::Variant &ssids_variant = it->second;
1050 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1051 const ByteArrays &ssids = it->second.operator ByteArrays();
1052 // A valid Scan containing a single hidden SSID should contain
1053 // two SSID entries: one containing the SSID we are looking for,
1054 // and an empty entry, signifying that we also want to do a
1055 // broadcast probe request for all non-hidden APs as well.
1056 return ssids.size() == 2 &&
1057 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1058 ssids[1].empty();
1059}
1060
1061TEST_F(WiFiMainTest, ScanHidden) {
1062 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1063 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1064 .Times(AnyNumber())
1065 .WillRepeatedly(Throw(
1066 DBus::Error(
1067 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1068 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001069 {
1070 // Create a hidden, favorite service.
1071 Error e;
1072 WiFiServiceRefPtr service =
1073 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1074 NULL, NULL, true, &e);
1075 EXPECT_TRUE(e.IsSuccess());
1076 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001077 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001078 }
1079 {
1080 // Create a hidden, non-favorite service.
1081 Error e;
1082 WiFiServiceRefPtr service =
1083 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1084 NULL, NULL, true, &e);
1085 EXPECT_TRUE(e.IsSuccess());
1086 EXPECT_TRUE(service->hidden_ssid());
1087 }
1088 {
1089 // Create a non-hidden, favorite service.
1090 Error e;
1091 WiFiServiceRefPtr service =
1092 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1093 NULL, NULL, false, &e);
1094 EXPECT_TRUE(e.IsSuccess());
1095 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001096 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001097 }
1098 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001099 StartWiFi();
1100 dispatcher_.DispatchPendingEvents();
1101}
1102
mukesh agrawal7ec71312011-11-10 02:08:26 +00001103TEST_F(WiFiMainTest, InitialSupplicantState) {
1104 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1105}
1106
1107TEST_F(WiFiMainTest, StateChangeNoService) {
1108 // State change should succeed even if there is no pending Service.
1109 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1110 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1111}
1112
1113TEST_F(WiFiMainTest, StateChangeWithService) {
1114 // Forward transition should trigger a Service state change.
1115 StartWiFi();
1116 dispatcher_.DispatchPendingEvents();
1117 MockWiFiServiceRefPtr service = MakeMockService();
1118 InitiateConnect(service);
1119 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1120 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1121 // Verify expectations now, because WiFi may report other state changes
1122 // when WiFi is Stop()-ed (during TearDown()).
1123 Mock::VerifyAndClearExpectations(service.get());
1124}
1125
1126TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1127 // Some backwards transitions should not trigger a Service state change.
1128 // Supplicant state should still be updated, however.
1129 StartWiFi();
1130 dispatcher_.DispatchPendingEvents();
1131 MockWiFiServiceRefPtr service = MakeMockService();
1132 InitiateConnect(service);
1133 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1134 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1135 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1136 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1137 GetSupplicantState());
1138 // Verify expectations now, because WiFi may report other state changes
1139 // when WiFi is Stop()-ed (during TearDown()).
1140 Mock::VerifyAndClearExpectations(service.get());
1141}
1142
Paul Stewarta41e38d2011-11-11 07:47:29 -08001143TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1144 StrictMock<MockStore> storage;
1145 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1146 .WillOnce(Return(set<string>()));
1147 EXPECT_FALSE(LoadHiddenServices(&storage));
1148}
1149
1150TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1151 string id;
1152 StrictMock<MockStore> storage;
1153 SetupHiddenStorage(&storage, "an_ssid", &id);
1154 // Missing "Hidden" property.
1155 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1156 .WillOnce(Return(false));
1157 EXPECT_FALSE(LoadHiddenServices(&storage));
1158}
1159
1160TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1161 string id;
1162 StrictMock<MockStore> storage;
1163 SetupHiddenStorage(&storage, "an_ssid", &id);
1164 // "Hidden" property set to "false".
1165 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1166 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1167 EXPECT_FALSE(LoadHiddenServices(&storage));
1168}
1169
1170TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1171 string id;
1172 StrictMock<MockStore> storage;
1173 SetupHiddenStorage(&storage, "an_ssid", &id);
1174 // Missing "SSID" property.
1175 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1176 .WillOnce(Return(false));
1177 EXPECT_FALSE(LoadHiddenServices(&storage));
1178}
1179
1180
1181TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1182 StrictMock<MockStore> storage;
1183 string id;
1184 SetupHiddenStorage(&storage, "an_ssid", &id);
1185 Error e;
1186 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1187 ASSERT_TRUE(e.IsSuccess());
1188 EXPECT_FALSE(LoadHiddenServices(&storage));
1189}
1190
1191TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1192 StrictMock<MockStore> storage;
1193 string ssid("an_ssid");
1194 string id;
1195 SetupHiddenStorage(&storage, ssid, &id);
1196 EXPECT_TRUE(LoadHiddenServices(&storage));
1197 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1198 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1199 flimflam::kSecurityNone).get());
1200}
1201
mukesh agrawal15908392011-11-16 18:29:25 +00001202TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1203 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1204 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1205
1206 // Note that the BSS handle used in this test ("an_ap") is not
1207 // intended to reflect the format used by supplicant. It's just
1208 // convenient for testing.
1209
1210 StartWiFi();
1211 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1212 kNetworkModeInfrastructure);
1213 InitiateConnect(service);
1214 EXPECT_EQ(service, GetPendingService().get());
1215
1216 ReportCurrentBSSChanged("an_ap");
1217 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1218 EXPECT_EQ(Service::kStateConfiguring, service->state());
1219 EXPECT_EQ(service, GetCurrentService().get());
1220 EXPECT_EQ(NULL, GetPendingService().get());
1221
1222 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001223 EXPECT_EQ(Service::kStateFailure, service->state());
mukesh agrawal15908392011-11-16 18:29:25 +00001224 EXPECT_EQ(NULL, GetCurrentService().get());
1225 EXPECT_EQ(NULL, GetPendingService().get());
1226}
1227
1228TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1229 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1230 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1231 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1232 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1233
1234 // Note that the BSS handles used in this test ("ap1", "ap2") are
1235 // not intended to reflect the format used by supplicant. They're
1236 // just convenient for testing.
1237
1238 StartWiFi();
1239 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1240 kNetworkModeInfrastructure);
1241 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1242 kNetworkModeInfrastructure);
1243 InitiateConnect(service1);
1244 ReportCurrentBSSChanged("ap1");
1245 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1246 EXPECT_EQ(service1.get(), GetCurrentService().get());
1247
1248 ReportCurrentBSSChanged("ap2");
1249 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1250 EXPECT_EQ(service2.get(), GetCurrentService().get());
1251 EXPECT_EQ(Service::kStateIdle, service1->state());
1252 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1253}
1254
1255TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1256 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1257 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1258
1259 // Note that the BSS handle used in this test ("an_ap") is not
1260 // intended to reflect the format used by supplicant. It's just
1261 // convenient for testing.
1262
1263 StartWiFi();
1264 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1265 kNetworkModeInfrastructure);
1266 InitiateConnect(service);
1267 ReportCurrentBSSChanged("an_ap");
1268 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1269 EXPECT_EQ(service.get(), GetCurrentService().get());
1270 EXPECT_EQ(Service::kStateConfiguring, service->state());
1271}
1272
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001273TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1274 Error e;
1275 EXPECT_CALL(*manager(), RegisterService(_))
1276 .Times(0);
1277 EXPECT_CALL(*manager(), HasService(_))
1278 .WillOnce(Return(false));
1279 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1280 EXPECT_CALL(*manager(), RegisterService(_));
1281 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0,
1282 kNetworkModeInfrastructure);
1283}
1284
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001285TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1286 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1287 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1288 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1289 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1290
1291 StartWiFi();
1292 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1293 kNetworkModeInfrastructure);
1294 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1295 kNetworkModeInfrastructure);
1296 InitiateConnect(service1);
1297 EXPECT_EQ(service1.get(), GetPendingService().get());
1298
1299 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1300 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1301 InitiateConnect(service2);
1302 EXPECT_EQ(service2.get(), GetPendingService().get());
1303}
1304
1305TEST_F(WiFiMainTest, IsIdle) {
1306 StartWiFi();
1307 EXPECT_TRUE(wifi()->IsIdle());
1308
1309 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1310 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1311 Error error;
1312 service->AddEndpoint(ap);
1313 service->AutoConnect();
1314 EXPECT_FALSE(wifi()->IsIdle());
1315}
1316
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001317MATCHER(WiFiAddedArgs, "") {
1318 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1319 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1320}
1321
1322TEST_F(WiFiMainTest, AddNetworkArgs) {
1323 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1324 *supplicant_interface_proxy_;
1325
1326 StartWiFi();
1327 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
1328 WiFiService *service(GetServices().begin()->get());
1329 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1330 InitiateConnect(service);
1331}
1332
Chris Masone853b81b2011-06-24 14:11:41 -07001333} // namespace shill