wifi_unittest.cc revision de29fa8d95092f28548b5e4537a6c61e21ae760b
1853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 2853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Use of this source code is governed by a BSD-style license that can be 3853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// found in the LICENSE file. 4853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/wifi.h" 6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <netinet/ether.h> 8f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h> 9f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 10853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 11853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 12853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 14dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h> 153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h> 163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h> 17853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <dbus-c++/dbus.h> 18853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 197156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h> 202ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h> 21853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 22853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 25f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h" 26f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h" 272ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h" 293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h" 30dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 31853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h" 333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h" 343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi.h" 353239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h" 36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 38853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 39853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 40853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 44dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 45853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 46853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 48853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 49853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 50853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 52853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 542176a88f197d802924d2a83d368e3efab7a6be4bChris Masone : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) { 55853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 57853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 58853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone DeviceRefPtr device_; 60853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 61853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 63de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty)); 64de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 65853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 66853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Dispatch) { 68a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 69a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 70de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(), 71a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone flimflam::kBgscanMethodProperty, 72a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kStringV, 73a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 74a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 75a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 76a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 77a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone EXPECT_TRUE(DBusAdaptor::DispatchOnType( 78de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 79a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone flimflam::kBgscanSignalThresholdProperty, 80a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 81a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 82a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 83a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 84a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 85de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(), 86a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone flimflam::kScanIntervalProperty, 87a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kUint16V, 88a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 89a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 91a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 92a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 93de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(), 94a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone flimflam::kScanningProperty, 95a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kBoolV, 96a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 979d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 98a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 100853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiMainTest : public Test { 1023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 1033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiMainTest() 1043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal : manager_(&control_interface_, NULL, NULL), 105626719f89881a949d8b5a8fa808beb924496489fChris Masone wifi_(new WiFi(&control_interface_, 1063239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal &dispatcher_, 107626719f89881a949d8b5a8fa808beb924496489fChris Masone &manager_, 108626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceName, 109626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceAddress, 110626719f89881a949d8b5a8fa808beb924496489fChris Masone 0)), 111dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 112dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_interface_proxy_( 113dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal new NiceMock<MockSupplicantInterfaceProxy>(wifi_)), 114f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal dhcp_config_(new MockDHCPConfig(&control_interface_, 115f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal &dispatcher_, 116f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal &dhcp_provider_, 117f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal kDeviceName, 118f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal &glib_)), 119dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal proxy_factory_(this) { 1203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ProxyFactory::set_factory(&proxy_factory_); 1213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ::testing::DefaultValue< ::DBus::Path>::Set("/default/path"); 1223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiMainTest() { 1243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 1263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 1273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal wifi_->Stop(); 1283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 130f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal virtual void SetUp() { 131f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 132f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 133f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 1343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 1353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal class TestProxyFactory : public ProxyFactory { 1363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 1377355ce1937c504d836a303ac809bd436272212b3Paul Stewart explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {} 1383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy( 1403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *dbus_path, const char *dbus_addr) { 141dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal return test_->supplicant_process_proxy_.release(); 1423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy( 1453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFiRefPtr &wifi, 1463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const DBus::Path &object_path, 1473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *dbus_addr) { 148dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal return test_->supplicant_interface_proxy_.release(); 1493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 152dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal WiFiMainTest *test_; 1533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal }; 1543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 1563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->endpoint_by_bssid_; 1573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::ServiceMap &GetServiceMap() { 1593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->service_by_private_id_; 1603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 1623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // proxies instantiated by WiFiMainTest), to ensure that WiFi 1633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 1643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 1653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 1663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() { 1683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_interface_proxy_.get(); 1693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1703239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal void InitiateConnect(WiFiService *service) { 1713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal wifi_->ConnectTo(service); 1723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 173f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal bool IsLinkUp() { 174f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal return wifi_->link_up_; 175f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 1763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 1773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 1783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 1793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 1803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 181f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 182f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 183f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 1843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 185dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 1863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void StartWiFi() { 1883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal wifi_->Start(); 1893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void StopWiFi() { 1913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal wifi_->Stop(); 1923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1933239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 1943239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 1953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 1963239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 1973239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 1983239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 1993239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 2003239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal EventDispatcher dispatcher_; 2013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 203dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 204f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 2052ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 2063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 2073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 2093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 2103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 2113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 212626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 2133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 2143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 2153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 216dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 217dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 218f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 219f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 2203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 2223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal TestProxyFactory proxy_factory_; 2233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 2243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kDeviceName[] = "wlan0"; 226626719f89881a949d8b5a8fa808beb924496489fChris Masoneconst char WiFiMainTest::kDeviceAddress[] = "00:01:02:03:04:05"; 2273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc"; 2283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure"; 2293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalvoid WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path, 2313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 2323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 2333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 2343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode) { 2353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 2363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 2383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 2393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 2403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 2413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 2423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 2433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 2443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal RemoveChars(bssid, ":", &bssid_nosep); 2453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 2463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 2483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 2493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 2503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal bss_properties["Signal"].writer().append_int16(signal_strength); 2513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal bss_properties["Mode"].writer().append_string(mode); 2523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal wifi_->BSSAdded(bss_path, bss_properties); 2533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 2563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 2573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL); 2583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 2613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL); 2623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 2633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) { 2653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 2663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 2673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 2683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 2693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 2713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 2723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_interface_proxy_, Scan(_)); 2733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2743239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 2763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) { 2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 2793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 2803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 2813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 2823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 2833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test thew fi.w1.wpa_supplicant1.InterfaceExists"))); 2843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 2853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_interface_proxy_, Scan(_)); 2863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2873239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 2893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 2913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks()); 2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_)); 2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 2953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 2973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc); 2993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure); 3013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure); 3033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure); 3053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc); 3063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_EQ(5, GetEndpointMap().size()); 3073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 3083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) { 3103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 3113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc); 3123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure); 3143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure); 3163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure); 3183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc); 3193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_EQ(3, GetEndpointMap().size()); 3203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ASSERT_TRUE(ContainsKey(GetEndpointMap(), "000000000000")); 3213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_EQ(4, GetEndpointMap().find("000000000000")->second-> 3223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal signal_strength()); 3233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 3243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 3263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 3273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc); 3283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure); 3303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 3313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure); 3323239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal EXPECT_CALL(*manager(), RegisterService(_)) 3333239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal .Times(3); 3343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 3353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_EQ(3, GetServiceMap().size()); 3363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 3373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) { 339dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal MockSupplicantInterfaceProxy &supplicant_interface_proxy = 340dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal *supplicant_interface_proxy_; 341dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal 3423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 3433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc); 3443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 3453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 3473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal InSequence s; 3483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Path fake_path("/fake/path"); 3493239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal WiFiService *service(GetServiceMap().begin()->second); 3503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 351dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_)) 3523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillOnce(Return(fake_path)); 353dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path)); 3543239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal InitiateConnect(service); 355f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal EXPECT_EQ(static_cast<Service *>(service), 356f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi()->selected_service_.get()); 3573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 3583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 3593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 360f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawalTEST_F(WiFiMainTest, LinkEvent) { 361f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal EXPECT_FALSE(IsLinkUp()); 362f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal EXPECT_CALL(dhcp_provider_, CreateConfig(_)). 363f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal WillOnce(Return(dhcp_config_)); 364f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal ReportLinkUp(); 365f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal} 366f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 367853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 368