wifi_unittest.cc revision ef76af866aa73abb8c16958844cb13f042881bcb
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 1611c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h> 177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h> 18a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h> 19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h> 20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h> 21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 22853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 231830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h> 24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 26125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h" 2726b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 298ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h" 30a6270fd8fa1bd88a802595d91d80de86081847beSamuel Tan#include "shill/ip_address.h" 31397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.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" 36084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.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" 4111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 42e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 43687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h" 443c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 45cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/mock_mac80211_monitor.h" 472ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 483426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 49bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h" 5010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 51af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h" 525c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h" 535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h" 54a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 55b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h" 56735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h" 573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h" 58835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h" 593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h" 605c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h" 613c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h" 627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h" 635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h" 64dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/nl80211_attribute.h" 665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h" 67853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h" 6985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 70af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h" 715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan#include "shill/wake_on_wifi.h" 723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h" 733239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h" 74ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h" 75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 760e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 77a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf; 78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set; 80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 81ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr; 82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 853c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 87a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 88cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 91b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 92549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 98dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 99d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 10011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref; 101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 102af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew; 103ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 104ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 106a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 108853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 1093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1108ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 111853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 112853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 120c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234; 121125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhuconst char kSupplicantNameOwner[] = "9999"; 1225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 1245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 126853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 1273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 1280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan : metrics_(nullptr), 1293946da840142cd386d628c0e879459f8976bd86dmukesh agrawal device_( 1303946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new WiFi(control_interface(), dispatcher(), &metrics_, 1313946da840142cd386d628c0e879459f8976bd86dmukesh agrawal manager(), "wifi", "", kInterfaceIndex)) { 132853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 1333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 134853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 135853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 1363946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMetrics metrics_; 1378abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 138853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 139853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 141f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_TRUE(device_->store().Contains(kNameProperty)); 142de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 143853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 144853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1456bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 146a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 147a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 149de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 150f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanSignalThresholdProperty, 151a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 152a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 153a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 154a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 155a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1566bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(), 157f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanIntervalProperty, 1586bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kUint16V, 1596bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 160a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 161853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 162a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 163a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1646bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(), 165f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanningProperty, 1666bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kBoolV, 1676bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 168bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise 1699d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 170a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 171853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1746bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 1754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 176f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 1774d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant( 1780654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodSimple), 1794d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1804d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1814d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1824d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1846bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty( 1854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 186f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 1874d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant("not a real scan method"), 1884d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1894d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1904d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 1914d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1924a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 1930654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 1948abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 1954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 1964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 1974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 198e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 199e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 200f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 2020654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 2038abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2048abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal ::DBus::Error error; 2056bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 2068abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), 207f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 208f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn), 2098abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 2100654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 211e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 212f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2130654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 2148abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2158abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal EXPECT_TRUE(DBusAdaptor::ClearProperty( 216f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan device_->mutable_store(), kBgscanMethodProperty, &error)); 217e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 218f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 2204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 2218abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 2228abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2233c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 2243c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 2253c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 2263c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 2273c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 2283c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 2293c5040174273386868cc8dea8044d22c465885d8Paul Stewart 2305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 231e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 2323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 233bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie explicit WiFiObjectTest(EventDispatcher *dispatcher) 234e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 2350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan metrics_(nullptr), 2360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan manager_(&control_interface_, nullptr, &metrics_, &glib_), 237e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 238626719f89881a949d8b5a8fa808beb924496489fChris Masone wifi_(new WiFi(&control_interface_, 239e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart dispatcher, 2403426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le &metrics_, 241626719f89881a949d8b5a8fa808beb924496489fChris Masone &manager_, 242626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceName, 243626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceAddress, 244c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kInterfaceIndex)), 2453c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 2463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal mac80211_monitor_( 2473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new StrictMock<MockMac80211Monitor>( 2483946da840142cd386d628c0e879459f8976bd86dmukesh agrawal dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold, 2493946da840142cd386d628c0e879459f8976bd86dmukesh agrawal base::Closure(), &metrics_)), 250084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_service_proxy_(new MockDBusServiceProxy()), 251dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 252af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()), 253af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)), 254084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_(new DBusManager()), 2550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 256735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 2573c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 258af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new NiceMock<MockSupplicantInterfaceProxy>()) { 2593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->mac80211_monitor_.reset(mac80211_monitor_); 2605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 261e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan ::testing::DefaultValue<::DBus::Path>::Set("/default/path"); 262c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_)) 2643946da840142cd386d628c0e879459f8976bd86dmukesh agrawal .Times(AnyNumber()); 2653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 266b108318d9554032feee1249d51c961e4f90f4561Paul Stewart ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)) 267af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(Return(dhcp_config_)); 268af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true)); 269af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan 270af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateDBusServiceProxy()) 271af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_)); 272af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _)) 273af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_)); 274af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _)) 275af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_)); 276af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _)) 277af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_)); 278af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)) 279af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnNew<NiceMock<MockSupplicantNetworkProxy>>()); 280318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 281ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 282735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 283735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart manager_.dbus_manager_.reset(dbus_manager_); 284735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 2852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 2863c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 2875c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 288bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 2895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 2900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 2915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 2935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 2945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 2955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 2965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 2973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 2985c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2995c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 3003ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 3013ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 302d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 303084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->proxy_factory_ = &proxy_factory_; 304ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = &proxy_factory_; 3055c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_; 3065c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 3073c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_)); 3082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber()); 309b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 3105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 3115c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 3125c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 3133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 3140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillRepeatedly(Return(nullptr)); 3150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SelectService(nullptr); 316b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 317b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 318b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 3193946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 3200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->proxy_factory_ = nullptr; 3213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 3223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 3233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 3240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Stop(nullptr, ResultCallback()); 3250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->set_dhcp_provider(nullptr); 326084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Stop(); 3270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan dbus_manager_->proxy_factory_ = nullptr; 3283ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 3293ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 330d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 331f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 332f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 333549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 334549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 3353946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 3360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(false); // Stop(nullptr, ResultCallback()); 337549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 338549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 339c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // Needs to be public since it is called via Invoke(). 340c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley void ThrowDBusError() { 341c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley throw DBus::Error("SomeDBusType", "A handy message"); 342c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley } 34317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 3440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 34517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 346c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 3475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 3485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 3575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 3585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 3595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 3635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 3645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 3675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 3685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<uint16_t> available_frequencies; 3695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 3705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 3715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 3725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 3735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 3745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 3755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 3775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 379f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 3800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr); 3815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 3825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 3855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 3865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 3875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3897347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie void OnTriggerScanResponse(const Nl80211Message &message) { 3905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 3915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 393b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 394b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 395b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie const char *reason) { 396b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 397b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 398b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 4000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 4010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 4020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 4030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 4047fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetRoamThresholdMember(uint16_t threshold) { 405227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie wifi_->roam_threshold_db_ = threshold; 406227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 407227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 4087fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetRoamThreshold(uint16_t threshold) { 409227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->SetRoamThreshold(threshold, nullptr); 410227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 411227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 4127fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t GetRoamThreshold() const { 413227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->GetRoamThreshold(nullptr); 414227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 415227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 4163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 4177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 4187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 4192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Simulate the course of events when the last endpoint of a service is 4203c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 4213c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 422bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 423bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service) 424bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 425bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 426bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 427bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 428bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiEndpointConstRefPtr &endpoint) { 429bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 430bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 431bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4333c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 4373c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EndpointRemovalHandler *MakeEndpointRemovalHandler( 439bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiServiceRefPtr &service) { 4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 442b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 443b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 444b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char *mode, 4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *ssid, 4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *path, 4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *bssid) { 4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 456a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *ssid = StringPrintf("ssid%d", bss_counter_); 4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 458a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *path = StringPrintf("/interface/bss%d", bss_counter_); 459a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_); 4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) { 4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart const string &ssid, const string &bssid, const string &mode) { 4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 4710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0); 4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t> ssid, const std::string &security) { 4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 482f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kModeManaged, 4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string &security) { 4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength, 4907fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr *service_ptr) { 4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path AddEndpointToService( 5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 5167fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr) { 5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 533a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart wifi_->ConnectTo(service); 5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->DisconnectFrom(service); 5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 538d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein void InitiateDisconnectIfActive(WiFiServiceRefPtr service) { 539d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein wifi_->DisconnectFromIfActive(service); 540d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein } 5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectingService( 5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path(MakeNewEndpointAndService( 5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, &endpoint, &service)); 549a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart if (!network_path.empty()) { 550a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 551a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)) 552a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart .WillOnce(Return(network_path)); 5538e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 5548e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetHT40Enable(network_path, true)); 555a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 556a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path; 5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5833c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5883c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 590bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 591b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 5923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 593a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 5940654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 5953c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 5983c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 600d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 601b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 602b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 603b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 6052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 6060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kFullScan, nullptr, __func__); 6072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 6080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kProgressiveScan, nullptr, __func__); 6092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 610c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 6111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetCurrentService() { 6121590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 6131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 614bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void SetCurrentService(const WiFiServiceRefPtr &service) { 615bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 616bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 6173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 618165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 6193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetPendingService() { 6211590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 6221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 6232b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &GetPendingTimeout() { 6242b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 6252b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 6261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart const base::CancelableClosure &GetReconnectTimeoutCallback() { 627446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 628446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 6292ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal const ServiceRefPtr &GetSelectedService() { 6302ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal return wifi_->selected_service(); 6312ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal } 6327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const string &GetSupplicantBSS() { 6337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 6347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void SetSupplicantBSS(const string &bss) { 6367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 6377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 6391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 6401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal const base::CancelableClosure &GetScanTimer() { 642b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 643b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 645e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 6463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 6483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 6493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6503c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() { 6518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal return dynamic_cast<MockSupplicantInterfaceProxy *>( 6528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 6533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 6553c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 6563c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 6573c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() { 6593c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi(); 6603c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 6613c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 6627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal const string &GetSupplicantState() { 6637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 6647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 665835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart void ClearCachedCredentials(const WiFiService *service) { 666835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 667835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6680427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) { 6690427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 6700427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 671381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan bool RemoveNetwork(const ::DBus::Path &network) { 672381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 673381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 674261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 6753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 6763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 6773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 6797fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 6803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 681c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 682c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart wifi_->OnIPConfigUpdated(dhcp_config_); 683c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 684f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 685f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 686f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 687f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 688f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 689f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 690f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 691f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 692f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 6933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 701dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 7023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 7041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 7051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 7067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 7077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 7087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 7095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 7105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 7115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 7127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 7137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 7147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 7157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 7167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 7177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 718baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 7190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 720baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 721cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 722df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 723cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 72411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 72511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const WiFiServiceRefPtr &service, const string &rpcid) { 72611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 72711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 728bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 729bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 731e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 7320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 733e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 7342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 735a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 736a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 737a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 738a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 739a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 740a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 741a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 742a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 743a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 745a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 746a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 747a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 7485412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 749a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 750125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu StringCallback supplicant_name_owner_callback; 751125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 752125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu EXPECT_CALL(*dbus_service_proxy_.get(), 753125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu GetNameOwner(WPASupplicant::kDBusAddr, _, _, _)) 754125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated), 755125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu SaveArg<2>(&supplicant_name_owner_callback))); 756125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu 757084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Start(); 7582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 7590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 760125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 761125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu // Mimick the callback from |dbus_service_proxy_->GetNameOwner|. 762125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error()); 7633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 7652b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 7662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7672f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 7682f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 7692f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 771fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ResultCallback callback( 772fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 773fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->OnBeforeSuspend(callback); 7742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 776084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7"); 7772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 7782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 780084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr); 7812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 7822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 7842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 7852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 786687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 787687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 788687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 789687350531096cacc379c209e39e63e5316eee5c0Paul Stewart void SetIPConfig(const IPConfigRefPtr &ipconfig) { 790687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 791687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 7924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 7934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 7944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 7954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 796f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 7974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 7984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 7994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 8014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 8024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 8034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 8044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 806bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 807bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 808bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 80910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 810db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 811db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 812db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 813db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 814e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 815e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 816e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 817e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 8181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 8191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 8201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 8231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 8241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8263c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 8273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 8283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 830bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 8311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 8321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 8331369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 8341369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 8353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 8363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 8373c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 8398e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu void OnUnreliableLink() { 8408e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu wifi_->OnUnreliableLink(); 8418e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu } 8428e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 8437fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanShortInterval(const uint16_t &interval, Error *error) { 844bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 845bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 846bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 8477fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) { 848bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 849bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 850bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 851df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 852df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 853df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 854df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 855df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 856df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 857df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 858df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 859df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 860df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 861df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 862df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 863df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 864df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 865df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 866df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 867c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 868c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 869c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 870c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 871c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 872c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 873df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 874df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 875df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 876df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 8773946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void OnNewWiphy(const Nl80211Message &new_wiphy_message) { 8783946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 8793946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 8803946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 88110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 88210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 88310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 88410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 88585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 88685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 88785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 88885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 8893239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 8903239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 8913239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 892d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 893d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 894d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 895d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 896d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 897d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 898d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 899d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 900d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 9013239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 9023239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 9033239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 9043239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 905af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory *proxy_factory() { 906b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 907b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 908b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 9103c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 9113c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9133946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor() { 9143946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 9153946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 9163946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 917397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddressStore *GetWakeOnPacketConnections() { 918397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan return &wifi_->wake_on_packet_connections_; 919397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 920397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 921fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan int GetNumSetWakeOnPacketRetries() { 922fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan return wifi_->num_set_wake_on_packet_retries_; 923fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan } 924fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 925fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan void SetNumSetWakeOnPacketRetries(int num_retries) { 926fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->num_set_wake_on_packet_retries_ = num_retries; 927397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 928397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 9295f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggers() { 9305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan return &wifi_->wake_on_wifi_triggers_; 9315f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan } 9325f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 9339c73d221484fbd719072261ff288373ce866693fSamuel Tan set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggersSupported() { 9349c73d221484fbd719072261ff288373ce866693fSamuel Tan return &wifi_->wake_on_wifi_triggers_supported_; 9359c73d221484fbd719072261ff288373ce866693fSamuel Tan } 9369c73d221484fbd719072261ff288373ce866693fSamuel Tan 9379c73d221484fbd719072261ff288373ce866693fSamuel Tan size_t *GetWakeOnWiFiMaxPatterns() { 9389c73d221484fbd719072261ff288373ce866693fSamuel Tan return &wifi_->wake_on_wifi_max_patterns_; 9399c73d221484fbd719072261ff288373ce866693fSamuel Tan } 9409c73d221484fbd719072261ff288373ce866693fSamuel Tan 941397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void AddWakeOnPacketConnection(const IPAddress &ip_endpoint, Error *error) { 942397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->AddWakeOnPacketConnection(ip_endpoint, error); 943397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 944397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 945397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RemoveWakeOnPacketConnection(const IPAddress &ip_endpoint, 946397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan Error *error) { 947397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->RemoveWakeOnPacketConnection(ip_endpoint, error); 948397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 949397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 950397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RemoveAllWakeOnPacketConnections(Error *error) { 951397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->RemoveAllWakeOnPacketConnections(error); 952397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 953397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 954397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RequestWakeOnPacketSettings() { wifi_->RequestWakeOnPacketSettings(); } 955397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 9565f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan void VerifyWakeOnWiFiSettings(const Nl80211Message &nl80211_message) { 9575f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan wifi_->VerifyWakeOnWiFiSettings(nl80211_message); 958397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 959397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 9605f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan void ApplyWakeOnWiFiSettings() { 9615f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan wifi_->ApplyWakeOnWiFiSettings(); 962397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 963397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 964fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan void RetryApplyWakeOnWiFiSettings() { 965fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->RetryApplyWakeOnWiFiSettings(); 966397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 967397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 968fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan void SetSuspendActionsDoneCallback() { 969fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->suspend_actions_done_callback_ = 970fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)); 971fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan } 972fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 973fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan bool SuspendActionsCallbackIsNull() { 974fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan return wifi_->suspend_actions_done_callback_.is_null(); 975fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan } 976fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 977fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan MOCK_METHOD1(SuspendCallback, void(const Error &error)); 978fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 979e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 9805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 9815c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 9825c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 9833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 985dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 9863426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 987f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 9882ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 989c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 9903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 9913c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 9923c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 9933946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor_; // Owned by |wifi_|. 9943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 9963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 9973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 9983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 999626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 10003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 10013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 1002446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 1003446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 10047fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 10053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1006ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockDBusServiceProxy> dbus_service_proxy_; 1007ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 1008ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 1009f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 1010f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 1011084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan DBusManager *dbus_manager_; 1012735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 1013735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 1014735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 10150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 1016735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 1017bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 10183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1020ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 1021af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1025e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1026e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1027e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1028446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1029446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 10307fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 10313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1032e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 1033b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1034261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1035261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1036e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 10373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 10383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 10393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 10407fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode) { 10423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 10433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 10463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 10473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 10503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1051a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 10523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 10533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 10553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 10563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10570654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 1058e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 10590654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 1060e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 10610654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 1062b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSAddedTask(bss_path, bss_properties); 10633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 10643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1065e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1066e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1067e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1068e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1069e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1070e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1071a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1072a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1073a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1074a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 10752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1076a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1077a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 10789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 10799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 10809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1083f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1084a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 10852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 10862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 10872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 10889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 10899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 10949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 10959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 10969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 10979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 10989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 10999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 11009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 11019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 11029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 11039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 11049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 11059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 11089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 11099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 11109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 11119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 11129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 11139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 11149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 11159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 11169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 11172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 11192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 11222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 11232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 11252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1126f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1134f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1142a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1143a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1144a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1145a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1146a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1147a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1148a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1149a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1150a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1151a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1152a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1153a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1154a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1155a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1156a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1157a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1158e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1159e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1160e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 11613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 11620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 11643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 11670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 11683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 11693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11702b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 11712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1174227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1175227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1176227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1177227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1178227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1179227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1180227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1181227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1184227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1185227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1186227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1187227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1188227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1189227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1190227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1191227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1192227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11932b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 11940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 11970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1199227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1200227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1201227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1202227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1203227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1204227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1205227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1206227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 12072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 12099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 12109cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 12119cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 12129cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 12139cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 12149cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 12152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12172b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 12180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12229cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 12239cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 12249cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 12259cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12269cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 12272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12292b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 12300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 12330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 12342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 12372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 12382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12412b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 12422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12452b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1248549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 12493c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 12503c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 12513c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 12520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 1253549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1254549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1255c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1256549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1257549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1258549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1259ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 12603c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 12613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 12623c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 12633c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1265549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1266549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 12670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1268549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1269549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 12753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 12763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 12773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 12783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1279b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 12803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 12813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 12823239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1283b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 12843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 12853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 12865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 12875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 12905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 12915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 12925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 12935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 12995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1301835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1303835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 13040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1306835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart ClearCachedCredentials(service); 1307835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1308835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 13090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 13100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 13110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 13120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 13130427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 13140427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 13150427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1316381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1317381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1318381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 13193c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1320381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1321381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1322381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1323381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1324381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13253c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1326381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1327381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1328381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1329381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1330381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1331381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1332381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1333381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1334ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1335316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1336316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1337316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1338316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1339b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1340316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1341316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1342316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1343316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1344316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1345316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1346316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1347316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1348316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1349b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1350ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1351ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1352316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart Mock::VerifyAndClearExpectations(service); 1353316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1354316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1355316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1356316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 1357b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false)) 1358316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1359316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1360ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1361ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1362381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1363381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1365381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1366381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1367381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1368381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1369381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1370381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1371381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1372381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1373381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1374381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1376381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1377381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1378381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1379381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1380381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1381381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1382381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1383381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 13855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 13863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 13883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 13893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 13912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 13933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 13943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 13963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 13995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 14005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 14015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 14025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 14035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 14045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 14055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 14075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 14095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 14103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 14113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 14123c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 14133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 14143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 14165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 14172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 14182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 14193c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1423f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 14262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1428c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1430c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1431c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14323c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1442c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1443c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14443c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1446c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 14472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 14490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1450c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 14513c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1452c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1454c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1455c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14563c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1458c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 14592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 14612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1463c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1464c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14653c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 14682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1470c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1471c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 14725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 14742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 14752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1477f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 14802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 14825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 14962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 15002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 15015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 15022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 15032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 15040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 15055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 15065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 15072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 15082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 15105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 15122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 15132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 15142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 15152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 15165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 15172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 15195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 15212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 15255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15263c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1527ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1528ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15293c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15305c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1531ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1532ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 15335f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 15345f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 15352f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1536ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1537ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1538ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 15405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 15455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 15485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 15495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 15500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 15510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 15520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 15575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1559ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1560ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15613c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1562ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1563ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15642f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1565ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1566ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1567ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 15695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 15775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 15815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1583ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1584ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15853c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 15870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 15883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 15893c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 15905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 15913ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 15920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1593ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15942f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1595ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1596ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1597ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 15995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 16005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 16015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 16040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 16055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 16065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 16075f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 16085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 16090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 16105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1611df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 16125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 16135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 16155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 16168e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 16178e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 16188e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetupConnectedService(DBus::Path(), NULL, NULL); 16198e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 16208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 16218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 16228e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 16238e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16248e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 16258e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 16263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 16273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 16283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1629e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 16303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1631e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 16323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1633e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 16343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1635e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 16367fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 1637e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1638e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1639e41a72d0737488d561a4158019409d5785dad61bThieu Le 1640e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 1641e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1642e41a72d0737488d561a4158019409d5785dad61bThieu Le 1643e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1644e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1645e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1646e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1647e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1648e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1649e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1650e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1651e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1652e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1653e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1654e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 16553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 16583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 16633c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 16643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 16653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16683c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 16693c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 1676b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 16770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 1678e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 1679b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1680e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 1681e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 16828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 16838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 16848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 16858a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 16863c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 1690ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16933c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16943c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16963c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 1697261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1698261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1699261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 1700261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 17013c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 17033c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 17060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17083c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 17093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1711835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 1712835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 17133c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 17140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 1715835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1716835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 17173c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1718835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 17193c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17203c5040174273386868cc8dea8044d22c465885d8Paul Stewart 17213c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 17220654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1723835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1724835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 1725a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 1726a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 17273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 17283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 1729835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 1730835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1731835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 17320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 17330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17343c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 17350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 17373c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17384943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 17394943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17404943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17414943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 17424943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 17430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17444943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 17454943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17464943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 17474943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 17484943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 17490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17504943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 17514943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17524943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 17533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17553c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 17560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 17600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17613c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 17620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 17633c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 17640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 17673c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 17683c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 17693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17703c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 17710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 17723c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 17763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 17800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 17820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 17830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 17850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17862b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 17870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 17903c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 17913c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 17920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 17933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17944943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 17980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 17990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 1800835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1801835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 1802ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 1803af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 1804af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 1805af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 1806af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 1807835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 1808735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 18093c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 18104943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 18114943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18124943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18144943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18154943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 18164943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18174943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 18184943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 18194943822214f823c2437aa32b0376414b3e60388dPeter Qiu ::DBus::Path kPath("/fake/path"); 18200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18214943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18224943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 18234943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18244943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 18254943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 18264943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 18274943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18284943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 1829ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 18304943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 18314943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 18324943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 18334943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 18344943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)); 18354943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 18364943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 18374943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 18384943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18390654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18413c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 18430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 1844c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 18453c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18463c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 18470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 1849c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 18503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1851c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 1852c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 1853c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 1854c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 18550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 1857c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 1858c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 18590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 18600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 18614943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18634943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), 18640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18673c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 18680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 18690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 18700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18722b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 18734943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18744943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18754943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 18764943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 18782b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 18791aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 18801aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 18811aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal DBus::Path kPath("/fake/path"); 18820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 18851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 18861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 18871aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 18901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 18911aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18921aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 18931aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 18940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 18961aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18971aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 18981aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18991aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 19001aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 1901d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 1902d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1903d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1909d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1910d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1911d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 1912d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1913d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(service0); 1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1917d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1918d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(), 19260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1928d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 1933d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 1934d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1935d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 1936d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1937d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1938d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 1939d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(service0); 1940d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1942d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1943d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1944d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 1945d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1946d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 19480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 1949d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 1950d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1951d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1952d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1953d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1954d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1955d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 1956d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1957d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1958d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 1959d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1960d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1961d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 1962d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(service0); 1963d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1964d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1965d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1966d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 196717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 19689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 196917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 197017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 19719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 19729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 197344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 197444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 197517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 197617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 197717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 19780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 19790d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 19800d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 198117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 198217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 198317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 198433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 198517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 19860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 198744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 1988a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 198944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 1990a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 1991a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1992a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 19930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 19950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 199617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 199833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 199933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 200017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart Mock::VerifyAndClearExpectations(service); 20010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 20020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 20030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 200417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 200517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 200617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 20072b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 20082b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 20092b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 20103c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 20122b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 20132b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 201417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 201517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 20160d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 20170d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 20180d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 201917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 202017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 202117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 202217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20233c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 20240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 20250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 20280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 20293c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 20300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 20313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 20320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 20380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 20393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 20400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 20410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 20420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 20430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 20450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 20470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20495c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2050c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 20513c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 20530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 20550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 20580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 20600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2062c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2063b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2064c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 20655c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 20665c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2067549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 20683c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20693c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 20710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 2072ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20733c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20753c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20763c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2078549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 20790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2080549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2081549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2082446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 20833c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20843c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 20863c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 20871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20880654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20891aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 20900654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 20911aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2094446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 20951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20960654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 21003c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2102446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2103446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 21045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 21060654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 2107ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 2108ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2109ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2110ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2111ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 2112ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 2113ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 2114ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2115ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2116ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2117ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 21223c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 21230654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 2125ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2126ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 21275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 21285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21293c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 21303c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 21313c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 21323c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21333c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 21343c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 21355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 21365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 21383c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21393c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 21485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 21495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 21505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2152ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 21535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21545412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 21555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 21595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 21635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 21645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 21705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21753c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 21765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21785412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2179ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2180ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2181ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2182fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2183fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2184fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2185fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2186fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 21873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 21885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2189fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2190fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2191fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 21925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 2193fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2194fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2195fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2196fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 21971e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 21981e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 21991e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 22001e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22011e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 22021e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 22031e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal .WillOnce(Throw(DBus::Error("don't care", "don't care"))); 22041e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 22051e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 22061e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22071e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 22081e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 22095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 22125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 22135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22167de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 22202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2226f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2227df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2228df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2230f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 22325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 22345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 22355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 22365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 22385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 22405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 22435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 22445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 22455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 224744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 224844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 224944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 225044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 22515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 22562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22577de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 22635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 22645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 22675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 22685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 22700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 22715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2274a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2275a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 22765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 22780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 22820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 22842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 22852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 22862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 22875412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 22882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 22895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 22912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 22925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 22935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 22940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 22955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 22970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 22982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 22990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 23002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 23010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 23025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 23035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 23047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 23057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 23067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 23097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 23100654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 23110654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 23127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 23157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 23167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2318f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 23210654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 23227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2325d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 23267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 23297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 23307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 2331b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2332d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 23337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2335f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2336bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2337bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2338bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 23397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23400654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 23410654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 23420654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 23437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 23447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23463c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 23473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 23487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2350a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2351a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2352a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2353a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2354f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2355a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2356a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2357a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2358a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2359a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2360a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2361a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2362a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2363a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2364a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2365a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2366a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2367a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2368a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2369a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2370f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2371a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23720654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 23730654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2374a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2375a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2376a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2377a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2378a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2379a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2381a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2382a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2383a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 23842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2385a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23860654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 23870654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2388a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 23890654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2390a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2391a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23921590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 23931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 23943c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 23960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr); 23971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 23984943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 23990654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 24000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2402687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 24041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 24051590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 24061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 24073c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 24080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 24093c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 24110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 24123c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 24131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2414c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2415c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2416c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2417c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 24183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 24193c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 24203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2421bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2422a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 24230654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2425687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24263c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service0); 24273c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1); 24281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 24291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2430e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2431e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 24320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 24330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 24340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 24353c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 24360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 24373c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24383c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 24393c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 24403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2442687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 24430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2444687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2445687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2446687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2447687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2448687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2449687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2450687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2451687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2452687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2453687350531096cacc379c209e39e63e5316eee5c0Paul Stewart Mock::VerifyAndClearExpectations(ipconfig); 2454687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24554eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 24564eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 24578a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 24588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24593c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 24600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 24628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24633c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 24640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 24660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 246949c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 247049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 247149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ::DBus::Path bss_path; 247249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 247349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 24740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, &bss_path)); 247549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 24760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 247749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 247849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 247949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 248049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 248149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 248249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 248349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 248449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 248549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 24860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 248849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 248949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 249049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 24918a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 24928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 24943c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 24978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24988a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 24994a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 25000654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 25019d97b7deda3ae604d718873207a951f62d418b34Paul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) && 25020654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 25034d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 25044d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 25054d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 25064d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 25073c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 25080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2509a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 25103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 25110654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 25124d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 25134d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 25144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 25154a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 25164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 25173c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 25180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2519a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 25203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 25214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 25224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 25244a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 25254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2526f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 25274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 25294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 25313c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 25323c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25330654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 25383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 25393c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 25403c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25440654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 25504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 25514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 25550654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 25564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25583c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 25593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25630654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 25694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25715c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 25725c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 25730654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 25745c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 25753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25765c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 25773c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25785c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 25795c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 25805c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 25810654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25825c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 25835c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 25844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2586c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2587c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 25883c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 25890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 2590c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2591c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2592c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2593c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2594c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2595c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 2596c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal Mock::VerifyAndClearExpectations(service); 2597c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2598c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2599c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2600c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 26013c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 26020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 26038f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2604c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 26058f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 26068f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 26070654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 26085519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 26093c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 26103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 26113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 26128f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 26138f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 26145519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 26155519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 26163c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 26173c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 26183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 26190654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2620c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2621c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2622b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2623b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2624b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2625b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2626b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2627b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 2628b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2629b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2630b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2631b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2632b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2633b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2634b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 2635b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 2636b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 2637b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 2638b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 26393c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 26400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 26410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 26423c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2643b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 2644b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 2645b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 2646b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2647b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 26485c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 26495c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 26505c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 26515c05b2920be742d518829972127172481722058dmukesh agrawal 26525c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 26535c05b2920be742d518829972127172481722058dmukesh agrawal 26545c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 26555c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 26565c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 26573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 26585c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 26595f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 26602f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 26615c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 26625c05b2920be742d518829972127172481722058dmukesh agrawal} 26635c05b2920be742d518829972127172481722058dmukesh agrawal 26645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 26655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 2666b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2667b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2668b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2669b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2670b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2671b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26727de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 26730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2674b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 2675b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2676b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2677b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2678b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2679b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 26815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 26825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 26845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 26855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 26860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2687df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 26885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 26895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 26905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 26925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 2695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2698b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2699b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 2701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 2702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 27035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2704b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27123c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 27130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr); 2714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 27185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2722b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2724b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 2725b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2726b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2727b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 2730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2731b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2732b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2733b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 2734b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2735b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2736b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2740b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2741b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2742b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 2743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2744b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2745b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 2747b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2748b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2749b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 27515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 27525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 27535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 27555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 27565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 27575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 2758a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 27595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 27615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 27625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 27635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 27645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 27665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2767b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 2768b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2769b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 27710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2772df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 27733c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 27743c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 27753c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 2776a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 27773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27783c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 27795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 27800654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2781b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2782b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 2785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2786b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2788b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2789df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 27903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27913c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 27920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2793b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2794b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2795b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27963c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 27973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 27982ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 27992ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 28003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 28012ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 28023c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 28033c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 28043c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 28052ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28062ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 28072ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 28083c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 28093c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 2810daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 28113c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 28122ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28132ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28142ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 28152ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 28162ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 28172ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 28182ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 28192ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 28202ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28212ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28222ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 28232ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 28243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 2825daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 2826daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1); 28273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 28283c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 28303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 28318e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 28328e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 28338e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetupConnectedService(DBus::Path(), NULL, NULL); 28348e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 28358e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 28368e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 28378e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28388e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 28398e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 2840cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 2841f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2842bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 28430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2844cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2845cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2846bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 2847f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 28480654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2849bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2850bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 2851bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 28520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 28531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2854bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 28551369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 2856cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2857cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2858f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 2859f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 2860f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 2861f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 2862a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 2863f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 2864f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 2865f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2866f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 2867f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 2868f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 2869f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2870f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2871b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2872f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 2873f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 2874f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2875f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2876f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2877f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2878f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 2879f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2880f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2881f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 2882f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 2883f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 2884f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 2885f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2886f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2887f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 2888f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 2889f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2890f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2891f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 2892f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 2893f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 28940d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 28950d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 28960d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2897f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2898f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2899f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2900f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 2901f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 2902f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2903f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 29040d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 29050d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29060d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2907f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2908f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2909f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2910f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 2911f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 2912f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2913f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 2914f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 29150d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 29160d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29170d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2918f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2919f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 2920f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 29211369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 2922f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2923735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2924735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2925735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 2926735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2927735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2928bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2930bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2931bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2932bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 29331369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2934bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 29351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 2936bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2937bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2938bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2940bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2941bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2942bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2943bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 29440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29451369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29471369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 2948f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 2949cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 29500654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2951cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2952a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 2953bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2954f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 29554943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2956735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2957cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2958f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 29590654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 29601369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29621369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 2963f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 29641369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 29651369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 2966735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2967735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 29684943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2969735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 2970735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 2971735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 2972735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2973735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2974bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2975735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 29761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 297739a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 2978735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 29790654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2980cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2981cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 2983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 29841aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 2985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 29861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 2987e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2988e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 2989e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 2990e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2991e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 2992e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 2993e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 29941aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 2995e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 2996e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 2997e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 2998e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2999e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3006e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3007e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3008e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3010e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3011e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3012e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3014e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3015e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3016e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3017e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3018e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3020e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3021e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3022e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3023e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3025e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30261aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 30270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3028e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3029e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3030e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3031e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3032e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3033e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3034e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3035e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3036e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3037e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3038e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3039e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3040e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3041e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30461aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 30471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 30481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30493c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 30500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 30511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 30581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 30641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30701aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 30721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30731aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 30741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30757cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 30767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 30777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 30807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 30817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 30820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 30837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 30847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30865412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 30877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 30887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 30897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 30917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 30920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 30937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 30947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 30967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 30977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 30987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 30997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 31027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 31037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 31047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 31057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 31067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 31087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 31117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 31127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 31135412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 31147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 31167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 31177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 31207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 31217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 31227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3123baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3124baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3125baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3126baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 31277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 31287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 31297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 31307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 31317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 31327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 31337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 31347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 31357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 31367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 31377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3138baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 31397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3140baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3141baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3142baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3143baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3144baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3145baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3146baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3147baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3148baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3149baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3150baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3151baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3152baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3153baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3154baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3155baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3156baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3157baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3158baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3159baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3160baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3161baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3162baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3163baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3164baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3165baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3166baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3167baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3168baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3169baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3170baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3171baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3172baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3174baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3175baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3176baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3177baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3178baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3179baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3180baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3181baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3182baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3183baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3184baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3185baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3186baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3187baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 31887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 31897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 31917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 31928e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 31937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 31947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 31957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3196baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3197baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3198baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3199baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3200baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3201baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3202baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3203baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3204baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3205baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3206baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3207baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3208baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3209baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3210baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3211baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3212baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3213baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3214baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3215baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3216baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3217baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3218baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3219baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3220baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3221baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3222baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3223e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3224e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3225e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3226e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3227e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3228e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3229e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3230e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3231e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3232e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3233e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3234e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3235e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3236e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3237e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3238e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3239e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3240e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3241e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3242e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3243e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3244e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3245e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3246e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3247e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3248e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3249e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3250e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3251e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3252e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3253e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3254e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3255e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3256e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3257e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3258e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3259e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 32608e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 32618e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3262e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3263e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3264e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3265e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3266e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3267e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 32687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 32697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3270bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3271f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3272bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3273bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3274bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3275bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3276bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 3277bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3278bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3279bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3280bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3281bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3282bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3283bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3284bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 32857fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 32860654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 3287bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3288bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3289bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3290bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3291bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3292bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3293bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 32940654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 3295bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 3296bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3297bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3298db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3299db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3300db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 330111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3302db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3303db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3304735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3305735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3306735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3307735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3308db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3309db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3310db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3311f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3312db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3313735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3314db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3315735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3316735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(service); 3317735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3318db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3319735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3320735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3321735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 33220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 33230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33240d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3325735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 332611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 332711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 332811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 332911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 333011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 333111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 333211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 333311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 333411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 333511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 333611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 33370d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 33380d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33390d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 334011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 334111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 334211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 334311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 334411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 334511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 334611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 334711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 33480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 334911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 335011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 335111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 335211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 335311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3354bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3355bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3356c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3357c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3358c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3359c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3360c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3361c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3362c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3363c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3364c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3365c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3366c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3367c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 33686d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 33696d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 33706d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 33716d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 33726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 33737fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 33746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 33756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 33766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 33786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 33796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 33806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 33816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 33826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 33836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 33846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 33856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 33866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 33876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 33886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 33896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 33906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 33926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 33936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 33946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 33956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 33966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 33986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 33996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 34006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 34016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 34026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 34036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 34047347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 34057347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 34066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34075581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 34085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 34095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 34115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 34125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 34135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 34175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 34185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34190654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 34205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 34225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 34255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 34265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34270654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 34280654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 34290654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 34300654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 34310654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 34320654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 34330654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 34340654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 34355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 34475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 34485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34490654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 34500654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 34515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 34525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 34565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 34575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34580654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 34590654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 34605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 34615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 34655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 34665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34670654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 34680654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 34695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 34745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 34755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 34775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 34805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 348150cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 348250cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 348350cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 348450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 348550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 3486bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 3487bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 3488bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 3489bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 3490bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3491bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 34927fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 3493bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3494bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3495bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3496bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3497bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3498bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3499bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3500bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3501bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 3502bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3503bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 35047fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 3505bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3506bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3507bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3508bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3509bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3510bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3511bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3512bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3513bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 3514bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3515bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3516bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 3517bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3518bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3519bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 3520bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 35210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 35220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35230cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 35249f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 35250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 3526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 35337de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 35340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 35350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35410cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 35429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 35430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 35440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 35459f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 35469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 35479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 35480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3550a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 35510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3552a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3553a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3554a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 35570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 35580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35640cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 35659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 35660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 35670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 35689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 35699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 35700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3572a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 35730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3574a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3575a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3576a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 35790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 35800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 3586df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 35879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3588df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 35899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 35909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 3591df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3592df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 3593a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3594a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 3595a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 35969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3597df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3598df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3599df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3600df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 3601df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 3602df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 3603df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 3604df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3605df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3606df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3607df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3608df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3609b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 3610b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3611b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 3612df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 3613b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 3614b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3615df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 3616df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3617df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 3618df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3619a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3620df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3621b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 3622b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 3623b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 3624b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 3626df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3627df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3628df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 3629df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3630a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3631df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3633df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3634df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 3635df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3636df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3637df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 36380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 3639df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 36409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3641df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3642df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 3643a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3644a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3645df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 36460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 3648df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3649df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 3650a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3651a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 36529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3653df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3654df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3655df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3656df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 3657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 3658df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 36590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3660df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3661df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 36630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3665a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3666a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 3667df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3668df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3669df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 36709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3671df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3672a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 3674df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 3675df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 3676df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 3677df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 3678df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3679df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3680df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3681f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 3682f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3683a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 3684df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 3685df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3686df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 3687df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 36900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 36910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 36920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 36949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 3698a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3699a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3700f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3701df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 3702df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 3705a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3706df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3707df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3708df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3709df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3711df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3712df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3713df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 3714df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 3715f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 3716a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 3717a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 37182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 3719df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 3720a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 3721a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3722a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3723a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3724df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 3725df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 3726a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3727df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3728df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 3729a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3730df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3731df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 3732df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 3733a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3734df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3735df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3736df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3737df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 3738df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3739df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 3740df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 3741df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 3742df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3743df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 3744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 3745df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 3746df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 3747df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3748df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3749df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3750df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3751df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 37523bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 37533bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 37540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 37553bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 37563bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37573bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 37582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 37593bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 37603bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 37613bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37623bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 37637de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 37643bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 37653bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 37663bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 37673bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 37692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 37702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 37722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 37732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 37742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 37752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 37762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 37772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 37792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 37802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 37812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 37822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 37842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 37852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 37872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 37882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 37892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 37902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 37912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 37922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 37942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 37952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 37962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 37972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 3798c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 3799df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 3800df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 3801df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3802df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3803df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3804df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3805df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3806df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3807df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3808df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 3809df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 3810df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3811df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3812df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3813df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3814df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3815df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3816df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3817df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3818df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 3819df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 3820df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3821df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3822df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 3823df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3824df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 3825df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3826df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3827df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3828df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3829df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 3830df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 3831df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3832df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3833df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3834df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3835df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3836df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3837df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3838df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3839df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 3840df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 3841df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3842df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 3843df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3844c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 3845c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 3846c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kPeer[] = "00:11:22:33:44:55"; 3847c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3848c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3849c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3850c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 3851c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3852c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3853c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3854c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3855c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3856c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error)); 3857c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // This is not a valid IP address nor is it a MAC address. 3858c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3859c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3860c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3861c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kAddress[] = "192.168.1.1"; 3862c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3863c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3864c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3865c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // The provided IP address is not local. 3866c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3867c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(false)); 3868c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3869c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3870c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3871c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3872c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3873c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3874c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3875c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3876c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // If the MAC address of the peer is in the ARP cache, we should 3877c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // perform the TDLS operation on the resolved MAC. 3878c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kResolvedMac[] = "00:11:22:33:44:55"; 3879c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const ByteString kMacBytes( 3880c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac)); 3881c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3882c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(true)); 3883c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _)) 3884c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true))); 3885c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 3886c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart TDLSDiscover(StrEq(kResolvedMac))); 3887c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3888c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3889c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3890c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3891c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3892c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3893c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3894c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3895c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 3896c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 3897c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3898c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3899c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3900c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3901c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3902c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3903c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3904c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3905c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3906c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3907c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3908c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3909c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3915c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3916c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3917c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3918c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3919c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3920c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3921c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3922c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3923c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3924c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3925c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3926c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3927c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3928c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3929c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3930c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3931c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3932c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3933c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3934c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 3935c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 3936c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 3937c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 3938c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 3939c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 3940c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 3941c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3942c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 3943c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3944c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 3945c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3946c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 3947c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3948c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3949c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3950c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3951c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3952c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3953c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3954c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3955c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3956c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3957c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3958c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3959c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3960c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3961c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3962c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3963c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3964c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3965c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3966c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3967c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3968c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3969c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3970c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3971c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3972c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 3973c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3974c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3975c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3976c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3977c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 3978c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3979c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3980c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 3981c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 39823946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 39833946da840142cd386d628c0e879459f8976bd86dmukesh agrawal Nl80211Message new_wiphy_message( 39843946da840142cd386d628c0e879459f8976bd86dmukesh agrawal NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString); 39853946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 39863946da840142cd386d628c0e879459f8976bd86dmukesh agrawal CreateStringAttribute(Nl80211AttributeWiphyName::kName, 39873946da840142cd386d628c0e879459f8976bd86dmukesh agrawal Nl80211AttributeWiphyName::kNameString); 39883946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 39893946da840142cd386d628c0e879459f8976bd86dmukesh agrawal SetStringAttributeValue(Nl80211AttributeWiphyName::kName, 39903946da840142cd386d628c0e879459f8976bd86dmukesh agrawal "test-phy"); 39913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 39923946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 39933946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // TODO(quiche): We should test the rest of OnNewWiphy, which parses 39943946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // out frequency information. 39953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 39963946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 39973946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 39983946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 39993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 40003946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 40013946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 40033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 40043946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 40053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 4006397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, AddRemoveWakeOnPacketConnection) { 4007397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const string ip_string1("192.168.0.19"); 4008397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const string ip_string2("192.168.0.55"); 4009397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const string ip_string3("192.168.0.74"); 4010397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddress ip_addr1(ip_string1); 4011397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddress ip_addr2(ip_string2); 4012397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddress ip_addr3(ip_string3); 4013397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan Error e; 4014397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 40159c73d221484fbd719072261ff288373ce866693fSamuel Tan // Add and remove operations will fail if WiFi device does not support 40169c73d221484fbd719072261ff288373ce866693fSamuel Tan // pattern matching. 40179c73d221484fbd719072261ff288373ce866693fSamuel Tan AddWakeOnPacketConnection(ip_addr1, &e); 40189c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kNotSupported); 40199c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 40209c73d221484fbd719072261ff288373ce866693fSamuel Tan "Wake on IP address patterns not supported by this WiFi device"); 40219c73d221484fbd719072261ff288373ce866693fSamuel Tan RemoveAllWakeOnPacketConnections(&e); 40229c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kNotSupported); 40239c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 40249c73d221484fbd719072261ff288373ce866693fSamuel Tan "Wake on IP address patterns not supported by this WiFi device"); 40259c73d221484fbd719072261ff288373ce866693fSamuel Tan RemoveWakeOnPacketConnection(ip_addr2, &e); 40269c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kNotSupported); 40279c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 40289c73d221484fbd719072261ff288373ce866693fSamuel Tan "Wake on IP address patterns not supported by this WiFi device"); 40299c73d221484fbd719072261ff288373ce866693fSamuel Tan 40309c73d221484fbd719072261ff288373ce866693fSamuel Tan // Add operation will fail if pattern matching is supported but the max number 40319c73d221484fbd719072261ff288373ce866693fSamuel Tan // of IP address patterns have already been registered. 40329c73d221484fbd719072261ff288373ce866693fSamuel Tan GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kIPAddress); 40339c73d221484fbd719072261ff288373ce866693fSamuel Tan *GetWakeOnWiFiMaxPatterns() = 0; 40349c73d221484fbd719072261ff288373ce866693fSamuel Tan AddWakeOnPacketConnection(ip_addr1, &e); 40359c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kOperationFailed); 40369c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 40379c73d221484fbd719072261ff288373ce866693fSamuel Tan "Max number of IP address patterns already registered"); 40389c73d221484fbd719072261ff288373ce866693fSamuel Tan 40399c73d221484fbd719072261ff288373ce866693fSamuel Tan *GetWakeOnWiFiMaxPatterns() = 50; 4040397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan GetWakeOnPacketConnections()->Clear(); 4041397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 4042397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr1, &e); 4043397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 4044397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4045397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4046397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4047397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4048397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr2, &e); 4049397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4050397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4051397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4052397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4053397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4054397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr3, &e); 4055397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 3); 4056397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4057397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4058397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4059397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4060397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveWakeOnPacketConnection(ip_addr2, &e); 4061397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4062397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4063397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4064397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4065397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 40669c73d221484fbd719072261ff288373ce866693fSamuel Tan // Remove fails if no such address is registered. 4067397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveWakeOnPacketConnection(ip_addr2, &e); 4068397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(e.type(), Error::kNotFound); 4069397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_STREQ(e.message().c_str(), 40709c73d221484fbd719072261ff288373ce866693fSamuel Tan "No such IP address match registered to wake device"); 4071397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4072397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4073397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveWakeOnPacketConnection(ip_addr1, &e); 4074397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 4075397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4076397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4077397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4078397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4079397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr2, &e); 4080397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4081397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4082397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4083397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4084397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4085397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveAllWakeOnPacketConnections(&e); 4086397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 0); 4087397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4088397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4089397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4090397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4091397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4092397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RequestWakeOnPacketSettings) { 4093397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL( 4094397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan netlink_manager_, 4095397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4096397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan GetWakeOnPacketConnMessage::kCommand), 4097397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan _, _, _)).Times(1); 4098397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RequestWakeOnPacketSettings(); 4099397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4100397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4101fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanMATCHER_P(ErrorType, type, "") { return arg.type() == type; } 4102fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 4103fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettingsWithNoWakeOnPacketRules) { 4104397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan ScopedMockLog log; 4105397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const uint8_t kResponseNoIPAddresses[] = { 4106397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 4107397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00}; 41085f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request 41095f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // indicating that there are no wake-on-packet rules programmed into the NIC. 4110fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan GetWakeOnPacketConnMessage msg; 4111fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kResponseNoIPAddresses)); 4112fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Successful verification and consequent invocation of callback. 4113fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan SetSuspendActionsDoneCallback(); 4114397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 4115fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_FALSE(SuspendActionsCallbackIsNull()); 4116fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kSuccess))).Times(1); 4117397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4118397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified"))); 4119fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan VerifyWakeOnWiFiSettings(msg); 4120fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Suspend action callback cleared after being invoked. 4121fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(SuspendActionsCallbackIsNull()); 4122fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 4123fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Unsuccessful verification if locally stored settings do not match. 4124397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1")); 41255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 41265f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41275f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected"))); 4128fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan VerifyWakeOnWiFiSettings(msg); 4129fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan} 41305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 4131fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, 4132fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan VerifyWakeOnWiFiSettingsWithWakeOnPatternAndDisconnectRules) { 4133fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ScopedMockLog log; 4134fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan const uint8_t kResponseIPV4WakeOnDisconnect[] = { 4135fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 4136fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x75, 0x00, 4137fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 4138fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 4139fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4140fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4141fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00}; 41425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request 41435f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // indicating that that the NIC wakes on packets from 192.168.10.20 and on 41445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // disconnects. 4145fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan GetWakeOnPacketConnMessage msg; 4146fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan msg.InitFromNlmsg( 4147fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan reinterpret_cast<const nlmsghdr *>(kResponseIPV4WakeOnDisconnect)); 4148fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Successful verification and consequent invocation of callback. 4149fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan SetSuspendActionsDoneCallback(); 4150fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_FALSE(SuspendActionsCallbackIsNull()); 41515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->AddUnique(IPAddress("192.168.10.20")); 41525f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 41535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect); 4154fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kSuccess))).Times(1); 41555f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41565f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified"))); 4157fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan VerifyWakeOnWiFiSettings(msg); 4158fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Suspend action callback cleared after being invoked. 4159fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(SuspendActionsCallbackIsNull()); 4160fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 4161fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Unsuccessful verification if locally stored settings do not match. 41625f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->erase(WakeOnWiFi::kDisconnect); 4163397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4164397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected"))); 4165fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan VerifyWakeOnWiFiSettings(msg); 4166fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan} 4167fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 4168fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettingsSuccessWithNoSuspendCallback) { 4169fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ScopedMockLog log; 4170fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan const uint8_t kResponseNoIPAddresses[] = { 4171fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 4172fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00}; 4173fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request 4174fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // indicating that there are no wake-on-packet rules programmed into the NIC. 4175fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan GetWakeOnPacketConnMessage msg; 4176fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kResponseNoIPAddresses)); 4177fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Successful verification, but since there is no suspend action callback 4178fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // set, no callback is invoked. 4179fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(SuspendActionsCallbackIsNull()); 4180fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 4181fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4182fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4183fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified"))); 4184fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan VerifyWakeOnWiFiSettings(msg); 4185397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4186397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4187fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, RetryApplyWakeOnWiFiSettingsLessThanMaxRetries) { 4188397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan ScopedMockLog log; 4189fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Max retries not reached yet, so send Nl80211 message to program NIC again. 4190fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan SetNumSetWakeOnPacketRetries(WiFi::kMaxSetWakeOnPacketRetries - 1); 4191397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL( 4192397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan netlink_manager_, 4193397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4194397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SetWakeOnPacketConnMessage::kCommand), 4195397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan _, _, _)).Times(1); 4196fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan RetryApplyWakeOnWiFiSettings(); 4197fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_EQ(GetNumSetWakeOnPacketRetries(), WiFi::kMaxSetWakeOnPacketRetries); 4198fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan} 4199397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4200fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, RetryApplyWakeOnWiFiSettingsMaxAttemptsWithCallbackSet) { 4201fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ScopedMockLog log; 4202fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Max retry attempts reached. Suspend actions done callback is set, so it 4203fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // is invoked. 4204fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan SetNumSetWakeOnPacketRetries(WiFi::kMaxSetWakeOnPacketRetries); 4205fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan SetSuspendActionsDoneCallback(); 4206fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_FALSE(SuspendActionsCallbackIsNull()); 4207fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kOperationFailed))) 4208fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan .Times(1); 4209397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 4210397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4211397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached"))); 4212fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan RetryApplyWakeOnWiFiSettings(); 4213fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(SuspendActionsCallbackIsNull()); 4214fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_EQ(GetNumSetWakeOnPacketRetries(), 0); 4215fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan} 4216fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 4217fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, RetryApplyWakeOnWiFiSettingsMaxAttemptsWithCallbackUnset) { 4218fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ScopedMockLog log; 4219fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // If there is no suspend action callback set, no suspend callback should be 4220fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // invoked. 4221fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan SetNumSetWakeOnPacketRetries(WiFi::kMaxSetWakeOnPacketRetries); 4222fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(SuspendActionsCallbackIsNull()); 4223fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4224fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4225fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached"))); 4226fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan RetryApplyWakeOnWiFiSettings(); 4227397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4228397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 42295f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, ApplyWakeOnWiFiSettings) { 4230fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Disable wake on WiFi if there are no wake on WiFi triggers registered. 42315f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL( 42325f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan netlink_manager_, 42335f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 42345f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SetWakeOnPacketConnMessage::kCommand), 42355f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan _, _, _)).Times(0); 4236397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(netlink_manager_, 42375f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 42385f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan ApplyWakeOnWiFiSettings(); 42395f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 42405f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Otherwise, program the NIC. 42415f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan IPAddress ip_addr("1.1.1.1"); 42425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->AddUnique(ip_addr); 42435f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 42445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Empty()); 42455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL( 42465f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan netlink_manager_, 42475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 42485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SetWakeOnPacketConnMessage::kCommand), 42495f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan _, _, _)).Times(1); 42505f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 42515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 42525f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan ApplyWakeOnWiFiSettings(); 42535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan} 4254397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 42555f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiSettingsAppliedBeforeSuspend) { 42563f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan // When wake_on_packet_connections_ is empty, do not program the NIC and 42573f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan // immediately invoke the callback to report success. 4258fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 42593f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kSuccess))).Times(1); 42603f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan EXPECT_CALL( 42613f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan netlink_manager_, 42623f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 42633f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan SetWakeOnPacketConnMessage::kCommand), 42643f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan _, _, _)).Times(0); 42655f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan OnBeforeSuspend(); 4266fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan dispatcher_.DispatchPendingEvents(); 42675f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 42685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // When wake_on_packet_connections_ is not empty, program NIC to wake on 42695cce42f7250f04fd114c6312d456a7d6d3aa055fSamuel Tan // IP address patterns. 42705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan IPAddress ip_addr("1.1.1.1"); 42715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->AddUnique(ip_addr); 4272fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4273397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL( 4274397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan netlink_manager_, 4275397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4276397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SetWakeOnPacketConnMessage::kCommand), 4277397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan _, _, _)).Times(1); 42785f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan OnBeforeSuspend(); 4279fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan dispatcher_.DispatchPendingEvents(); 42805f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_FALSE(GetWakeOnWiFiTriggers()->empty()); 42815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kIPAddress) != 42825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->end()); 42835f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan} 42845f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 42855f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiDisabledAfterResume) { 42865f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect); 42875f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 42885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 42895f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 42905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan OnAfterResume(); 42915f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 4292397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4293397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4294853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4295