blob: 559898811dd3d362fdf525d131401e038748118a [file] [log] [blame]
Chris Masone853b81b2011-06-24 14:11:41 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
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"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070036#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080037#include "shill/mock_store.h"
mukesh agrawal31950242011-07-14 11:53:38 -070038#include "shill/mock_supplicant_interface_proxy.h"
39#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000040#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070041#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070042#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070043#include "shill/proxy_factory.h"
44#include "shill/wifi_endpoint.h"
45#include "shill/wifi.h"
mukesh agrawal32399322011-09-01 10:53:43 -070046#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080047#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070048
49using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080050using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070051using std::string;
52using std::vector;
53using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070054using ::testing::AnyNumber;
55using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080056using ::testing::DoAll;
mukesh agrawal31950242011-07-14 11:53:38 -070057using ::testing::InSequence;
mukesh agrawal7ec71312011-11-10 02:08:26 +000058using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070059using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070060using ::testing::Return;
Paul Stewarta41e38d2011-11-11 07:47:29 -080061using ::testing::SetArgumentPointee;
62using ::testing::StrEq;
63using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070064using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070065using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070066using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070067
68namespace shill {
69
mukesh agrawal31950242011-07-14 11:53:38 -070070class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070071 public:
mukesh agrawal31950242011-07-14 11:53:38 -070072 WiFiPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070073 : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070074 }
mukesh agrawal31950242011-07-14 11:53:38 -070075 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070076
77 protected:
78 DeviceRefPtr device_;
79};
80
mukesh agrawal31950242011-07-14 11:53:38 -070081TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070082 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
83 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070084}
85
mukesh agrawal31950242011-07-14 11:53:38 -070086TEST_F(WiFiPropertyTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -070087 {
88 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070089 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070090 flimflam::kBgscanMethodProperty,
91 PropertyStoreTest::kStringV,
92 &error));
93 }
94 {
95 ::DBus::Error error;
96 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070097 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070098 flimflam::kBgscanSignalThresholdProperty,
99 PropertyStoreTest::kInt32V,
100 &error));
101 }
102 {
103 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700104 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 flimflam::kScanIntervalProperty,
106 PropertyStoreTest::kUint16V,
107 &error));
108 }
Chris Masone853b81b2011-06-24 14:11:41 -0700109 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 {
111 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700112 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700113 flimflam::kScanningProperty,
114 PropertyStoreTest::kBoolV,
115 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700116 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700117 }
Chris Masone853b81b2011-06-24 14:11:41 -0700118}
119
mukesh agrawal8ede0522011-10-03 14:57:44 -0700120class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700121 public:
122 WiFiMainTest()
Chris Masoneb9c00592011-10-06 13:10:39 -0700123 : manager_(&control_interface_, NULL, &glib_),
Chris Masone626719f2011-08-18 16:58:48 -0700124 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700125 &dispatcher_,
Chris Masone626719f2011-08-18 16:58:48 -0700126 &manager_,
127 kDeviceName,
128 kDeviceAddress,
129 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700130 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
131 supplicant_interface_proxy_(
132 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700133 dhcp_config_(new MockDHCPConfig(&control_interface_,
134 &dispatcher_,
135 &dhcp_provider_,
136 kDeviceName,
137 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700138 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700139 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000140 // Except for WiFiServices created via WiFi::GetService, we expect
141 // that any WiFiService has been registered with the Manager. So
142 // default Manager.HasService to true, to make the common case
143 // easy.
144 ON_CALL(manager_, HasService(_)).
145 WillByDefault(Return(true));
mukesh agrawal31950242011-07-14 11:53:38 -0700146 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700147
148 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700149 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700150 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
151 wifi_->set_dhcp_provider(&dhcp_provider_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700152 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700153 }
154
155 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700156 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700157 // must Stop WiFi instance, to clear its list of services.
158 // otherwise, the WiFi instance will not be deleted. (because
159 // services reference a WiFi instance, creating a cycle.)
160 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700161 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700162 }
163
mukesh agrawal31950242011-07-14 11:53:38 -0700164 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000165 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
166
mukesh agrawal31950242011-07-14 11:53:38 -0700167 class TestProxyFactory : public ProxyFactory {
168 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700169 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700170
171 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700172 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700173 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700174 }
175
176 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700177 const WiFiRefPtr &/*wifi*/,
178 const DBus::Path &/*object_path*/,
179 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700180 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700181 }
182
183 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700184 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700185 };
186
mukesh agrawal15908392011-11-16 18:29:25 +0000187 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
188 bool hidden_ssid = false;
189 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
190 }
191 const WiFiServiceRefPtr &GetCurrentService() {
192 return wifi_->current_service_;
193 }
mukesh agrawal31950242011-07-14 11:53:38 -0700194 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000195 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700196 }
mukesh agrawal15908392011-11-16 18:29:25 +0000197 const WiFiServiceRefPtr &GetPendingService() {
198 return wifi_->pending_service_;
199 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000200 const vector<WiFiServiceRefPtr> &GetServices() {
201 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700202 }
203 // note: the tests need the proxies referenced by WiFi (not the
204 // proxies instantiated by WiFiMainTest), to ensure that WiFi
205 // sets up its proxies correctly.
206 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
207 return wifi_->supplicant_process_proxy_.get();
208 }
209 SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
210 return wifi_->supplicant_interface_proxy_.get();
211 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000212 const string &GetSupplicantState() {
213 return wifi_->supplicant_state_;
214 }
215 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700216 map<string, ::DBus::Variant> params;
217 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700218 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000219 void InitiateDisconnect(WiFiServiceRefPtr service) {
220 wifi_->DisconnectFrom(service);
221 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700222 bool IsLinkUp() {
223 return wifi_->link_up_;
224 }
mukesh agrawal15908392011-11-16 18:29:25 +0000225 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
226 map <string, ::DBus::Variant> args;
227 ::DBus::MessageIter writer;
228
229 writer = args[wpa_supplicant::kBSSPropertySSID].writer();
230 writer << vector<uint8_t>(ssid.begin(), ssid.end());
231
232 string bssid_nosep;
233 RemoveChars(bssid, ":", &bssid_nosep);
234 vector<uint8_t> bssid_bytes;
235 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
236 writer = args[wpa_supplicant::kBSSPropertyBSSID].writer();
237 writer << bssid_bytes;
238
239 args[wpa_supplicant::kBSSPropertySignal].writer().append_int16(0);
240 args[wpa_supplicant::kBSSPropertyMode].writer().append_string(
241 wpa_supplicant::kNetworkModeInfrastructure);
242 // We indicate this is an open BSS by leaving out all security properties.
243
244 return new WiFiEndpoint(args);
245 }
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_,
251 &manager_,
252 wifi_,
253 ssid,
254 flimflam::kModeManaged,
255 flimflam::kSecurityNone,
256 false);
257 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000258 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700259 void ReportBSS(const ::DBus::Path &bss_path,
260 const string &ssid,
261 const string &bssid,
262 int16_t signal_strength,
263 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700264 void ReportLinkUp() {
265 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
266 }
mukesh agrawal31950242011-07-14 11:53:38 -0700267 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700268 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700269 }
mukesh agrawal15908392011-11-16 18:29:25 +0000270 void ReportCurrentBSSChanged(const string &new_bss) {
271 wifi_->CurrentBSSChanged(new_bss);
272 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000273 void ReportStateChanged(const string &new_state) {
274 wifi_->StateChanged(new_state);
275 }
mukesh agrawal31950242011-07-14 11:53:38 -0700276 void StartWiFi() {
277 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700278 }
279 void StopWiFi() {
280 wifi_->Stop();
281 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800282 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700283 const char *ssid,
284 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800285 Error *result) {
286 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700287 }
288 void GetService(const char *service_type,
289 const char *ssid,
290 const char *mode,
291 const char *security,
292 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800293 Error *result) {
294 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
295 result);
296 }
297 WiFiServiceRefPtr GetServiceInner(const char *service_type,
298 const char *ssid,
299 const char *mode,
300 const char *security,
301 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800302 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800303 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700304 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700305 // in general, we want to avoid D-Bus specific code for any RPCs
306 // that come in via adaptors. we make an exception here, because
307 // calls to GetWifiService are rerouted from the Manager object to
308 // the Wifi class.
309 if (service_type != NULL)
310 args[flimflam::kTypeProperty].writer().append_string(service_type);
311 if (ssid != NULL)
312 args[flimflam::kSSIDProperty].writer().append_string(ssid);
313 if (mode != NULL)
314 args[flimflam::kModeProperty].writer().append_string(mode);
315 if (security != NULL)
316 args[flimflam::kSecurityProperty].writer().append_string(security);
317 if (passphrase != NULL)
318 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800319 if (!allow_hidden)
320 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700321
Paul Stewartced6a0b2011-11-08 15:32:04 -0800322 Error e;
323 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700324 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800325 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700326 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800327 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
328 const string &mode,
329 const string &security) {
330 return wifi_->FindService(ssid, mode, security);
331 }
332 bool LoadHiddenServices(StoreInterface *storage) {
333 return wifi_->LoadHiddenServices(storage);
334 }
335 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
336 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
337 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
338 flimflam::kTypeWifi,
339 kDeviceAddress,
340 hex_ssid.c_str(),
341 flimflam::kModeManaged,
342 flimflam::kSecurityNone));
343 const char *groups[] = { id->c_str() };
344 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
345 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
346 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
347 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
348 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
349 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
350 }
mukesh agrawal32399322011-09-01 10:53:43 -0700351 MockManager *manager() {
352 return &manager_;
353 }
354 const WiFiConstRefPtr wifi() const {
355 return wifi_;
356 }
357
358 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700359 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700360
361 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700362 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700363 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700364 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700365 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700366
367 // protected fields interspersed between private fields, due to
368 // initialization order
369 protected:
370 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700371 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700372 static const char kNetworkModeAdHoc[];
373 static const char kNetworkModeInfrastructure[];
374
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700375 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
376 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700377 MockDHCPProvider dhcp_provider_;
378 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700379
380 private:
381 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700382};
383
384const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800385const char WiFiMainTest::kDeviceAddress[] = "000102030405";
mukesh agrawal31950242011-07-14 11:53:38 -0700386const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
387const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
388
mukesh agrawal261daca2011-12-02 18:56:56 +0000389void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000390 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000391}
392
mukesh agrawal31950242011-07-14 11:53:38 -0700393void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
394 const string &ssid,
395 const string &bssid,
396 int16_t signal_strength,
397 const char *mode) {
398 map<string, ::DBus::Variant> bss_properties;
399
400 {
401 DBus::MessageIter writer(bss_properties["SSID"].writer());
402 writer << vector<uint8_t>(ssid.begin(), ssid.end());
403 }
404 {
405 string bssid_nosep;
406 vector<uint8_t> bssid_bytes;
407 RemoveChars(bssid, ":", &bssid_nosep);
408 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
409
410 DBus::MessageIter writer(bss_properties["BSSID"].writer());
411 writer << bssid_bytes;
412 }
413 bss_properties["Signal"].writer().append_int16(signal_strength);
414 bss_properties["Mode"].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000415 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700416}
417
418TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
419 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
420 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
421
422 StartWiFi();
423 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
424 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
425}
426
427TEST_F(WiFiMainTest, CleanStart) {
428 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
429 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
430 .Times(AnyNumber())
431 .WillRepeatedly(Throw(
432 DBus::Error(
433 "fi.w1.wpa_supplicant1.InterfaceUnknown",
434 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
435 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
436 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700437 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700438}
439
440TEST_F(WiFiMainTest, Restart) {
441 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
442 .Times(AnyNumber())
443 .WillRepeatedly(Throw(
444 DBus::Error(
445 "fi.w1.wpa_supplicant1.InterfaceExists",
446 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
447 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
448 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
449 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700450 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700451}
452
453TEST_F(WiFiMainTest, StartClearsState) {
454 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
455 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
456 StartWiFi();
457}
458
459TEST_F(WiFiMainTest, ScanResults) {
460 StartWiFi();
461 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
462 ReportBSS(
463 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
464 ReportBSS(
465 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
466 ReportBSS(
467 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
468 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
469 EXPECT_EQ(5, GetEndpointMap().size());
470}
471
472TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
473 StartWiFi();
474 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
475 ReportBSS(
476 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
477 ReportBSS(
478 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
479 ReportBSS(
480 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
481 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000482
483 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
484 EXPECT_EQ(3, endpoints_by_rpcid.size());
485
486 WiFi::EndpointMap::const_iterator i;
487 WiFiEndpointRefPtr endpoint;
488 for (i = endpoints_by_rpcid.begin();
489 i != endpoints_by_rpcid.end();
490 ++i) {
491 if (i->second->bssid_string() == "00:00:00:00:00:00")
492 break;
493 }
494 ASSERT_TRUE(i != endpoints_by_rpcid.end());
495 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700496}
497
498TEST_F(WiFiMainTest, ScanCompleted) {
499 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000500 EXPECT_CALL(*manager(), RegisterService(_))
501 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700502 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
503 ReportBSS(
504 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
505 ReportBSS(
506 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
507 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000508 EXPECT_EQ(3, GetServices().size());
509}
510
511TEST_F(WiFiMainTest, EndpointGroupingTogether) {
512 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000513
514 InSequence s;
515 EXPECT_CALL(*manager(), RegisterService(_));
516 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal165e6142011-11-22 02:22:56 +0000517 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
518 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
519 ReportScanDone();
520 EXPECT_EQ(1, GetServices().size());
521}
522
523TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
524 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000525 EXPECT_CALL(*manager(), RegisterService(_))
526 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000527 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
528 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
529 ReportScanDone();
530 EXPECT_EQ(2, GetServices().size());
531}
532
533TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
534 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000535 EXPECT_CALL(*manager(), RegisterService(_))
536 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000537 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
538 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
539 ReportScanDone();
540 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700541}
542
mukesh agrawal261daca2011-12-02 18:56:56 +0000543TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
544 // Removal of non-existent BSS should not cause a crash.
545 StartWiFi();
546 RemoveBSS("bss0");
547 EXPECT_EQ(0, GetServices().size());
548}
549
550TEST_F(WiFiMainTest, LoneBSSRemoved) {
551 StartWiFi();
552 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
553 ReportScanDone();
554 EXPECT_EQ(1, GetServices().size());
555 EXPECT_TRUE(GetServices().front()->IsVisible());
556
557 EXPECT_CALL(*manager(), UpdateService(_));
558 RemoveBSS("bss0");
559 EXPECT_FALSE(GetServices().front()->IsVisible());
560 EXPECT_EQ(1, GetServices().size());
561}
562
563TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
564 StartWiFi();
565 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
566 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
567 ReportScanDone();
568 EXPECT_EQ(1, GetServices().size());
569 EXPECT_TRUE(GetServices().front()->IsVisible());
570
571 EXPECT_CALL(*manager(), UpdateService(_));
572 RemoveBSS("bss0");
573 EXPECT_TRUE(GetServices().front()->IsVisible());
574 EXPECT_EQ(1, GetServices().size());
575}
576
mukesh agrawal31950242011-07-14 11:53:38 -0700577TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700578 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
579 *supplicant_interface_proxy_;
580
mukesh agrawal31950242011-07-14 11:53:38 -0700581 StartWiFi();
582 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
583 ReportScanDone();
584
585 {
586 InSequence s;
587 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000588 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700589
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700590 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700591 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700592 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700593 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700594 EXPECT_EQ(static_cast<Service *>(service),
595 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700596 }
597}
598
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000599TEST_F(WiFiMainTest, DisconnectPendingService) {
600 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
601 *supplicant_interface_proxy_;
602
603 StartWiFi();
604 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
605 WiFiService *service(GetServices().begin()->get());
606 InitiateConnect(service);
607
608 EXPECT_FALSE(GetPendingService() == NULL);
609 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
610 InitiateDisconnect(service);
611
612 EXPECT_TRUE(GetPendingService() == NULL);
613}
614
615TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
616 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
617 *supplicant_interface_proxy_;
618
619 StartWiFi();
620 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
621 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
622 WiFiService *service0(GetServices()[0].get());
623 WiFiService *service1(GetServices()[1].get());
624
625 InitiateConnect(service0);
626 ReportCurrentBSSChanged("bss0");
627 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
628 InitiateConnect(service1);
629
630 EXPECT_EQ(service0, GetCurrentService());
631 EXPECT_EQ(service1, GetPendingService());
632 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
633 InitiateDisconnect(service1);
634
635 // |current_service_| will be unchanged until supplicant signals
636 // that CurrentBSS has changed.
637 EXPECT_EQ(service0, GetCurrentService());
638 // |pending_service_| is updated immediately.
639 EXPECT_TRUE(GetPendingService() == NULL);
640}
641
642TEST_F(WiFiMainTest, DisconnectCurrentService) {
643 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
644 *supplicant_interface_proxy_;
645
646 StartWiFi();
647 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
648 WiFiService *service(GetServices().begin()->get());
649 InitiateConnect(service);
650 ReportCurrentBSSChanged("bss0");
651 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
652
653 EXPECT_EQ(service, GetCurrentService());
654 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
655 InitiateDisconnect(service);
656
657 // |current_service_| should not change until supplicant reports
658 // a BSS change.
659 EXPECT_EQ(service, GetCurrentService());
660}
661
662TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
663 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
664 *supplicant_interface_proxy_;
665
666 StartWiFi();
667 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
668 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
669 WiFiService *service0(GetServices()[0].get());
670 WiFiService *service1(GetServices()[1].get());
671
672 InitiateConnect(service0);
673 ReportCurrentBSSChanged("bss0");
674 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
675 InitiateConnect(service1);
676
677 EXPECT_EQ(service0, GetCurrentService());
678 EXPECT_EQ(service1, GetPendingService());
679 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
680 .Times(0);
681 InitiateDisconnect(service0);
682
683 EXPECT_EQ(service0, GetCurrentService());
684 EXPECT_EQ(service1, GetPendingService());
685}
686
687TEST_F(WiFiMainTest, DisconnectInvalidService) {
688 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
689 *supplicant_interface_proxy_;
690
691 StartWiFi();
692 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
693 WiFiService *service(GetServices().begin()->get());
694 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
695 .Times(0);
696 InitiateDisconnect(service);
697}
698
699TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
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
706 WiFiService *service(GetServices().begin()->get());
707 DBus::Path fake_path("/fake/path");
708 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
709 .WillOnce(Return(fake_path));
710 InitiateConnect(service);
711 ReportCurrentBSSChanged("bss0");
712 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
713
714 EXPECT_EQ(service, GetCurrentService());
715 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
716 .WillRepeatedly(Throw(
717 DBus::Error(
718 "fi.w1.wpa_supplicant1.NotConnected",
719 "test threw fi.w1.wpa_supplicant1.NotConnected")));
720 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
721 InitiateDisconnect(service);
722
723 EXPECT_TRUE(GetCurrentService() == NULL);
724}
725
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700726TEST_F(WiFiMainTest, LinkEvent) {
727 EXPECT_FALSE(IsLinkUp());
728 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
729 WillOnce(Return(dhcp_config_));
730 ReportLinkUp();
731}
732
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700733TEST_F(WiFiMainTest, Stop) {
734 {
735 InSequence s;
736
737 StartWiFi();
738 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
739 ReportScanDone();
740 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
741 WillOnce(Return(dhcp_config_));
742 ReportLinkUp();
743 }
744
745 {
746 EXPECT_CALL(*manager(), DeregisterService(_));
747 StopWiFi();
748 }
749}
750
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700751TEST_F(WiFiMainTest, GetWifiServiceOpen) {
752 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800753 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700754 EXPECT_TRUE(e.IsSuccess());
755}
756
757TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
758 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800759 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700760 EXPECT_EQ(Error::kInvalidArguments, e.type());
761 EXPECT_EQ("must specify service type", e.message());
762}
763
764TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
765 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800766 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700767 EXPECT_EQ(Error::kInvalidArguments, e.type());
768 EXPECT_EQ("must specify SSID", e.message());
769}
770
771TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
772 Error e;
773 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800774 flimflam::kTypeWifi, "123456789012345678901234567890123",
775 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700776 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
777 EXPECT_EQ("SSID is too long", e.message());
778}
779
780TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
781 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800782 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700783 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
784 EXPECT_EQ("SSID is too short", e.message());
785}
786
787TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
788 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800789 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700790 EXPECT_EQ(Error::kNotSupported, e.type());
791 EXPECT_EQ("service mode is unsupported", e.message());
792}
793
794TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
795 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800796 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700797 EXPECT_TRUE(e.IsSuccess());
798}
799
800TEST_F(WiFiMainTest, GetWifiServiceRSN) {
801 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800802 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
803 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700804 EXPECT_TRUE(e.IsSuccess());
805}
806
807TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
808 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800809 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
810 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700811 EXPECT_EQ(Error::kInvalidArguments, e.type());
812 EXPECT_EQ("must specify passphrase", e.message());
813}
814
815TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
816 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800817 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
818 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700819 EXPECT_EQ(Error::kNotSupported, e.type());
820 EXPECT_EQ("security mode is unsupported", e.message());
821}
822
823TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
824 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800825 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
826 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700827 EXPECT_EQ(Error::kInvalidArguments, e.type());
828 EXPECT_EQ("must specify passphrase", e.message());
829}
830
831TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
832 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800833 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
834 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700835 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
836}
837
838TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
839 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800840 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
841 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700842 EXPECT_TRUE(e.IsSuccess());
843}
844
845TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
846 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800847 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
848 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700849 EXPECT_TRUE(e.IsSuccess());
850}
851
852TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
853 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800854 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
855 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700856 EXPECT_TRUE(e.IsSuccess());
857}
858
859TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
860 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800861 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
862 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700863 EXPECT_TRUE(e.IsSuccess());
864}
865
866TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
867 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800868 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
869 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700870 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
871}
872
873TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
874 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800875 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
876 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700877 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
878}
879
880TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
881 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800882 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
883 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700884 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
885}
886
887TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
888 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800889 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
890 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700891 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
892}
893
894TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
895 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800896 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
897 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700898 EXPECT_TRUE(e.IsSuccess());
899}
900
901TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
902 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800903 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
904 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700905 EXPECT_TRUE(e.IsSuccess());
906}
907
908TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
909 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800910 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
911 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700912 EXPECT_TRUE(e.IsSuccess());
913}
914
915TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
916 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800917 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
918 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700919 EXPECT_TRUE(e.IsSuccess());
920}
921
mukesh agrawal8ede0522011-10-03 14:57:44 -0700922class WiFiGetServiceSuccessTest : public WiFiMainTest {};
923class WiFiGetServiceFailureTest : public WiFiMainTest {};
924
925TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
926 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800927 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
928 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700929 EXPECT_TRUE(e.IsSuccess());
930}
931
932TEST_P(WiFiGetServiceFailureTest, Passphrase) {
933 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800934 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
935 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700936 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
937}
938
939INSTANTIATE_TEST_CASE_P(
940 WiFiGetServiceSuccessTestInstance,
941 WiFiGetServiceSuccessTest,
942 Values(
943 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
944 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
945 // subtle: invalid length for hex key, but valid as ascii passphrase
946 string(IEEE_80211::kWPAHexLen-1, '1'),
947 string(IEEE_80211::kWPAHexLen, '1')));
948
949INSTANTIATE_TEST_CASE_P(
950 WiFiGetServiceFailureTestInstance,
951 WiFiGetServiceFailureTest,
952 Values(
953 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
954 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
955 string(IEEE_80211::kWPAHexLen+1, '1')));
956
Paul Stewart6ab23a92011-11-09 17:17:47 -0800957TEST_F(WiFiMainTest, FindServiceWEP) {
958 const string ssid("an_ssid");
959 {
960 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800961 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800962 flimflam::kSecurityWep, "abcde", &e);
963 EXPECT_TRUE(e.IsSuccess());
964 }
965 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
966
Paul Stewarta41e38d2011-11-11 07:47:29 -0800967 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
968 flimflam::kSecurityWep).get());
969 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
970 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -0800971}
972
973TEST_F(WiFiMainTest, FindServiceWPA) {
974 const string ssid("an_ssid");
975 {
976 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800977 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800978 flimflam::kSecurityRsn, "abcdefgh", &e);
979 EXPECT_TRUE(e.IsSuccess());
980 }
981 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -0800982 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
983 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800984 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -0800985 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
986 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800987 EXPECT_TRUE(rsn_service.get());
988 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -0800989 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
990 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800991 EXPECT_EQ(wpa_service.get(), psk_service.get());
992 // Indirectly test FindService by doing a GetService on something that
993 // already exists.
994 {
995 Error e;
996 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800997 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
998 flimflam::kModeManaged, flimflam::kSecurityWpa,
999 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001000 EXPECT_TRUE(e.IsSuccess());
1001 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1002 }
1003}
1004
Paul Stewartced6a0b2011-11-08 15:32:04 -08001005MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001006 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001007 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1008 if (it == arg.end()) {
1009 return false;
1010 }
1011
1012 const DBus::Variant &ssids_variant = it->second;
1013 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1014 const ByteArrays &ssids = it->second.operator ByteArrays();
1015 // A valid Scan containing a single hidden SSID should contain
1016 // two SSID entries: one containing the SSID we are looking for,
1017 // and an empty entry, signifying that we also want to do a
1018 // broadcast probe request for all non-hidden APs as well.
1019 return ssids.size() == 2 &&
1020 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1021 ssids[1].empty();
1022}
1023
1024TEST_F(WiFiMainTest, ScanHidden) {
1025 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1026 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1027 .Times(AnyNumber())
1028 .WillRepeatedly(Throw(
1029 DBus::Error(
1030 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1031 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001032 {
1033 // Create a hidden, favorite service.
1034 Error e;
1035 WiFiServiceRefPtr service =
1036 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1037 NULL, NULL, true, &e);
1038 EXPECT_TRUE(e.IsSuccess());
1039 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001040 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001041 }
1042 {
1043 // Create a hidden, non-favorite service.
1044 Error e;
1045 WiFiServiceRefPtr service =
1046 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1047 NULL, NULL, true, &e);
1048 EXPECT_TRUE(e.IsSuccess());
1049 EXPECT_TRUE(service->hidden_ssid());
1050 }
1051 {
1052 // Create a non-hidden, favorite service.
1053 Error e;
1054 WiFiServiceRefPtr service =
1055 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1056 NULL, NULL, false, &e);
1057 EXPECT_TRUE(e.IsSuccess());
1058 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001059 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001060 }
1061 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001062 StartWiFi();
1063 dispatcher_.DispatchPendingEvents();
1064}
1065
mukesh agrawal7ec71312011-11-10 02:08:26 +00001066TEST_F(WiFiMainTest, InitialSupplicantState) {
1067 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1068}
1069
1070TEST_F(WiFiMainTest, StateChangeNoService) {
1071 // State change should succeed even if there is no pending Service.
1072 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1073 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1074}
1075
1076TEST_F(WiFiMainTest, StateChangeWithService) {
1077 // Forward transition should trigger a Service state change.
1078 StartWiFi();
1079 dispatcher_.DispatchPendingEvents();
1080 MockWiFiServiceRefPtr service = MakeMockService();
1081 InitiateConnect(service);
1082 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1083 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1084 // Verify expectations now, because WiFi may report other state changes
1085 // when WiFi is Stop()-ed (during TearDown()).
1086 Mock::VerifyAndClearExpectations(service.get());
1087}
1088
1089TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1090 // Some backwards transitions should not trigger a Service state change.
1091 // Supplicant state should still be updated, however.
1092 StartWiFi();
1093 dispatcher_.DispatchPendingEvents();
1094 MockWiFiServiceRefPtr service = MakeMockService();
1095 InitiateConnect(service);
1096 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1097 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1098 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1099 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1100 GetSupplicantState());
1101 // Verify expectations now, because WiFi may report other state changes
1102 // when WiFi is Stop()-ed (during TearDown()).
1103 Mock::VerifyAndClearExpectations(service.get());
1104}
1105
Paul Stewarta41e38d2011-11-11 07:47:29 -08001106TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1107 StrictMock<MockStore> storage;
1108 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1109 .WillOnce(Return(set<string>()));
1110 EXPECT_FALSE(LoadHiddenServices(&storage));
1111}
1112
1113TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1114 string id;
1115 StrictMock<MockStore> storage;
1116 SetupHiddenStorage(&storage, "an_ssid", &id);
1117 // Missing "Hidden" property.
1118 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1119 .WillOnce(Return(false));
1120 EXPECT_FALSE(LoadHiddenServices(&storage));
1121}
1122
1123TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1124 string id;
1125 StrictMock<MockStore> storage;
1126 SetupHiddenStorage(&storage, "an_ssid", &id);
1127 // "Hidden" property set to "false".
1128 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1129 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1130 EXPECT_FALSE(LoadHiddenServices(&storage));
1131}
1132
1133TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1134 string id;
1135 StrictMock<MockStore> storage;
1136 SetupHiddenStorage(&storage, "an_ssid", &id);
1137 // Missing "SSID" property.
1138 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1139 .WillOnce(Return(false));
1140 EXPECT_FALSE(LoadHiddenServices(&storage));
1141}
1142
1143
1144TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1145 StrictMock<MockStore> storage;
1146 string id;
1147 SetupHiddenStorage(&storage, "an_ssid", &id);
1148 Error e;
1149 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1150 ASSERT_TRUE(e.IsSuccess());
1151 EXPECT_FALSE(LoadHiddenServices(&storage));
1152}
1153
1154TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1155 StrictMock<MockStore> storage;
1156 string ssid("an_ssid");
1157 string id;
1158 SetupHiddenStorage(&storage, ssid, &id);
1159 EXPECT_TRUE(LoadHiddenServices(&storage));
1160 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1161 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1162 flimflam::kSecurityNone).get());
1163}
1164
mukesh agrawal15908392011-11-16 18:29:25 +00001165TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1166 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1167 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1168
1169 // Note that the BSS handle used in this test ("an_ap") is not
1170 // intended to reflect the format used by supplicant. It's just
1171 // convenient for testing.
1172
1173 StartWiFi();
1174 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1175 kNetworkModeInfrastructure);
1176 InitiateConnect(service);
1177 EXPECT_EQ(service, GetPendingService().get());
1178
1179 ReportCurrentBSSChanged("an_ap");
1180 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1181 EXPECT_EQ(Service::kStateConfiguring, service->state());
1182 EXPECT_EQ(service, GetCurrentService().get());
1183 EXPECT_EQ(NULL, GetPendingService().get());
1184
1185 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1186 EXPECT_EQ(Service::kStateIdle, service->state());
1187 EXPECT_EQ(NULL, GetCurrentService().get());
1188 EXPECT_EQ(NULL, GetPendingService().get());
1189}
1190
1191TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1192 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1193 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1194 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1195 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1196
1197 // Note that the BSS handles used in this test ("ap1", "ap2") are
1198 // not intended to reflect the format used by supplicant. They're
1199 // just convenient for testing.
1200
1201 StartWiFi();
1202 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1203 kNetworkModeInfrastructure);
1204 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1205 kNetworkModeInfrastructure);
1206 InitiateConnect(service1);
1207 ReportCurrentBSSChanged("ap1");
1208 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1209 EXPECT_EQ(service1.get(), GetCurrentService().get());
1210
1211 ReportCurrentBSSChanged("ap2");
1212 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1213 EXPECT_EQ(service2.get(), GetCurrentService().get());
1214 EXPECT_EQ(Service::kStateIdle, service1->state());
1215 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1216}
1217
1218TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1219 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1220 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1221
1222 // Note that the BSS handle used in this test ("an_ap") is not
1223 // intended to reflect the format used by supplicant. It's just
1224 // convenient for testing.
1225
1226 StartWiFi();
1227 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1228 kNetworkModeInfrastructure);
1229 InitiateConnect(service);
1230 ReportCurrentBSSChanged("an_ap");
1231 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1232 EXPECT_EQ(service.get(), GetCurrentService().get());
1233 EXPECT_EQ(Service::kStateConfiguring, service->state());
1234}
1235
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001236TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1237 Error e;
1238 EXPECT_CALL(*manager(), RegisterService(_))
1239 .Times(0);
1240 EXPECT_CALL(*manager(), HasService(_))
1241 .WillOnce(Return(false));
1242 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1243 EXPECT_CALL(*manager(), RegisterService(_));
1244 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0,
1245 kNetworkModeInfrastructure);
1246}
1247
Chris Masone853b81b2011-06-24 14:11:41 -07001248} // namespace shill