wifi_unittest.cc revision 7de7e02e14074989757a4f9f220de2310cc05236
18a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal// Copyright (c) 2012 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 <linux/if.h> 85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h> // Needs typedefs from sys/socket.h. 95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h> 105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h> 11f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 12853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1660ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov#include <base/file_util.h> 177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h> 18dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h> 193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h> 204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov#include <base/string_split.h> 213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h> 225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <base/stringprintf.h> 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h> 257156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h> 262ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h> 27853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 28853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 318ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h" 327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov#include "shill/mock_dbus_manager.h" 37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 38c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h" 40f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h" 41e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 43cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 442ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 453426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 46bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h" 4710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 485c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h" 495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h" 50a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 51b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h" 52735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h" 533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h" 54835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h" 553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h" 565c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h" 573c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h" 587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h" 595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h" 60dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h" 62853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h" 645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h" 6585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h" 673239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h" 68ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h" 69853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 70ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 710e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 72853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 73853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 74853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 773c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 79a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 80cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 83b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 84549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 90dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 91d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 92853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 93ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 94ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 95a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 96a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 97a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 98853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1008ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 102853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 103853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 1105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 1125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 114853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 1153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 1163426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le : device_(new WiFi(control_interface(), 1173c5040174273386868cc8dea8044d22c465885d8Paul Stewart NULL, NULL, manager(), "wifi", "", 0)) { 118853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 1193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 120853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 121853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 1228abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 123853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 124853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 126de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty)); 127de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 128853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 129853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1306bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 131a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 132a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1336bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 134de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 135a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone flimflam::kBgscanSignalThresholdProperty, 136a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 137a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 138a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 139a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 140a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1416bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(), 1426bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal flimflam::kScanIntervalProperty, 1436bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kUint16V, 1446bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 145a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 146853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 147a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 148a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1496bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(), 1506bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal flimflam::kScanningProperty, 1516bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kBoolV, 1526bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 153bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise 1549d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 155a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 156853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1574d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1584d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1596bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 1604d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 1614d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal flimflam::kBgscanMethodProperty, 1624d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant( 1630654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodSimple), 1644d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1654d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1674d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1684d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1696bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty( 1704d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 1714d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal flimflam::kBgscanMethodProperty, 1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant("not a real scan method"), 1734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 1764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1774a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 1780654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 1798abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 1804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 1814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 1824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 183e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 184e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 185e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart flimflam::kBgscanMethodProperty, &method, &unused_error)); 1864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 1870654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 1888abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 1898abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal ::DBus::Error error; 1906bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 1918abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), 1928abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal flimflam::kBgscanMethodProperty, 1938abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal DBusAdaptor::StringToVariant( 1940654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodLearn), 1958abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 1960654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 197e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 198e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart flimflam::kBgscanMethodProperty, &method, &unused_error)); 1990654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 2008abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2018abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal EXPECT_TRUE(DBusAdaptor::ClearProperty( 2028abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), flimflam::kBgscanMethodProperty, &error)); 203e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 204e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart flimflam::kBgscanMethodProperty, &method, &unused_error)); 2054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 2064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 2078abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 2088abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2093c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 2103c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 2113c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 2123c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 2133c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 2143c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 2153c5040174273386868cc8dea8044d22c465885d8Paul Stewart 2165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 217e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 2183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 219bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie explicit WiFiObjectTest(EventDispatcher *dispatcher) 220e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 2216c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le metrics_(NULL), 222e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart manager_(&control_interface_, NULL, &metrics_, &glib_), 223e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 224626719f89881a949d8b5a8fa808beb924496489fChris Masone wifi_(new WiFi(&control_interface_, 225e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart dispatcher, 2263426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le &metrics_, 227626719f89881a949d8b5a8fa808beb924496489fChris Masone &manager_, 228626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceName, 229626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceAddress, 230626719f89881a949d8b5a8fa808beb924496489fChris Masone 0)), 2313c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 232dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 233b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal supplicant_bss_proxy_( 234b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal new NiceMock<MockSupplicantBSSProxy>()), 235f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal dhcp_config_(new MockDHCPConfig(&control_interface_, 236d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart kDeviceName)), 2372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov dbus_manager_(new NiceMock<MockDBusManager>()), 2380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 239735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 2403c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 2419413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart new NiceMock<MockSupplicantInterfaceProxy>()), 2422f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal proxy_factory_(this) { 2435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 2443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ::testing::DefaultValue< ::DBus::Path>::Set("/default/path"); 245c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 246d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)). 247c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal WillByDefault(Return(dhcp_config_)); 248c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ON_CALL(*dhcp_config_.get(), RequestIP()). 249c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal WillByDefault(Return(true)); 250835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)). 251835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart WillByDefault(InvokeWithoutArgs( 252835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart this, &WiFiObjectTest::CreateSupplicantNetworkProxy)); 253318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 254ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 255735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 256735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart manager_.dbus_manager_.reset(dbus_manager_); 257735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 2582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 2593c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 2605c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 261bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 2625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 2630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 2645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 2665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 2675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 2685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 2695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 2715c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2725c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 2733ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 2743ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 275d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 276ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = &proxy_factory_; 2775c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_; 2785c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 2793c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_)); 2802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber()); 281b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2825c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 2835c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2845c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 2853c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 2863c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL))); 2879a24553461df7036755060423f90804011612249Eric Shienbrood wifi_->SelectService(NULL); 288b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 289b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 290b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 291ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = NULL; 2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 2943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 2959a24553461df7036755060423f90804011612249Eric Shienbrood wifi_->Stop(NULL, ResultCallback()); 2965c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(NULL); 2973ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 2983ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 299d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 300f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 301f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 302549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 303549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 304549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart wifi_->SetEnabled(false); // Stop(NULL, ResultCallback()); 305549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 306549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 307c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // Needs to be public since it is called via Invoke(). 308c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley void ThrowDBusError() { 309c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley throw DBus::Error("SomeDBusType", "A handy message"); 310c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley } 31117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 31217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart SetPendingService(NULL); 31317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 314c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 3155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 3165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 3175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 3205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 3215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 3225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 3255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 3265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 3275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 3285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 3315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 3325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 3355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 3365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie std::set<uint16_t> available_frequencies; 3375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 3385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 3395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 3405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 3415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 3425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 3435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 3455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 347f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 348f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie NULL); 3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3577347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie void OnTriggerScanResponse(const Nl80211Message &message) { 3585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 3595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 361b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 362b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 363b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie const char *reason) { 364b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 365b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 366b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 3680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 3690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 3700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 3710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 3723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 3737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 3747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 3753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal class TestProxyFactory : public ProxyFactory { 3763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 377e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart explicit TestProxyFactory(WiFiObjectTest *test); 3783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy( 3801830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal const char */*dbus_path*/, const char */*dbus_addr*/) { 381dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal return test_->supplicant_process_proxy_.release(); 3823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 3833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy( 385196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart SupplicantEventDelegateInterface */*delegate*/, 3861830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal const DBus::Path &/*object_path*/, 3871830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal const char */*dbus_addr*/) { 388dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal return test_->supplicant_interface_proxy_.release(); 3893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 3903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 391b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MOCK_METHOD3(CreateSupplicantBSSProxy, 392b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal SupplicantBSSProxyInterface *( 393b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal WiFiEndpoint *wifi_endpoint, 394b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const DBus::Path &object_path, 395b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const char *dbus_addr)); 396b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 397835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart MOCK_METHOD2(CreateSupplicantNetworkProxy, 398835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart SupplicantNetworkProxyInterface *( 399835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart const DBus::Path &object_path, 400835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart const char *dbus_addr)); 401835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 4023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 403b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal( 404b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal WiFiEndpoint */*wifi_endpoint*/, 405b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const DBus::Path &/*object_path*/, 406b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const char */*dbus_addr*/) { 407b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return test_->supplicant_bss_proxy_.release(); 408b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 409b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 410e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiObjectTest *test_; 4113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal }; 4123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 4133c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Simulate the course of events when the last enpoint of a service is 4143c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 4153c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 416bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 417bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service) 418bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 419bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 420bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 421bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 422bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiEndpointConstRefPtr &endpoint) { 423bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 424bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 425bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 4263c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 4303c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 4313c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EndpointRemovalHandler *MakeEndpointRemovalHandler( 433bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiServiceRefPtr &service) { 4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 436b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 437b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 438b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char *mode, 4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *ssid, 4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *path, 4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *bssid) { 4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart *ssid = base::StringPrintf("ssid%d", bss_counter_); 4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart *path = base::StringPrintf("/interface/bss%d", bss_counter_); 4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_); 4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) { 4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart const string &ssid, const string &bssid, const string &mode) { 4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart &proxy_factory_, NULL, ssid, bssid, mode, 0, 0); 4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t> ssid, const std::string &security) { 4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart flimflam::kModeManaged, 4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string &security) { 4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength, 4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart uint16 frequency, 4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr *service_ptr) { 4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 4903c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path AddEndpointToService( 5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart uint16 frequency, 5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr) { 5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 5163c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, ::DBus::Variant> params; 5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->ConnectTo(service, params); 5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->DisconnectFrom(service); 5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectingService( 5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!network_path.empty()) { 5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)) 5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(network_path)); 5403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path(MakeNewEndpointAndService( 5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, &endpoint, &service)); 5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 5493c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 5513c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5523c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5533c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5543c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5553c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path; 5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 580bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 583a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 5840654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 5883c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 590b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 591b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 592b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 5935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void TriggerFullScan() { 5944823f4f186e31e9acaeaa694e2025440883f20fbWade Guthrie wifi_->Scan(Device::kFullScan, NULL, __func__); 595c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 5961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetCurrentService() { 5971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 5981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 599bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void SetCurrentService(const WiFiServiceRefPtr &service) { 600bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 601bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 6023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 603165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 6043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetPendingService() { 6061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 6071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 6082b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &GetPendingTimeout() { 6092b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 6102b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 6111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart const base::CancelableClosure &GetReconnectTimeoutCallback() { 612446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 613446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 6147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const string &GetSupplicantBSS() { 6157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 6167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void SetSupplicantBSS(const string &bss) { 6187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 6197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 6211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 6221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 623b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal const base::CancelableClosure &GetScanTimer() { 624b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 625b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 627e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 6283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 6293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 6303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 6313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6323c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() { 6338a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal return dynamic_cast<MockSupplicantInterfaceProxy *>( 6348a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 6353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6363c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 6373c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 6383c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 6393c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 6403c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() { 6413c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi(); 6423c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 6433c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 644835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() { 645835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return new NiceMock<MockSupplicantNetworkProxy>(); 646835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal const string &GetSupplicantState() { 6487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 6497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 650835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart void ClearCachedCredentials(const WiFiService *service) { 651835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 652835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6530427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) { 6540427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 6550427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 656381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan bool RemoveNetwork(const ::DBus::Path &network) { 657381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 658381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 659261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 6603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 6613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 6623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 6633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 664e41a72d0737488d561a4158019409d5785dad61bThieu Le uint16 frequency, 6653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 666c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 66779d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov wifi_->OnIPConfigUpdated(dhcp_config_, true); 668c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 669f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 670f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 671f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 672f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 673f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 674f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 675f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 676f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 677f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 6795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 6805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 6815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 6825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 6835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 6845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 686dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 6873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 6891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 6901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 6917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 6927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 6937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 6945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 6955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 6965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 6977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 6987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 6997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 7007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 7017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 7027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 703cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 705cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 706bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 707bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 709e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 710e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart return wifi_->GetScanInterval(NULL); 711e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 7122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 7132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->SetEnabled(true); // Start(NULL, ResultCallback()); 7153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 7172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 7182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7192f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 7202f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 7212f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7222f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 7232f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnBeforeSuspend(); 7242f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 7262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->OnSupplicantAppear(":1.7"); 7272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 7282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 7302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->OnSupplicantVanish(); 7312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 7322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 7342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 7352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 7374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 7384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 7394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 7404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov flimflam::kBgscanMethodProperty, 7414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 7424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 7434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 7444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 7454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 7464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 7474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 7484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 7494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 750bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 751bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 752bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 75310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 754db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 755db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 756db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 757db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 758e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 759e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 760e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 761e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 7621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 7631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 7641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 7651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 7661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 7671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 7681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 7691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 7703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 7713c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 7723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 7733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 774bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 7751369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 7761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 7771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 7781369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 7793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 7803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 7813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 7823c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 783bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetBgscanShortInterval(const uint16 &interval, Error *error) { 784bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 785bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 786bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 787bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetBgscanSignalThreshold(const int32 &threshold, Error *error) { 788bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 789bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 790bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 791df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 792df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 793df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 794df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 79510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 79610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 79710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 79810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 79985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 80085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 80185aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 80285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 8033239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 8043239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 8053239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 806d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 807d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 808d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 809d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 810d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 811d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 812d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 813d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 814d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 8153239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 8163239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 8173239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 8183239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 819b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal TestProxyFactory *proxy_factory() { 820b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 821b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 822b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 8233c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8263c5040174273386868cc8dea8044d22c465885d8Paul Stewart 827e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 8285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 8295c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 8305c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 8313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 8323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 833dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 8343426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 835f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 8362ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 837c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 8383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 8413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 8423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 8433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 8443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 8453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 846626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 8473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 8483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 849446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 850446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 8513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 852dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 853b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 854f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 855f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 856735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 857735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 858735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 859735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockDBusManager *dbus_manager_; 8600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 861735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 862bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 8633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 8643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 866835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart NiceMock<TestProxyFactory> proxy_factory_; 8673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 8683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 869e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 870e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 871e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 872e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 873446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 874446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 8753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 876e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 877b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 878261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 879261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 880e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 8813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 8823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 8833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 884e41a72d0737488d561a4158019409d5785dad61bThieu Le uint16 frequency, 8853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode) { 8863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 8873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 8883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 8893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 8903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 8913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 8923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 8933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 8943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 8953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal RemoveChars(bssid, ":", &bssid_nosep); 8963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 8973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 8983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 8993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 9003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9010654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 902e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 9030654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 904e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 9050654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 906b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSAddedTask(bss_path, bss_properties); 9073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 9083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 909e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test) 910b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal : test_(test) { 911b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber()); 912b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _)) 913b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal .WillByDefault( 914b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal))); 915b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 916b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 917e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 918e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 919e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 920e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 921e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 922e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 9239f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 9249f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 9259f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 9269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } else { 9279f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 9289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 9299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 9309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*adaptor_, EmitBoolChanged(_, _)).Times(AnyNumber()); 9319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 9329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 9339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, true)); 9349f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 9359f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 9369f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 9379f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 9389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 9399f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 9409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 9419f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 9429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 9439f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 9449f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 9459f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 9469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 9479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 9489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 9499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 9509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 9519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, false)); 9529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 9539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 9549f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 9559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 9569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 9579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 9589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 9599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 9609f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 9619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 9629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 963e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 964e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 965e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 9663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 9673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 9683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL); 9693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 9723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL); 9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9752b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 9762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 9772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 9782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 9792b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 9802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 9812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 9820654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*dbus_manager_, WatchName(WPASupplicant::kDBusAddr, _, _)); 9832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 9842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 9852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 9862b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 9872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 9889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 9899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 9909cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 9919cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 9929cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 9939cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 9942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 9952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 9962b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 9972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 9982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 9992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 10002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 10019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 10029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 10039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 10049cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 10059cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 10062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 10072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 10082b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 10092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 10102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 10112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 10122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 10132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 10142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 10152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 10162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 10172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 10182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 10192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 10202b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 10212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 10222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 10232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 10242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 10252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 10262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1027549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 10283c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 10293c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 10303c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 10313c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, NULL)); 1032549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1033549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1034c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1035549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1036549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1037549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 10383c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 10393c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 10403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 10413c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 10423c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 10433c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1044549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1045549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 1046549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_TRUE(GetCurrentService() == NULL); 1047549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1048549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 10495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 10505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 10513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 10523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 10533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 10543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 10553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 10563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 10573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1058b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 10593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 10603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 10613239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1062b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 10633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 10643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 10665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 10675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 10685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 10695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 10705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 10715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 10725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 10735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 10745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 10755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 10765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 10775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 10785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 10795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1080835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 10813c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1082835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 10833c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL)); 10843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1085835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart ClearCachedCredentials(service); 1086835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1087835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 10880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 10890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 10900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 10910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 10920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 10930427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 10940427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1095381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1096381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1097381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 10983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1099381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1100381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1101381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1102381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1103381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 11043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1105381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1106381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1107381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1108381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1109381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1110381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1111381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1112381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1113ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1114ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1115ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1116ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1117ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1118ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1119381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1120381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 11213c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1122381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1123381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1124381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1125381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1126381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1127381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1128381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1129381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1130381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1131381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 11323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1133381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1134381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1135381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1136381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1137381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1138381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1139381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1140381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 11415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 11425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 11433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 11443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 11453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 11463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 11473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 11493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 11503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 11513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11523239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 11533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 11543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 11565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 11575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 11585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 11595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 11605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 11615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 11625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 11635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 11645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 11655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 11665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 11673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 11683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 11693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 11703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 11723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 11745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 1175c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley StartWiFi(); 11763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 11773c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 11783c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 11793c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 1180c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetPendingService(service); 1181c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // If we're connecting, we ignore scan requests to stay on channel. 11823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1183c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 11845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 1185c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1186c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 11873c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 11883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 1189c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 11905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 1191c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1192c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 11933c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 1194c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 1195c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetPendingService(NULL); 1196c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 11973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1198c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 11995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 1200c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1201c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12023c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 1203c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 12043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 1205c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 12065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 1207c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1208c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12093c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 1210c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1211c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 12125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 12135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 12185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 12195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // If we're connecting, we ignore scan requests to stay on channel. 12205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 12215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 12225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 12235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 12245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 12275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 12285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 12295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 12305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 12315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 12345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 12355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(NULL); 12365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 12375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 12385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 12405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 12415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 12445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // But otherwise we'll honor the request. 12455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 12465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 1247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 12485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie TriggerFullScan(); 12495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 12525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 12535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 12545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 12555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12563c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1257ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1258ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 12593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12605c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1261ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1262ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 12632f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1264ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1265ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1266ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 12675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 12685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 12760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_TRUE(scan_session_ != NULL); 12770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 12780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 12815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 12825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 12835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1285ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1286ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 12873c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1288ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1289ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 12902f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1291ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1292ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1293ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 12995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 13005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 13015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 13025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 13035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 13065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 13075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 13083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1309ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1310ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 13113c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13123c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL)); 13133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 13143c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 13153ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 13160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1317ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 13182f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1319ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1320ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1321ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 13225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 13235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 13245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 13255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL)); 13285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 13295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 13305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 13310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 13325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1333df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 13345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 13355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 13383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 13393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 13403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1341e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 13423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1343e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 13443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1345e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 13463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1347e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 1348e41a72d0737488d561a4158019409d5785dad61bThieu Le const uint16 frequency = 2412; 1349e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1350e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1351e41a72d0737488d561a4158019409d5785dad61bThieu Le 1352e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 1353e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1354e41a72d0737488d561a4158019409d5785dad61bThieu Le 1355e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1356e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1357e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1358e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1359e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1360e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1361e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1362e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1363e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1364e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1365e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1366e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 13703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13713c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 13723c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 13733c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 13743c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 13753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 13763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 13773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 13783c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 13793c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 13803c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 13813c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 13823c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 13833c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 13843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 13853c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 13863c5040174273386868cc8dea8044d22c465885d8Paul Stewart 13873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 1388b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1389e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with SSIDs that start with NULL should be filtered. 1390e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 1391b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1392e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 1393e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 13948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 13958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 13968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 13978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 13983c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 13993c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 14003c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 14013c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 14023c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 14033c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 14043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 14053c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 14063c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 14078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 14083c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 1409261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1410261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1411261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 1412261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 14133c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 14143c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 14153c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 14163c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 14173c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 14183c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 14193c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 14203c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 14213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1423835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 1424835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 14253c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 14263c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 1427835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1428835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 14293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1430835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 14313c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14323c5040174273386868cc8dea8044d22c465885d8Paul Stewart 14333c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 14340654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1435835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1436835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 1437835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // with this service. 14383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 14393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 1440835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 1441835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1442835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 14430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 14440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 14453c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 14463c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 14473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 14483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 14493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 14500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 14513c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 14520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_TRUE(GetPendingService() == NULL); 14530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 14540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 14550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 14560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 14573c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 14583c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL)); 14593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 14603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetPendingService().get()); 14610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 14623c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 14633c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 14643c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 14653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 14663c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 14673c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService("/new/path", NULL, NULL)); 14683c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 14700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 14710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 14723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 14733c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 14740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 14753c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 14760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 14770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 14780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 14790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 14800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 14813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetPendingService().get()); 14822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 14830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 14840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 14850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 14863c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 14873c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 14883c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 14893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 14900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 14910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 14920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 14930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 14940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 1495835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1496835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 1497835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy(); 1498835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy( 14990654ece95920696c530ce1c0344365eb741f7efePaul Stewart kPath, WPASupplicant::kDBusAddr)) 1500835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart .WillOnce(Return(network_proxy)); 1501835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 1502735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 15040654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 15053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetCurrentService().get()); 15063c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 15080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 1509c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 15103c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 15113c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 15123c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 15133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 1514c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 15153c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1516c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 1517c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 1518c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 1519c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 1520c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_EQ(NULL, GetCurrentService().get()); 1521c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_EQ(NULL, wifi()->selected_service().get()); 1522c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 1523c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 15240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 15250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 15263c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL)); 15273c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL)); 15280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 15290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 15303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 15310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 15320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 15330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 15340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 15352b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 15362b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 15372b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 153817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 15390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopedMockLog log; 15400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 15410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 15420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 15439f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 154417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 154517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 15469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 15479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 154844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 154944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 155017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 155117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 155217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 155317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _)) 155417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 155517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 155617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 155717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(0); 155817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 15590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 156044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 156144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(AnyNumber()); 156244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).Times(AnyNumber()); 156344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 15640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 15650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 15660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 156717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 15680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 156917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart Mock::VerifyAndClearExpectations(service); 15700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 15710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 15720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 157317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 157417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 157517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 15762b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 15772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 15782b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 15793c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 15803c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 15812b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 15822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 158317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 158417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 15853c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _)); 158617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 158717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 158817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 158917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 15903c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 159117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(NULL, GetPendingService().get()); 15920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 15930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 15940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 15950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 15963c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service); 15983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 15990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 16000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 16010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 16033c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16043c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 16053c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 16063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 16070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 16080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 16090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 16100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 16113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 16120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 16133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetCurrentService().get()); 16140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 16150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16165c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 1617c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 16183c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 16193c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 16203c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL)); 16213c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 16223c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL); 16233c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 16253c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 16263c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 16273c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 16283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1629c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 1630b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 1631c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 16325c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 16335c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 1634549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, NULL)); 16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16423c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16433c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1645549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 1646549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_TRUE(GetCurrentService() == NULL); 1647549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1648549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 1649446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 16503c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16513c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 16523c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL)); 16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 16541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 16550654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 16561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 16570654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 16581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 16590654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 16601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 1661446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 16621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 16630654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 16641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 16653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 1669446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 1670446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 1671cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart 16725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 1673a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 16740654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 1675ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 1676ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 1677ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 1678ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 1679ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 1680ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 1681ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 1682ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 1683ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 1684ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 1685ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 16863c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 16910654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 16923c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 1693ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 1694ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 16955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 16965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 16973c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 16983c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 16993c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 17003c5040174273386868cc8dea8044d22c465885d8Paul Stewart 17013c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 17035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 17045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart 17085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 17095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 17105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 17115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 17125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 17135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 17145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 17155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 17165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 17175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 17185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17197347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 17207347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _)); 17215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 1722ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 17235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 17247347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _)); 17255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 17295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 17305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 17315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 17325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 17335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 17345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 17385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 17395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 17405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 17415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 17425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 17435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 17447347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 17457347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _)); 17463c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 17473c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 17485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 17495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 17507347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _)); 1751ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 1752ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 1753ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 1754fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 1755fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 1756fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1757fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 1758fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 17593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 17605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 1761fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 1762fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 1763fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 1764fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 1765fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 1766fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 1767fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 17685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 17695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 17705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 17715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 17725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 17749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 17757de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 17765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 17775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 17795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 17805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 17825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 17835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 17855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 1786df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1787df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 1788df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1789df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, false)); 17905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 17915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 17935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 17945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 17955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 17965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 17975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 17995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 18025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 18035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 18045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 18055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 180644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 180744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 180844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 180944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 18105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 18119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 18125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 18135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 1815b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 18165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 18177de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 18185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 18205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 18215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 18235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 18245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 18255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 18265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 18285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 18300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 18315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 18335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 18345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 18355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 18360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 18370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 18410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 18435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 18445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This should call |Scan| which posts |ScanTask| 18465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 18475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 18480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 18495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 18515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 18525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 18540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 18557de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 18560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 18570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 18617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 18627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 18637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 18647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 18657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 18660654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 18670654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 18687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 18697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 18707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 18717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 18727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 18737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 1874cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 18757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 18767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 18770654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 18787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 18797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 18807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 1881d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 18827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 18837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 18847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 18857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 18867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 1887d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 1888d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 18897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 18907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 1891cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 1892bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 1893bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 1894bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 18957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 18960654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 18970654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 18980654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 18997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 19007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 19017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 19023c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 19033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 19047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 19057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 1906a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 1907a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 1908a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 1909a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 1910a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 1911a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 1912a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 1913a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 1914a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 1915a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 1916a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 1917a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 1918a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 1919a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 1920a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 1921a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1922a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 1923a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 1924a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 1925a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 1926a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 1927a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 19280654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 19290654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 1930a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 1931a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 1932a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 1933a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 1934a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 1935a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 1936a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetPendingService(NULL); 1937a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 1938a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 1939a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 1940a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // level of supplciant debugging. 1941a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 19420654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 19430654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 1944a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 19450654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1946a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 1947a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 19481590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 19491590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 19503c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 19513c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 19523c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, NULL); 19531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 19543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)); 19553c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown)); 19560654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 19571590839e44a0e922d4763003a35dbd493509b705mukesh agrawal EXPECT_EQ(NULL, GetCurrentService().get()); 19581590839e44a0e922d4763003a35dbd493509b705mukesh agrawal EXPECT_EQ(NULL, GetPendingService().get()); 19591590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 19601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 19611590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 19621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 19633c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 19643c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 19653c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 19663c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 19673c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, NULL, &service1)); 19683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 19691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 1970c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 1971c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 1972c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 1973c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 19743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 19753c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 19763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 1977bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 1978a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 19790654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 19813c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service0); 19823c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1); 19831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 19841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 1985e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 1986e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 19870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 19880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 19890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 19903c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 19913c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 19923c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 19933c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 19943c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 19953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 19963c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 19984eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 19994eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 20008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 20018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 20023c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 20033c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 20043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 20058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20063c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 20073c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 20083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 20093c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetCurrentService().get()); 20108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 20118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 20128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 20138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 20148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 20153c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20163c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 20178a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 20188a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 20198a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 20204a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 20210654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 20220654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 20234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 20244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 20254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 20264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 20273c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 20283c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service); 20293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 20300654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 20314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 20324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 20334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 20344a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 20354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service); 20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 20394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 20404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 20414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 20424a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 20434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 20454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 20464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 20474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 20483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 20493c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 20503c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 20510654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 20524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 20534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 20544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 20554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 20594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 20604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 20614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 20620654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 20634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 20644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 20654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 20664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 20674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 20684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 20694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 20704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 20714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 20724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 20730654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 20744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 20753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 20763c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 20773c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 20784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 20794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 20804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 20810654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 20824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 20834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 20844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 20854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 20864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 20874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 20884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 20895c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 20905c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 20910654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 20925c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 20945c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 20953c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 20965c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 20975c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 20985c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 20990654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 21005c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 21015c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 21024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 21034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2104c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2105c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 21063c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 2108c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2109c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2110c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2111c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2112c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2113c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 2114c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal Mock::VerifyAndClearExpectations(service); 2115c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2116c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2117c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2118c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL)); 21218f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2122c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 21238f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 21248f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 21250654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 21265519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 21273c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 21293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 2130ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhu string portal_url; 2131ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhu EXPECT_CALL(*manager(), GetPortalCheckURL()).WillOnce(ReturnRef(portal_url)); 21328f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 21338f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 21345519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 21355519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 21363c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 21383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 21390654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2140c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2141c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2142b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2143b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2144b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2145b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2146b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2147b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 2148b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2149b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2150b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2151b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2152b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2153b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2154b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 2155b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 2156b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 2157b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 2158b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 21593c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL)); 21613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 21623c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 21633c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2164b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 2165b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 2166b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 2167b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2168b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 21695c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 21705c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 21715c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 21725c05b2920be742d518829972127172481722058dmukesh agrawal 21735c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 21745c05b2920be742d518829972127172481722058dmukesh agrawal 21755c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 21765c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 21775c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 21783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 21795c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 21802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 21815c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 21825c05b2920be742d518829972127172481722058dmukesh agrawal} 21835c05b2920be742d518829972127172481722058dmukesh agrawal 21845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 21855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 2186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2187b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2188b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2189b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 21927de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 21930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 2195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2197b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 22005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 22015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 22025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 22045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 22055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 22060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 22085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 22095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 22125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2214b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 2215b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2216b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2217b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2218b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2219b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2220b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 2221b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 2222b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2224b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2225b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2226b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2227b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2228b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2229b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 2230b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2231b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 22323c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 22333c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL); 2234b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2235b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2236b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2237b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 22385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2239b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2240b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2241b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2242b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2243b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2244b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 2245b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2246b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2247b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2248b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2249bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal SetScanInterval(1, NULL); 2250b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2251b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2252b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2253b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 2254b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2255b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2256b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2257b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2258b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2259b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2260b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2261b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2262b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 2263b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2264b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2265b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2266bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal SetScanInterval(0, NULL); 2267b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2268b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2269b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 22705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 22715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetupConnectedService(DBus::Path(), NULL, NULL); 22755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 22765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 22775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 22785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 22805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 22815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 22825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2286b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 2287b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2288b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 22895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 22903c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 2291df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 22923c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 22933c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 22943c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 22953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 22963c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 22975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 22980654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2299b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2300b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2301b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2302b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 2303b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2304b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 23053c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 2306b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2307df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 23083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 23093c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 23100654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2311b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2312b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2313b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 23143c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 23153c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart StartWiFi(); 23163c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 23173c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 23183c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>(); 23193c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 23203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 23213c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 23223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 23233c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 23243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 23253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0); 23263c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 23273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 23283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("Called Reassociate()."))).Times(1); 23293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1); 23303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 23313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnSupplicantVanish(); 23323c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 23333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0); 23343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 23353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("Cannot reassociate."))).Times(1); 23363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 23373c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 23383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 2339cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 23403c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 2341bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 2342bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 2343cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2344cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2345bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 23463c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa); 23470654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2348bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2349bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 2350bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 2351bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 23521369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2353bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 23541369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 2355cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2356cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2357f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 2358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 2359f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 2360f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWep); 2361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 2362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 2363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2364f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 2365f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 2366f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 2367f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2368f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2369f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2370f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 2371f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 2372f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2373f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2374f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2375f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2376f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 2377f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2378f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2379f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 2380f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 2381f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 2382f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 2383f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2384f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2385f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 2386f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 2387f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2388f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2389f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 2390f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 2391f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2392f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _)); 2393f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2394f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2395f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2396f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 2397f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 2398f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2399f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 2400f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _)); 2401f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2402f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2403f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2404f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 2405f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 2406f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2407f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 2408f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 2409f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart DisconnectWithFailure(Service::kFailureBadPassphrase, _)); 2410f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2411f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 2412f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 24131369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 24143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x); 2415735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2416735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2417735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 2418735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2419735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2420bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 2421bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 2422bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2423bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2424bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 24251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2426bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 24271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 2428bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2429bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2430bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 2431bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 2432bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2433bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2434bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2435bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 2436bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 24371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 24381369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 24391369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 2440cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa); 2441cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 24420654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2443cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2444bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2445f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 244656e322015a6955035bae144917190c9eccbd90c6mukesh agrawal EXPECT_CALL(*service, SetFailureSilent(_)).Times(0); 244756e322015a6955035bae144917190c9eccbd90c6mukesh agrawal EXPECT_CALL(*service, SetState(_)).Times(0); 2448735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2449cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 24501369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 24511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EndsWith(flimflam::kErrorBadPassphrase))); 24520654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 24531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 24541369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 24551369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 24561369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x); 24571369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 24581369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 2459735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2460735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 24611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(*service, SetFailureSilent(_)).Times(0); 24621369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(0); 2463735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 2464735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 2465735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 2466735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2467735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2468bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2469735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 24701369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 24711369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EndsWith(shill::kErrorEapAuthenticationFailed))); 2472735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 24730654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2474cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2475cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 2477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 24781aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 2479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 24801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 2481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 2483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 2484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 2486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 2487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 24881aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 2489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 2490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 2491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 2492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2493e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 2494e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 2495e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 2496e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 2497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 2498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 2499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 2500e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 2501e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 2502e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 2503e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2504e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2505e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 2506e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 2507e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2508e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 2509e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2510e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 2511e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 2512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 2513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2514e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 2515e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 2516e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 2517e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 2518e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 2519e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 25201aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 2521e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // This PostTask is a result of the call to Scan(NULL), and is meant to 2522e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 2523e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 2524e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2525e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2526e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 2527e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 2528e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2529e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 2530e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2531e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 2532e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2533e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2534e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 2535e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 2536e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2537e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 2538e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 2539e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 25401aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 25411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 25421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 25443c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 25451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 25461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 25471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 25481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 25491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 25501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 25511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 25521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 25531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 25541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 25551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 25561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 25571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 25581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 25591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 25601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 25611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 25621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 25631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 25641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 25651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 25661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 25671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 25681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 25697cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 25707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 25717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 25727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 25737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 25747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 25757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 25767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 25777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 25787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 25797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 25807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _)).Times(0); 25817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 25827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 25837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 25847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 25857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 25867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(NULL); 25877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 25887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 25897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // current_service_ is not connnected. 25907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 25917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 25927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 25937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 25947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 25957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 25967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 25977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 25987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 25997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 26007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 26017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 26027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 26037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 26047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 26057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 26067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 26077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _)); 26087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 26097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 26107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 26117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 26127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 26137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 26147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 26157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 26167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 26177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 26187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 26197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 26207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 26217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 26227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 26237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 26247cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 26257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 26267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 26277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 26287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const int16_t kSignalValue = -20; 26297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 26307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 26317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 26327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 26337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 26347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 26357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 26367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 26377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 26387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 2639bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 2640bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x); 2641bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 2642bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2643bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 2644bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 2645bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 2646bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2647bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 2648bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2649bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 2650bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 2651bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2652bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 2653bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2654bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const uint32 kDepth = 123; 26550654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 2656bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2657bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 2658bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 2659bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2660bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 2661bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2662bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 26630654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 2664bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 2665bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 2666bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2667db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 2668db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 2669db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 2670db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 2671db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 2672735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 2673735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 2674735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 2675735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 2676db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 2677db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2678db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 2679735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x); 2680db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 2681735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 2682db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 2683735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 2684735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(service); 2685735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 2686db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 2687735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 2688735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 2689735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 2690735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _)); 2691735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 2692bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 2693bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2694c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 2695c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 2696c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 2697c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 2698c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 2699c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 2700c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 2701c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 2702c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 2703c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 2704c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 2705c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 270660ceaf336297ce536201a82e350c697f1a5b546dDarin PetkovTEST_F(WiFiMainTest, VerifyPaths) { 2707196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart string path(WPASupplicant::kSupplicantConfPath); 270860ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov TrimString(path, FilePath::kSeparators, &path); 270960ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path))); 271060ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov} 271160ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov 27126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 27136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 27146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 27156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 27166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 27176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah uint16 frequency; 27186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 27196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 27206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 27216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 27226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 27236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 27246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 27256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 27266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 27276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 27286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 27296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 27306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 27316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 27326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 27336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 27346d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 27356d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 27366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 27376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 27386d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 27396d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 27406d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 27416d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 27426d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 27436d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 27446d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 27456d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 27466d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 27476d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 27487347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 27497347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 27506d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 27515581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 27525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 27535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 27545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 27555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 27565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 27575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 27585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 27595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 27605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 27615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 27625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27630654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 27645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 27655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 27665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 27675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 27685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 27695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 27705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27710654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 27720654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 27730654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 27740654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 27750654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 27760654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 27770654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 27780654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 27795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 27805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 27815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 27825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 27835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 27845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 27855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 27865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 27875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 27885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 27895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 27905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 27915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 27925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27930654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 27940654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 27955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 27965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 27975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 27985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 27995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 28005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 28015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 28020654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 28030654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 28045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 28055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 28065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 28075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 28085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 28095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 28105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 28110654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 28120654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 28135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 28145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 28155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 28165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 28175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 28185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 28195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 28205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 28215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 28225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 28235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 28245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 282550cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 282650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 282750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 282850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 282950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 2830bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 2831bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 2832bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 2833bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 2834bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 2835bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 2836bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const uint16 kKnownScanInterval = 4; 2837bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 2838bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 2839bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 2840bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 2841bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 2842bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 2843bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 2844bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 2845bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 2846bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 2847bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 2848bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const int32 kKnownSignalThreshold = 4; 2849bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 2850bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 2851bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 2852bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 2853bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 2854bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 2855bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 2856bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 2857bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 2858bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 2859bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 2860bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 2861bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 2862bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 2863bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 2864bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 28650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 28660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28670cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 28680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopedMockLog log; 28690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 28700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 28710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 28730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 28749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 28750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 28760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 28770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, false)); 28787de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 28790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 28800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 28810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 28830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 28840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 28850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28860cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 28870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopedMockLog log; 28880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 28890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 28900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 28920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 28930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 28949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 28959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 28969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 28970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 28990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 29000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 29010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 29020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 29030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 29040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 29050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 29060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 29070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 29080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 29090cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 29109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 29110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 29120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 29130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 29149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 29150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 29160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 29179f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 29189f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 29190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 29200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 29210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 29220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 29230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 292444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 29250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 29260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 29270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 29280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 29290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 29300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 29310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 2932df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 29339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 2934df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 29359f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 29369f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 2937df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2938df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 29399f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 2940df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2941df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 2942df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*service, 2943df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 2944df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2945df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 2946df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 2947df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 2948df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2949df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).Times(2); 2950df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 2951df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 2952df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2953df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2954df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 2955df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2956b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 2957b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 2958b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 2959df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 2960b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 2961b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 2962df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2963df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 2964df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 2965df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2966df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 2967b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 2968b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 2969b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 2970b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 2971df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 2972df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 2973df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 2974df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 2975df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2976df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 2977df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 2978df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 2979df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 2980df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 2981df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2982df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 2983df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Test for SetPendingService(NULL), condition a) 2984df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 29859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 2986df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2987df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 2988df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 2989df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), NULL, NULL)); 2990df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 2991df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 2992df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 29939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 2994df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2995df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 2996df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2997df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2998df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 2999df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 3000df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 3001df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), NULL, NULL)); 3002df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3003df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3004df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 3005df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(NULL, GetCurrentService().get()); 3006df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3007df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3008df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3009df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 30109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3011df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3012df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 3013df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 3014df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 3015df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 3016df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 3017df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3018df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3019df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3020df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 3021df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 3022df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3023df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 3024df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3025df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3026df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 3027df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Test for SetPendingService(NULL), condition d) Disconnect while scanning. 3028df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 30299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3030df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3031df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 3032df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 3033df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone); 3034df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 3035df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3036df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3037df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 3038df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3039df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3040df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3041df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3042df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3043df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3044df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3045df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 3046df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie NiceScopedMockLog log; 3047df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3048df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 3049df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 3050df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 3051df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 3052df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 3053df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanIdle, WiFi::kScanMethodNone, __func__); 3054df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3055df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 3056df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3057df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 3058df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 3059df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3060df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3061df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3062df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 3063df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3064df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 3065df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 3066df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 3067df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3068df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 3069df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 3070df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 3071df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3072df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3073df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3074df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3075df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 30763bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 30773bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 30783bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 30793bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 30803bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 30813bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 30823bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart TriggerFullScan(); 30833bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 30843bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 30853bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 30863bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 30877de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 30883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 30893bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 30903bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 30913bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 3092853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 3093