blob: 6a46ab0ff836269ab3ae13086bff31ba9418c6b6 [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,
Paul Stewartd32f4842012-01-11 16:08:13 -0800154 kHostName,
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700155 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700156 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700157 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000158 // Except for WiFiServices created via WiFi::GetService, we expect
159 // that any WiFiService has been registered with the Manager. So
160 // default Manager.HasService to true, to make the common case
161 // easy.
162 ON_CALL(manager_, HasService(_)).
163 WillByDefault(Return(true));
mukesh agrawal31950242011-07-14 11:53:38 -0700164 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700165
166 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700167 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700168 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
169 wifi_->set_dhcp_provider(&dhcp_provider_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700170 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700171 }
172
173 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700174 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700175 // must Stop WiFi instance, to clear its list of services.
176 // otherwise, the WiFi instance will not be deleted. (because
177 // services reference a WiFi instance, creating a cycle.)
178 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700179 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700180 }
181
mukesh agrawal31950242011-07-14 11:53:38 -0700182 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000183 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
184
mukesh agrawal31950242011-07-14 11:53:38 -0700185 class TestProxyFactory : public ProxyFactory {
186 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700187 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700188
189 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700190 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700191 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700192 }
193
194 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700195 const WiFiRefPtr &/*wifi*/,
196 const DBus::Path &/*object_path*/,
197 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700198 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700199 }
200
201 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700202 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700203 };
204
mukesh agrawal15908392011-11-16 18:29:25 +0000205 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
206 bool hidden_ssid = false;
207 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
208 }
209 const WiFiServiceRefPtr &GetCurrentService() {
210 return wifi_->current_service_;
211 }
mukesh agrawal31950242011-07-14 11:53:38 -0700212 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000213 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700214 }
mukesh agrawal15908392011-11-16 18:29:25 +0000215 const WiFiServiceRefPtr &GetPendingService() {
216 return wifi_->pending_service_;
217 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000218 const vector<WiFiServiceRefPtr> &GetServices() {
219 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700220 }
221 // note: the tests need the proxies referenced by WiFi (not the
222 // proxies instantiated by WiFiMainTest), to ensure that WiFi
223 // sets up its proxies correctly.
224 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
225 return wifi_->supplicant_process_proxy_.get();
226 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000227 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
228 return dynamic_cast<MockSupplicantInterfaceProxy *>(
229 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700230 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000231 const string &GetSupplicantState() {
232 return wifi_->supplicant_state_;
233 }
234 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700235 map<string, ::DBus::Variant> params;
236 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700237 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000238 void InitiateDisconnect(WiFiServiceRefPtr service) {
239 wifi_->DisconnectFrom(service);
240 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700241 bool IsLinkUp() {
242 return wifi_->link_up_;
243 }
mukesh agrawal15908392011-11-16 18:29:25 +0000244 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000245 return WiFiEndpoint::MakeOpenEndpoint(ssid, bssid);
mukesh agrawal15908392011-11-16 18:29:25 +0000246 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000247 MockWiFiServiceRefPtr MakeMockService() {
248 vector<uint8_t> ssid(1, 'a');
249 return new MockWiFiService(
250 &control_interface_,
251 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800252 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000253 &manager_,
254 wifi_,
255 ssid,
256 flimflam::kModeManaged,
257 flimflam::kSecurityNone,
258 false);
259 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000260 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700261 void ReportBSS(const ::DBus::Path &bss_path,
262 const string &ssid,
263 const string &bssid,
264 int16_t signal_strength,
265 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700266 void ReportLinkUp() {
267 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
268 }
mukesh agrawal31950242011-07-14 11:53:38 -0700269 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700270 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700271 }
mukesh agrawal15908392011-11-16 18:29:25 +0000272 void ReportCurrentBSSChanged(const string &new_bss) {
273 wifi_->CurrentBSSChanged(new_bss);
274 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000275 void ReportStateChanged(const string &new_state) {
276 wifi_->StateChanged(new_state);
277 }
mukesh agrawal31950242011-07-14 11:53:38 -0700278 void StartWiFi() {
279 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700280 }
281 void StopWiFi() {
282 wifi_->Stop();
283 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800284 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700285 const char *ssid,
286 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800287 Error *result) {
288 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700289 }
290 void GetService(const char *service_type,
291 const char *ssid,
292 const char *mode,
293 const char *security,
294 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800295 Error *result) {
296 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
297 result);
298 }
299 WiFiServiceRefPtr GetServiceInner(const char *service_type,
300 const char *ssid,
301 const char *mode,
302 const char *security,
303 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800304 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800305 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700306 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700307 // in general, we want to avoid D-Bus specific code for any RPCs
308 // that come in via adaptors. we make an exception here, because
309 // calls to GetWifiService are rerouted from the Manager object to
310 // the Wifi class.
311 if (service_type != NULL)
312 args[flimflam::kTypeProperty].writer().append_string(service_type);
313 if (ssid != NULL)
314 args[flimflam::kSSIDProperty].writer().append_string(ssid);
315 if (mode != NULL)
316 args[flimflam::kModeProperty].writer().append_string(mode);
317 if (security != NULL)
318 args[flimflam::kSecurityProperty].writer().append_string(security);
319 if (passphrase != NULL)
320 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800321 if (!allow_hidden)
322 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700323
Paul Stewartced6a0b2011-11-08 15:32:04 -0800324 Error e;
325 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700326 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800327 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700328 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800329 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
330 const string &mode,
331 const string &security) {
332 return wifi_->FindService(ssid, mode, security);
333 }
334 bool LoadHiddenServices(StoreInterface *storage) {
335 return wifi_->LoadHiddenServices(storage);
336 }
337 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
338 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
339 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
340 flimflam::kTypeWifi,
341 kDeviceAddress,
342 hex_ssid.c_str(),
343 flimflam::kModeManaged,
344 flimflam::kSecurityNone));
345 const char *groups[] = { id->c_str() };
346 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
347 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
348 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
349 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
350 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
351 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
352 }
mukesh agrawal32399322011-09-01 10:53:43 -0700353 MockManager *manager() {
354 return &manager_;
355 }
356 const WiFiConstRefPtr wifi() const {
357 return wifi_;
358 }
359
360 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700361 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700362
363 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700364 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800365 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700366 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700367 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700368 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700369
370 // protected fields interspersed between private fields, due to
371 // initialization order
372 protected:
373 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700374 static const char kDeviceAddress[];
Paul Stewartd32f4842012-01-11 16:08:13 -0800375 static const char kHostName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700376 static const char kNetworkModeAdHoc[];
377 static const char kNetworkModeInfrastructure[];
378
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700379 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
380 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700381 MockDHCPProvider dhcp_provider_;
382 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700383
384 private:
385 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700386};
387
388const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800389const char WiFiMainTest::kDeviceAddress[] = "000102030405";
Paul Stewartd32f4842012-01-11 16:08:13 -0800390const char WiFiMainTest::kHostName[] = "hostname";
mukesh agrawal31950242011-07-14 11:53:38 -0700391const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
392const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
393
mukesh agrawal261daca2011-12-02 18:56:56 +0000394void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000395 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000396}
397
mukesh agrawal31950242011-07-14 11:53:38 -0700398void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
399 const string &ssid,
400 const string &bssid,
401 int16_t signal_strength,
402 const char *mode) {
403 map<string, ::DBus::Variant> bss_properties;
404
405 {
406 DBus::MessageIter writer(bss_properties["SSID"].writer());
407 writer << vector<uint8_t>(ssid.begin(), ssid.end());
408 }
409 {
410 string bssid_nosep;
411 vector<uint8_t> bssid_bytes;
412 RemoveChars(bssid, ":", &bssid_nosep);
413 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
414
415 DBus::MessageIter writer(bss_properties["BSSID"].writer());
416 writer << bssid_bytes;
417 }
418 bss_properties["Signal"].writer().append_int16(signal_strength);
419 bss_properties["Mode"].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000420 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700421}
422
423TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
424 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
425 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
426
427 StartWiFi();
428 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
429 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
430}
431
432TEST_F(WiFiMainTest, CleanStart) {
433 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
434 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
435 .Times(AnyNumber())
436 .WillRepeatedly(Throw(
437 DBus::Error(
438 "fi.w1.wpa_supplicant1.InterfaceUnknown",
439 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
440 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
441 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700442 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700443}
444
445TEST_F(WiFiMainTest, Restart) {
446 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
447 .Times(AnyNumber())
448 .WillRepeatedly(Throw(
449 DBus::Error(
450 "fi.w1.wpa_supplicant1.InterfaceExists",
451 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
452 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
453 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
454 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700455 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700456}
457
458TEST_F(WiFiMainTest, StartClearsState) {
459 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
460 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
461 StartWiFi();
462}
463
464TEST_F(WiFiMainTest, ScanResults) {
465 StartWiFi();
466 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
467 ReportBSS(
468 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
469 ReportBSS(
470 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
471 ReportBSS(
472 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
473 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
474 EXPECT_EQ(5, GetEndpointMap().size());
475}
476
477TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
478 StartWiFi();
479 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
480 ReportBSS(
481 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
482 ReportBSS(
483 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
484 ReportBSS(
485 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
486 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000487
488 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
489 EXPECT_EQ(3, endpoints_by_rpcid.size());
490
491 WiFi::EndpointMap::const_iterator i;
492 WiFiEndpointRefPtr endpoint;
493 for (i = endpoints_by_rpcid.begin();
494 i != endpoints_by_rpcid.end();
495 ++i) {
496 if (i->second->bssid_string() == "00:00:00:00:00:00")
497 break;
498 }
499 ASSERT_TRUE(i != endpoints_by_rpcid.end());
500 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700501}
502
503TEST_F(WiFiMainTest, ScanCompleted) {
504 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000505 EXPECT_CALL(*manager(), RegisterService(_))
506 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700507 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
508 ReportBSS(
509 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
510 ReportBSS(
511 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
512 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000513 EXPECT_EQ(3, GetServices().size());
514}
515
516TEST_F(WiFiMainTest, EndpointGroupingTogether) {
517 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000518
519 InSequence s;
520 EXPECT_CALL(*manager(), RegisterService(_));
521 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal165e6142011-11-22 02:22:56 +0000522 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
523 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
524 ReportScanDone();
525 EXPECT_EQ(1, GetServices().size());
526}
527
528TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
529 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000530 EXPECT_CALL(*manager(), RegisterService(_))
531 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000532 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
533 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
534 ReportScanDone();
535 EXPECT_EQ(2, GetServices().size());
536}
537
538TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
539 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000540 EXPECT_CALL(*manager(), RegisterService(_))
541 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000542 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
543 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
544 ReportScanDone();
545 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700546}
547
mukesh agrawal261daca2011-12-02 18:56:56 +0000548TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
549 // Removal of non-existent BSS should not cause a crash.
550 StartWiFi();
551 RemoveBSS("bss0");
552 EXPECT_EQ(0, GetServices().size());
553}
554
555TEST_F(WiFiMainTest, LoneBSSRemoved) {
556 StartWiFi();
557 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
558 ReportScanDone();
559 EXPECT_EQ(1, GetServices().size());
560 EXPECT_TRUE(GetServices().front()->IsVisible());
561
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000562 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000563 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000564 EXPECT_TRUE(GetServices().empty());
565}
566
567TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
568 StartWiFi();
569 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
570 ReportScanDone();
571 ReportCurrentBSSChanged("bss0");
572
573 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
574 EXPECT_CALL(*manager(), DeregisterService(_));
575 RemoveBSS("bss0");
576 EXPECT_TRUE(GetServices().empty());
577}
578
579TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
580 StartWiFi();
581
582 Error e;
583 WiFiServiceRefPtr service =
584 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
585 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000586 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000587
588 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
589 ReportScanDone();
590 ReportCurrentBSSChanged("bss");
591 EXPECT_EQ(1, GetServices().size());
592
593 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
594 EXPECT_CALL(*manager(), UpdateService(_));
595 RemoveBSS("bss");
596 EXPECT_TRUE(manager()->HasService(service));
597 EXPECT_EQ(1, GetServices().size());
598 // Verify expectations now, because WiFi may call UpdateService when
599 // WiFi is Stop()-ed (during TearDown()).
600 Mock::VerifyAndClearExpectations(manager());
mukesh agrawal261daca2011-12-02 18:56:56 +0000601}
602
603TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
604 StartWiFi();
605 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
606 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
607 ReportScanDone();
608 EXPECT_EQ(1, GetServices().size());
609 EXPECT_TRUE(GetServices().front()->IsVisible());
610
611 EXPECT_CALL(*manager(), UpdateService(_));
612 RemoveBSS("bss0");
613 EXPECT_TRUE(GetServices().front()->IsVisible());
614 EXPECT_EQ(1, GetServices().size());
615}
616
mukesh agrawal31950242011-07-14 11:53:38 -0700617TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700618 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
619 *supplicant_interface_proxy_;
620
mukesh agrawal31950242011-07-14 11:53:38 -0700621 StartWiFi();
622 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
623 ReportScanDone();
624
625 {
626 InSequence s;
627 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000628 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700629
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700630 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700631 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700632 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700633 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700634 EXPECT_EQ(static_cast<Service *>(service),
635 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700636 }
637}
638
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000639TEST_F(WiFiMainTest, DisconnectPendingService) {
640 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
641 *supplicant_interface_proxy_;
642
643 StartWiFi();
644 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
645 WiFiService *service(GetServices().begin()->get());
646 InitiateConnect(service);
647
648 EXPECT_FALSE(GetPendingService() == NULL);
649 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
650 InitiateDisconnect(service);
651
652 EXPECT_TRUE(GetPendingService() == NULL);
653}
654
655TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
656 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
657 *supplicant_interface_proxy_;
658
659 StartWiFi();
660 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
661 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
662 WiFiService *service0(GetServices()[0].get());
663 WiFiService *service1(GetServices()[1].get());
664
665 InitiateConnect(service0);
666 ReportCurrentBSSChanged("bss0");
667 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
668 InitiateConnect(service1);
669
670 EXPECT_EQ(service0, GetCurrentService());
671 EXPECT_EQ(service1, GetPendingService());
672 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
673 InitiateDisconnect(service1);
674
675 // |current_service_| will be unchanged until supplicant signals
676 // that CurrentBSS has changed.
677 EXPECT_EQ(service0, GetCurrentService());
678 // |pending_service_| is updated immediately.
679 EXPECT_TRUE(GetPendingService() == NULL);
680}
681
682TEST_F(WiFiMainTest, DisconnectCurrentService) {
683 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
684 *supplicant_interface_proxy_;
685
686 StartWiFi();
687 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
688 WiFiService *service(GetServices().begin()->get());
689 InitiateConnect(service);
690 ReportCurrentBSSChanged("bss0");
691 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
692
693 EXPECT_EQ(service, GetCurrentService());
694 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
695 InitiateDisconnect(service);
696
697 // |current_service_| should not change until supplicant reports
698 // a BSS change.
699 EXPECT_EQ(service, GetCurrentService());
700}
701
702TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
703 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
704 *supplicant_interface_proxy_;
705
706 StartWiFi();
707 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
708 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
709 WiFiService *service0(GetServices()[0].get());
710 WiFiService *service1(GetServices()[1].get());
711
712 InitiateConnect(service0);
713 ReportCurrentBSSChanged("bss0");
714 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
715 InitiateConnect(service1);
716
717 EXPECT_EQ(service0, GetCurrentService());
718 EXPECT_EQ(service1, GetPendingService());
719 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
720 .Times(0);
721 InitiateDisconnect(service0);
722
723 EXPECT_EQ(service0, GetCurrentService());
724 EXPECT_EQ(service1, GetPendingService());
725}
726
727TEST_F(WiFiMainTest, DisconnectInvalidService) {
728 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
729 *supplicant_interface_proxy_;
730
731 StartWiFi();
732 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
733 WiFiService *service(GetServices().begin()->get());
734 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
735 .Times(0);
736 InitiateDisconnect(service);
737}
738
739TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
740 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
741 *supplicant_interface_proxy_;
742
743 StartWiFi();
744 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
745
746 WiFiService *service(GetServices().begin()->get());
747 DBus::Path fake_path("/fake/path");
748 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
749 .WillOnce(Return(fake_path));
750 InitiateConnect(service);
751 ReportCurrentBSSChanged("bss0");
752 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
753
754 EXPECT_EQ(service, GetCurrentService());
755 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
756 .WillRepeatedly(Throw(
757 DBus::Error(
758 "fi.w1.wpa_supplicant1.NotConnected",
759 "test threw fi.w1.wpa_supplicant1.NotConnected")));
760 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
761 InitiateDisconnect(service);
762
763 EXPECT_TRUE(GetCurrentService() == NULL);
764}
765
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700766TEST_F(WiFiMainTest, LinkEvent) {
767 EXPECT_FALSE(IsLinkUp());
Paul Stewartd32f4842012-01-11 16:08:13 -0800768 EXPECT_CALL(dhcp_provider_, CreateConfig(_, _)).
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700769 WillOnce(Return(dhcp_config_));
770 ReportLinkUp();
771}
772
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700773TEST_F(WiFiMainTest, Stop) {
774 {
775 InSequence s;
776
777 StartWiFi();
778 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
779 ReportScanDone();
Paul Stewartd32f4842012-01-11 16:08:13 -0800780 EXPECT_CALL(dhcp_provider_, CreateConfig(_, _)).
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700781 WillOnce(Return(dhcp_config_));
782 ReportLinkUp();
783 }
784
785 {
786 EXPECT_CALL(*manager(), DeregisterService(_));
787 StopWiFi();
788 }
789}
790
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700791TEST_F(WiFiMainTest, GetWifiServiceOpen) {
792 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800793 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700794 EXPECT_TRUE(e.IsSuccess());
795}
796
797TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
798 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800799 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700800 EXPECT_EQ(Error::kInvalidArguments, e.type());
801 EXPECT_EQ("must specify service type", e.message());
802}
803
804TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
805 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800806 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700807 EXPECT_EQ(Error::kInvalidArguments, e.type());
808 EXPECT_EQ("must specify SSID", e.message());
809}
810
811TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
812 Error e;
813 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800814 flimflam::kTypeWifi, "123456789012345678901234567890123",
815 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700816 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
817 EXPECT_EQ("SSID is too long", e.message());
818}
819
820TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
821 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800822 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700823 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
824 EXPECT_EQ("SSID is too short", e.message());
825}
826
827TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
828 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800829 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700830 EXPECT_EQ(Error::kNotSupported, e.type());
831 EXPECT_EQ("service mode is unsupported", e.message());
832}
833
834TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
835 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800836 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700837 EXPECT_TRUE(e.IsSuccess());
838}
839
840TEST_F(WiFiMainTest, GetWifiServiceRSN) {
841 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800842 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
843 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700844 EXPECT_TRUE(e.IsSuccess());
845}
846
847TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
848 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800849 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
850 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700851 EXPECT_EQ(Error::kInvalidArguments, e.type());
852 EXPECT_EQ("must specify passphrase", e.message());
853}
854
855TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
856 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800857 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
858 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700859 EXPECT_EQ(Error::kNotSupported, e.type());
860 EXPECT_EQ("security mode is unsupported", e.message());
861}
862
863TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
864 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800865 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
866 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700867 EXPECT_EQ(Error::kInvalidArguments, e.type());
868 EXPECT_EQ("must specify passphrase", e.message());
869}
870
871TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
872 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800873 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
874 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700875 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
876}
877
878TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
879 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800880 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
881 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700882 EXPECT_TRUE(e.IsSuccess());
883}
884
885TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
886 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800887 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
888 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700889 EXPECT_TRUE(e.IsSuccess());
890}
891
892TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
893 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800894 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
895 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700896 EXPECT_TRUE(e.IsSuccess());
897}
898
899TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
900 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800901 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
902 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700903 EXPECT_TRUE(e.IsSuccess());
904}
905
906TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
907 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800908 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
909 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700910 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
911}
912
913TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
914 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800915 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
916 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700917 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
918}
919
920TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
921 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800922 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
923 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700924 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
925}
926
927TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
928 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800929 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
930 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700931 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
932}
933
934TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
935 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800936 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
937 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700938 EXPECT_TRUE(e.IsSuccess());
939}
940
941TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
942 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800943 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
944 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700945 EXPECT_TRUE(e.IsSuccess());
946}
947
948TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
949 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800950 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
951 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700952 EXPECT_TRUE(e.IsSuccess());
953}
954
955TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
956 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800957 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
958 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700959 EXPECT_TRUE(e.IsSuccess());
960}
961
mukesh agrawal8ede0522011-10-03 14:57:44 -0700962class WiFiGetServiceSuccessTest : public WiFiMainTest {};
963class WiFiGetServiceFailureTest : public WiFiMainTest {};
964
965TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
966 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800967 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
968 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700969 EXPECT_TRUE(e.IsSuccess());
970}
971
972TEST_P(WiFiGetServiceFailureTest, Passphrase) {
973 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800974 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
975 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700976 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
977}
978
979INSTANTIATE_TEST_CASE_P(
980 WiFiGetServiceSuccessTestInstance,
981 WiFiGetServiceSuccessTest,
982 Values(
983 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
984 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
985 // subtle: invalid length for hex key, but valid as ascii passphrase
986 string(IEEE_80211::kWPAHexLen-1, '1'),
987 string(IEEE_80211::kWPAHexLen, '1')));
988
989INSTANTIATE_TEST_CASE_P(
990 WiFiGetServiceFailureTestInstance,
991 WiFiGetServiceFailureTest,
992 Values(
993 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
994 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
995 string(IEEE_80211::kWPAHexLen+1, '1')));
996
Paul Stewart6ab23a92011-11-09 17:17:47 -0800997TEST_F(WiFiMainTest, FindServiceWEP) {
998 const string ssid("an_ssid");
999 {
1000 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001001 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001002 flimflam::kSecurityWep, "abcde", &e);
1003 EXPECT_TRUE(e.IsSuccess());
1004 }
1005 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1006
Paul Stewarta41e38d2011-11-11 07:47:29 -08001007 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1008 flimflam::kSecurityWep).get());
1009 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1010 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001011}
1012
1013TEST_F(WiFiMainTest, FindServiceWPA) {
1014 const string ssid("an_ssid");
1015 {
1016 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001017 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001018 flimflam::kSecurityRsn, "abcdefgh", &e);
1019 EXPECT_TRUE(e.IsSuccess());
1020 }
1021 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001022 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1023 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001024 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001025 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1026 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001027 EXPECT_TRUE(rsn_service.get());
1028 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001029 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1030 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001031 EXPECT_EQ(wpa_service.get(), psk_service.get());
1032 // Indirectly test FindService by doing a GetService on something that
1033 // already exists.
1034 {
1035 Error e;
1036 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001037 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1038 flimflam::kModeManaged, flimflam::kSecurityWpa,
1039 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001040 EXPECT_TRUE(e.IsSuccess());
1041 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1042 }
1043}
1044
Paul Stewartced6a0b2011-11-08 15:32:04 -08001045MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001046 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001047 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1048 if (it == arg.end()) {
1049 return false;
1050 }
1051
1052 const DBus::Variant &ssids_variant = it->second;
1053 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1054 const ByteArrays &ssids = it->second.operator ByteArrays();
1055 // A valid Scan containing a single hidden SSID should contain
1056 // two SSID entries: one containing the SSID we are looking for,
1057 // and an empty entry, signifying that we also want to do a
1058 // broadcast probe request for all non-hidden APs as well.
1059 return ssids.size() == 2 &&
1060 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1061 ssids[1].empty();
1062}
1063
1064TEST_F(WiFiMainTest, ScanHidden) {
1065 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1066 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1067 .Times(AnyNumber())
1068 .WillRepeatedly(Throw(
1069 DBus::Error(
1070 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1071 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001072 {
1073 // Create a hidden, favorite service.
1074 Error e;
1075 WiFiServiceRefPtr service =
1076 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1077 NULL, NULL, true, &e);
1078 EXPECT_TRUE(e.IsSuccess());
1079 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001080 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001081 }
1082 {
1083 // Create a hidden, non-favorite service.
1084 Error e;
1085 WiFiServiceRefPtr service =
1086 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1087 NULL, NULL, true, &e);
1088 EXPECT_TRUE(e.IsSuccess());
1089 EXPECT_TRUE(service->hidden_ssid());
1090 }
1091 {
1092 // Create a non-hidden, favorite service.
1093 Error e;
1094 WiFiServiceRefPtr service =
1095 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1096 NULL, NULL, false, &e);
1097 EXPECT_TRUE(e.IsSuccess());
1098 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001099 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001100 }
1101 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001102 StartWiFi();
1103 dispatcher_.DispatchPendingEvents();
1104}
1105
mukesh agrawal7ec71312011-11-10 02:08:26 +00001106TEST_F(WiFiMainTest, InitialSupplicantState) {
1107 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1108}
1109
1110TEST_F(WiFiMainTest, StateChangeNoService) {
1111 // State change should succeed even if there is no pending Service.
1112 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1113 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1114}
1115
1116TEST_F(WiFiMainTest, StateChangeWithService) {
1117 // Forward transition should trigger a Service state change.
1118 StartWiFi();
1119 dispatcher_.DispatchPendingEvents();
1120 MockWiFiServiceRefPtr service = MakeMockService();
1121 InitiateConnect(service);
1122 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1123 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1124 // Verify expectations now, because WiFi may report other state changes
1125 // when WiFi is Stop()-ed (during TearDown()).
1126 Mock::VerifyAndClearExpectations(service.get());
1127}
1128
1129TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1130 // Some backwards transitions should not trigger a Service state change.
1131 // Supplicant state should still be updated, however.
1132 StartWiFi();
1133 dispatcher_.DispatchPendingEvents();
1134 MockWiFiServiceRefPtr service = MakeMockService();
1135 InitiateConnect(service);
1136 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1137 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1138 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1139 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1140 GetSupplicantState());
1141 // Verify expectations now, because WiFi may report other state changes
1142 // when WiFi is Stop()-ed (during TearDown()).
1143 Mock::VerifyAndClearExpectations(service.get());
1144}
1145
Paul Stewarta41e38d2011-11-11 07:47:29 -08001146TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1147 StrictMock<MockStore> storage;
1148 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1149 .WillOnce(Return(set<string>()));
1150 EXPECT_FALSE(LoadHiddenServices(&storage));
1151}
1152
1153TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1154 string id;
1155 StrictMock<MockStore> storage;
1156 SetupHiddenStorage(&storage, "an_ssid", &id);
1157 // Missing "Hidden" property.
1158 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1159 .WillOnce(Return(false));
1160 EXPECT_FALSE(LoadHiddenServices(&storage));
1161}
1162
1163TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1164 string id;
1165 StrictMock<MockStore> storage;
1166 SetupHiddenStorage(&storage, "an_ssid", &id);
1167 // "Hidden" property set to "false".
1168 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1169 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1170 EXPECT_FALSE(LoadHiddenServices(&storage));
1171}
1172
1173TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1174 string id;
1175 StrictMock<MockStore> storage;
1176 SetupHiddenStorage(&storage, "an_ssid", &id);
1177 // Missing "SSID" property.
1178 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1179 .WillOnce(Return(false));
1180 EXPECT_FALSE(LoadHiddenServices(&storage));
1181}
1182
1183
1184TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1185 StrictMock<MockStore> storage;
1186 string id;
1187 SetupHiddenStorage(&storage, "an_ssid", &id);
1188 Error e;
1189 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1190 ASSERT_TRUE(e.IsSuccess());
1191 EXPECT_FALSE(LoadHiddenServices(&storage));
1192}
1193
1194TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1195 StrictMock<MockStore> storage;
1196 string ssid("an_ssid");
1197 string id;
1198 SetupHiddenStorage(&storage, ssid, &id);
1199 EXPECT_TRUE(LoadHiddenServices(&storage));
1200 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1201 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1202 flimflam::kSecurityNone).get());
1203}
1204
mukesh agrawal15908392011-11-16 18:29:25 +00001205TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1206 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1207 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1208
1209 // Note that the BSS handle used in this test ("an_ap") is not
1210 // intended to reflect the format used by supplicant. It's just
1211 // convenient for testing.
1212
1213 StartWiFi();
1214 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1215 kNetworkModeInfrastructure);
1216 InitiateConnect(service);
1217 EXPECT_EQ(service, GetPendingService().get());
1218
1219 ReportCurrentBSSChanged("an_ap");
1220 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1221 EXPECT_EQ(Service::kStateConfiguring, service->state());
1222 EXPECT_EQ(service, GetCurrentService().get());
1223 EXPECT_EQ(NULL, GetPendingService().get());
1224
1225 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001226 EXPECT_EQ(Service::kStateFailure, service->state());
mukesh agrawal15908392011-11-16 18:29:25 +00001227 EXPECT_EQ(NULL, GetCurrentService().get());
1228 EXPECT_EQ(NULL, GetPendingService().get());
1229}
1230
1231TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1232 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1233 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1234 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1235 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1236
1237 // Note that the BSS handles used in this test ("ap1", "ap2") are
1238 // not intended to reflect the format used by supplicant. They're
1239 // just convenient for testing.
1240
1241 StartWiFi();
1242 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1243 kNetworkModeInfrastructure);
1244 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1245 kNetworkModeInfrastructure);
1246 InitiateConnect(service1);
1247 ReportCurrentBSSChanged("ap1");
1248 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1249 EXPECT_EQ(service1.get(), GetCurrentService().get());
1250
1251 ReportCurrentBSSChanged("ap2");
1252 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1253 EXPECT_EQ(service2.get(), GetCurrentService().get());
1254 EXPECT_EQ(Service::kStateIdle, service1->state());
1255 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1256}
1257
1258TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1259 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1260 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1261
1262 // Note that the BSS handle used in this test ("an_ap") is not
1263 // intended to reflect the format used by supplicant. It's just
1264 // convenient for testing.
1265
1266 StartWiFi();
1267 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1268 kNetworkModeInfrastructure);
1269 InitiateConnect(service);
1270 ReportCurrentBSSChanged("an_ap");
1271 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1272 EXPECT_EQ(service.get(), GetCurrentService().get());
1273 EXPECT_EQ(Service::kStateConfiguring, service->state());
1274}
1275
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001276TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1277 Error e;
1278 EXPECT_CALL(*manager(), RegisterService(_))
1279 .Times(0);
1280 EXPECT_CALL(*manager(), HasService(_))
1281 .WillOnce(Return(false));
1282 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1283 EXPECT_CALL(*manager(), RegisterService(_));
1284 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0,
1285 kNetworkModeInfrastructure);
1286}
1287
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001288TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1289 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1290 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1291 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1292 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1293
1294 StartWiFi();
1295 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1296 kNetworkModeInfrastructure);
1297 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1298 kNetworkModeInfrastructure);
1299 InitiateConnect(service1);
1300 EXPECT_EQ(service1.get(), GetPendingService().get());
1301
1302 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1303 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1304 InitiateConnect(service2);
1305 EXPECT_EQ(service2.get(), GetPendingService().get());
1306}
1307
1308TEST_F(WiFiMainTest, IsIdle) {
1309 StartWiFi();
1310 EXPECT_TRUE(wifi()->IsIdle());
1311
1312 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1313 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1314 Error error;
1315 service->AddEndpoint(ap);
1316 service->AutoConnect();
1317 EXPECT_FALSE(wifi()->IsIdle());
1318}
1319
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001320MATCHER(WiFiAddedArgs, "") {
1321 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1322 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1323}
1324
1325TEST_F(WiFiMainTest, AddNetworkArgs) {
1326 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1327 *supplicant_interface_proxy_;
1328
1329 StartWiFi();
1330 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
1331 WiFiService *service(GetServices().begin()->get());
1332 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1333 InitiateConnect(service);
1334}
1335
Chris Masone853b81b2011-06-24 14:11:41 -07001336} // namespace shill