wifi_unittest.cc revision 0afd90f73a4a22c7d9d144d8fe5de66b30632e48
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> 18dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h> 19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h> 20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h> 21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h> 22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h> 25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 26853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 27125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h" 2826b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 308ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h" 31a6270fd8fa1bd88a802595d91d80de86081847beSamuel Tan#include "shill/ip_address.h" 32397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h" 337a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 34b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 35853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 37084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h" 38853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 39c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 40f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h" 41f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h" 4211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 43e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 44687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h" 453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 46cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/mock_mac80211_monitor.h" 482ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 493426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 50bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h" 5110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 52af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h" 535c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h" 545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h" 55a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 56b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h" 57735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h" 583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h" 59835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h" 603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h" 615c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h" 623c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h" 637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h" 645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h" 65dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 663946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/nl80211_attribute.h" 675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h" 68853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h" 7085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 71af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h" 725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan#include "shill/wake_on_wifi.h" 733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h" 743239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h" 75ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h" 76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 770e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 78a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf; 79853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 805f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set; 81853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 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)); 553a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 554a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 5553c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path; 5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 5833c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 588bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 589b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 591a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 5920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 5933c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5943c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 598d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 599b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 600b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 601b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 6032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 6040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kFullScan, nullptr, __func__); 6052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 6060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kProgressiveScan, nullptr, __func__); 6072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 608c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 6091590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetCurrentService() { 6101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 6111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 612bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void SetCurrentService(const WiFiServiceRefPtr &service) { 613bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 614bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 6153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 616165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 6173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetPendingService() { 6191590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 6201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 6212b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &GetPendingTimeout() { 6222b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 6232b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 6241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart const base::CancelableClosure &GetReconnectTimeoutCallback() { 625446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 626446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 6272ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal const ServiceRefPtr &GetSelectedService() { 6282ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal return wifi_->selected_service(); 6292ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal } 6307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const string &GetSupplicantBSS() { 6317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 6327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void SetSupplicantBSS(const string &bss) { 6347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 6357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 6371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 639b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal const base::CancelableClosure &GetScanTimer() { 640b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 643e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 6443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 6453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 6463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6483c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() { 6498a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal return dynamic_cast<MockSupplicantInterfaceProxy *>( 6508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 6513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6523c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 6533c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 6553c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 6563c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() { 6573c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi(); 6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 6593c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 6607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal const string &GetSupplicantState() { 6617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 6627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 663835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart void ClearCachedCredentials(const WiFiService *service) { 664835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 665835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6660427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) { 6670427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 6680427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 669381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan bool RemoveNetwork(const ::DBus::Path &network) { 670381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 671381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 672261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 6733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 6743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 6753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 6763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 6777fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 679c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 680c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart wifi_->OnIPConfigUpdated(dhcp_config_); 681c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 682f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 683f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 684f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 685f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 686f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 687f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 688f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 689f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 690f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 6913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 6925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 6935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 699dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 7003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7011590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 7021590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 7031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 7047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 7057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 7067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 7075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 7085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 7095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 7107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 7117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 7127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 7137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 7147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 7157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 716baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 7170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 718baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 719cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 720df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 721cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 72211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 72311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const WiFiServiceRefPtr &service, const string &rpcid) { 72411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 72511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 726bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 727bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 729e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 7300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 731e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 7322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 733a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 734a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 735a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 736a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 737a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 738a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 739a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 740a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 741a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 742a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 743a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 745a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 7465412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 747a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 748125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu StringCallback supplicant_name_owner_callback; 749125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 750125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu EXPECT_CALL(*dbus_service_proxy_.get(), 751125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu GetNameOwner(WPASupplicant::kDBusAddr, _, _, _)) 752125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated), 753125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu SaveArg<2>(&supplicant_name_owner_callback))); 754125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu 755084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Start(); 7562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 7570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 758125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 759125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu // Mimick the callback from |dbus_service_proxy_->GetNameOwner|. 760125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error()); 7613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7622b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 7632b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 7642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7652f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 7662f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 7672f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7682f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 7692f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnBeforeSuspend(); 7702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 772084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7"); 7732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 7742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 776084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr); 7772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 7782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 7802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 7812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 782687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 783687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 784687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 785687350531096cacc379c209e39e63e5316eee5c0Paul Stewart void SetIPConfig(const IPConfigRefPtr &ipconfig) { 786687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 787687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 7884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 7894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 7904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 7914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 792f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 7934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 7944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 7954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 7964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 7974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 7984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 7994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 8004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 802bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 803bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 80510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 806db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 807db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 808db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 809db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 810e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 811e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 812e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 813e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 8141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 8151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 8161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 8191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 8201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 8233c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 8243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 826bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 8271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 8281369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 8291369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 8301369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 8313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 8323c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 8333c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 8357fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanShortInterval(const uint16_t &interval, Error *error) { 836bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 837bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 838bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 8397fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) { 840bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 841bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 842bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 843df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 844df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 845df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 846df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 847df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 848df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 849df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 850df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 851df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 852df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 853df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 854df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 855df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 856df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 857df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 858df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 859c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 860c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 861c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 862c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 863c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 864c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 865df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 866df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 867df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 868df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 8693946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void OnNewWiphy(const Nl80211Message &new_wiphy_message) { 8703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 8713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 8723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 87310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 87410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 87510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 87610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 87785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 87885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 87985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 88085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 8813239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 8823239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 8833239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 884d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 885d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 886d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 887d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 888d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 889d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 890d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 891d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 892d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 8933239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 8943239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 8953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 8963239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 897af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory *proxy_factory() { 898b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 899b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 900b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 9033c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor() { 9063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 9073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 9083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 909397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddressStore *GetWakeOnPacketConnections() { 910397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan return &wifi_->wake_on_packet_connections_; 911397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 912397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 913397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan int *GetNumSetWakeOnPacketRetries() { 914397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan return &wifi_->num_set_wake_on_packet_retries_; 915397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 916397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 9175f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggers() { 9185f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan return &wifi_->wake_on_wifi_triggers_; 9195f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan } 9205f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 9219c73d221484fbd719072261ff288373ce866693fSamuel Tan set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggersSupported() { 9229c73d221484fbd719072261ff288373ce866693fSamuel Tan return &wifi_->wake_on_wifi_triggers_supported_; 9239c73d221484fbd719072261ff288373ce866693fSamuel Tan } 9249c73d221484fbd719072261ff288373ce866693fSamuel Tan 9259c73d221484fbd719072261ff288373ce866693fSamuel Tan size_t *GetWakeOnWiFiMaxPatterns() { 9269c73d221484fbd719072261ff288373ce866693fSamuel Tan return &wifi_->wake_on_wifi_max_patterns_; 9279c73d221484fbd719072261ff288373ce866693fSamuel Tan } 9289c73d221484fbd719072261ff288373ce866693fSamuel Tan 929397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void AddWakeOnPacketConnection(const IPAddress &ip_endpoint, Error *error) { 930397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->AddWakeOnPacketConnection(ip_endpoint, error); 931397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 932397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 933397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RemoveWakeOnPacketConnection(const IPAddress &ip_endpoint, 934397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan Error *error) { 935397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->RemoveWakeOnPacketConnection(ip_endpoint, error); 936397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 937397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 938397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RemoveAllWakeOnPacketConnections(Error *error) { 939397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->RemoveAllWakeOnPacketConnections(error); 940397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 941397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 942397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RequestWakeOnPacketSettings() { wifi_->RequestWakeOnPacketSettings(); } 943397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 9445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan void VerifyWakeOnWiFiSettings(const Nl80211Message &nl80211_message) { 9455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan wifi_->VerifyWakeOnWiFiSettings(nl80211_message); 946397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 947397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 9485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan void ApplyWakeOnWiFiSettings() { 9495f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan wifi_->ApplyWakeOnWiFiSettings(); 950397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 951397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 952397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan void RetrySetWakeOnPacketConnections() { 953397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan wifi_->RetrySetWakeOnPacketConnections(); 954397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan } 955397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 956e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 9575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 9585c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 9595c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 9603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 962dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 9633426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 964f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 9652ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 966c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 9673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 9683c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 9693c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 9703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor_; // Owned by |wifi_|. 9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 9753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 976626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 9773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 9783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 979446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 980446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 9817fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 9823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 983084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan scoped_ptr<MockDBusServiceProxy> dbus_service_proxy_; 984dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 985b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 986f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 987f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 988084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan DBusManager *dbus_manager_; 989735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 990735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 991735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 9920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 993735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 994bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 9953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 9973c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 998af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 9993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 10003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1005446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1006446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 10077fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 10083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 1010b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1011261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1012261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 10143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 10153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 10163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 10177fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 10183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode) { 10193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 10203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 10273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1028a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 10293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 10303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 10323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 10333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10340654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 1035e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 10360654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 1037e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 10380654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 1039b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSAddedTask(bss_path, bss_properties); 10403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1046e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1047e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1048a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1049a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1051a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 10522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1053a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1054a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 10559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 10569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 10579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 10589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1060f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1061a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 10622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 10632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 10642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 10659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 10669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 10689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 10719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 10729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 10739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 10749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 10759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 10769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 10799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 10809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1083a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1084a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 10859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 10869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 10879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 10889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 10909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1095a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 10962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1097a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1098a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 10992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 11002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1101a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 11022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1103f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1104a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1105a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1108a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1111f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1119a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1122a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1123a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1125a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1126a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1135e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1136e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1137e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 11383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 11390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 11413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 11440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 11453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 11463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11472b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 11492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1151227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1152227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1153227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1154227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1155227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1156227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1157227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1158227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1159227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1160227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1161227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1162227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1163227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1164227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1165227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1166227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1167227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1168227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1169227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11702b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 11710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 11740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1176227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1177227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1178227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1179227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1180227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1181227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 11869cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 11879cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 11889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 11899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 11909cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 11919cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 11922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11942b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 11950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 12009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 12019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 12029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 12042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12062b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 12070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 12100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 12112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 12142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 12152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12182b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1225549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 12263c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 12273c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 12283c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 12290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 1230549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1231549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1232c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1233549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1234549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1235549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 12363c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 12373c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 12383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 12393c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 12403c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 12413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1242549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1243549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 12440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1245549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1246549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 12475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 12485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 12523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 12533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 12543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 12553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1256b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 12573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 12583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 12593239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1260b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 12613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 12623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 12635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 12645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 12675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 12685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 12695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 12725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 12765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 12775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1278835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 12793c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1280835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 12810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 12823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1283835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart ClearCachedCredentials(service); 1284835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1285835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 12860427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 12870427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 12880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 12890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 12900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 12910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 12920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1293381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1294381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1295381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 12963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1297381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1298381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1299381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1300381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1301381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1303381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1304381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1305381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1306381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1307381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1308381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1309381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1310381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1311ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1312316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1313316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1314316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1315316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1316b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1317316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1318316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1319316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1320316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1321316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1322316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1323316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1324316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1325316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1326b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1327ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1328ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1329316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart Mock::VerifyAndClearExpectations(service); 1330316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1331316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1332316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1333316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 1334b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false)) 1335316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1336316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1337ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1338ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1339381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1340381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1342381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1343381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1344381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1345381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1346381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1347381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1348381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1349381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1350381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1351381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1353381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1354381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1355381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1356381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1357381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1358381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1359381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1360381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 13615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 13625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 13633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 13653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 13663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 13682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 13703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13723239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 13733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 13765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 13775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 13785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 13795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 13805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 13815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 13825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 13835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 13883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 13893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 13942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 13952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 13963c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1400f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 14032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1405c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1407c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1408c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14093c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1419c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1420c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14213c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1423c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 14260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1427c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 14283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1429c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1431c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1432c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14333c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1435c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 14372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1440c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1441c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14423c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 14432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 14452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1447c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1448c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 14495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 14502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 14512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 14522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1454f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 14572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 14595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 14810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 14825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 14835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 14842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 14935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 15025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1504ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1505ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15063c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15075c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1508ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1509ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 15105f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 15115f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 15122f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1513ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1514ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1515ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 15175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15245f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 15255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 15265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 15270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 15280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 15290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 15345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1536ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1537ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1539ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1540ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15415f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 15425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 15432f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1544ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1545ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1546ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 15485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 15545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 15575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 15615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1563ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1564ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15653c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 15670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 15683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 15693c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 15705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 15713ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 15720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1573ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1575ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1576ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1577ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 15795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 15840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 15855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 15865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 15875f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 15885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 15890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 15905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1591df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 15925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 15935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 15983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1599e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 16003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1601e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 16023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1603e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 16043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1605e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 16067fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 1607e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1608e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1609e41a72d0737488d561a4158019409d5785dad61bThieu Le 1610e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 1611e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1612e41a72d0737488d561a4158019409d5785dad61bThieu Le 1613e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1614e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1615e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1616e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1617e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1618e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1619e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1620e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1621e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1622e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1623e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1624e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 16253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 16283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16293c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 16303c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16313c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 16323c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 16333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 16343c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 16413c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 16433c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 16443c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 1646b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 16470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 1648e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 1649b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1650e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 1651e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 16528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 16538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 16548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 16558a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16573c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16633c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16643c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16658a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 1667261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1668261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1669261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 1670261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16723c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 16793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1681835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 1682835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 16833c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 16840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 1685835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1686835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1688835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 16920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1693835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1694835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 1695a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 1696a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 16973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 16983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 1699835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 1700835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1701835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 17020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 17030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 17050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17084943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 17094943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17104943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17114943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 17124943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 17130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17144943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 17154943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17164943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 17174943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 17184943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 17190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17204943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 17214943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17224943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 17233c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17253c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 17260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 17300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17313c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 17320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 17333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 17340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17363c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 17373c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 17383c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 17393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17403c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 17410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 17423c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 17463c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 17493c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 17500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 17520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 17530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 17550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17562b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 17570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 17603c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 17613c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 17620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 17633c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17644943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 17680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 17690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 1770835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1771835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 1772af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan scoped_ptr<MockSupplicantNetworkProxy> network_proxy( 1773af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 1774af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 1775af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 1776af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 1777835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 1778735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 17804943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 17814943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17824943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 17830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 17844943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17854943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 17864943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17874943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 17884943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 17894943822214f823c2437aa32b0376414b3e60388dPeter Qiu ::DBus::Path kPath("/fake/path"); 17900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 17914943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17924943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 17934943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17944943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 17954943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 17964943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 17974943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17984943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 17994943822214f823c2437aa32b0376414b3e60388dPeter Qiu scoped_ptr<MockSupplicantNetworkProxy> network_proxy( 18004943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 18014943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 18024943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 18034943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 18044943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)); 18054943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 18064943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 18074943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 18084943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18090654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18113c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 18130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 1814c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 18153c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18163c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 18170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 1819c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 18203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1821c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 1822c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 1823c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 1824c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 18250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 1827c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 1828c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 18290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 18300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 18314943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18334943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), 18340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18373c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 18380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 18390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 18400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18422b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 18434943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18444943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18454943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 18464943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18472b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 18482b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 18491aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 18501aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 18511aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal DBus::Path kPath("/fake/path"); 18520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18531aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18541aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 18551aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 18561aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 18571aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18581aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18591aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 18601aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 18611aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18621aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 18631aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 18640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 18661aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18671aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 18681aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18691aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 18701aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 1871d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 1872d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1873d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1875d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1876d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1877d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1878d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1879d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1880d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1881d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 1882d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1883d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1884d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 1885d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(service0); 1886d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1887d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1888d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1889d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1890d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 1891d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1892d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1894d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1895d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(), 18960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1897d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1898d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1899d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1900d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1901d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1902d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 1903d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 1904d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 1906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 1909d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(service0); 1910d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1911d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1912d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1913d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 19180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1923d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 1926d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1928d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(service0); 1933d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1934d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1935d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1936d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 193717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 19389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 193917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 194017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 19419f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 19429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 194344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 194444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 194517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 194617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 194717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 19480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 19490d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 19500d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 195117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 195217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 195317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 195433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 195517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 19560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 195744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 1958a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 195944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 1960a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 1961a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1962a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 19630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 19650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 196617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 19670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 196833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 196933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 197017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart Mock::VerifyAndClearExpectations(service); 19710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 19720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 19730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 197417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 197517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 197617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 19772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 19782b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 19792b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 19810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 19822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 19832b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 198417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 198517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 19860d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 19870d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 19880d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 198917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 199017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 199117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 199217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 19933c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 19940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 19950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 19960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 19970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 19980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 19993c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 20000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 20013c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 20020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20050ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 20063c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20073c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 20080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 20093c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 20100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 20110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 20120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 20130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 20143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 20150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 20170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20195c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2020c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 20213c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 20223c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 20230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 20243c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 20250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 20263c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 20280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 20300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2032c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2033b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2034c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 20355c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 20365c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2037549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20393c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20403c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 20410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 20423c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 20433c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20453c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20463c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2048549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 20490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2050549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2051549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2052446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 20533c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 20571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20580654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 20600654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 20611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20620654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2064446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 20651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20660654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 20683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2072446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2073446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 20745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2075a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 20760654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 2077ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 2078ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2079ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2080ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2081ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 2082ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 2083ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 2084ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2085ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2086ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2087ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 20883c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 20893c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 20903c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 20923c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 20930654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 20943c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 2095ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2096ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 20975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 20985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 21003c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 21013c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 21023c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21033c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 21043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 21055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 21065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 21083c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21093c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 21135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 21185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 21195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 21205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2122ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 21235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21245412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 21255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 21295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 21335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 21345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 21405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21453c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21485412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2149ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2150ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2151ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2152fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2153fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2154fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2155fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2156fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 21573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2159fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2160fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2161fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 21625f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 2163fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2164fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2165fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2166fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 21671e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 21681e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 21691e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 21701e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 21711e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 21721e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 21731e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal .WillOnce(Throw(DBus::Error("don't care", "don't care"))); 21741e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 21751e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 21761e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 21771e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 21781e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 21795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 21805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 21815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 21825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 21835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 21859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 21867de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 21875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 21885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 21902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 21915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 21935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 21945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2196f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2200f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 22015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 22025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 22045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 22055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 22065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 22075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 22085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 22135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 22145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 22155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 22165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 221744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 221844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 221944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 222044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22229f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 22262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22277de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 22335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 22345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 22355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 22365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 22385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 22400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 22415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 22435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2244a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2245a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 22480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 22520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 22542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 22552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 22562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 22575412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 22582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 22595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 22612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 22625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 22635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 22640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 22670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 22682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 22690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 22702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 22710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 22757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 22767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 22777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 22787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 22797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 22800654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 22810654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 22827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 22837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 22847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 22857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 22867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 22877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2288f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 22897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 22907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 22910654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 22927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 22937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 22947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2295d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 22967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 22977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 22987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 22997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 23007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 2301b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2302d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 23037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2305f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2306bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2307bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2308bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 23097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23100654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 23110654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 23120654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 23137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 23147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23163c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 23173c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 23187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2320a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2321a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2322a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2323a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2324f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2325a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2326a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2327a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2328a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2329a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2330a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2331a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2332a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2333a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2334a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2335a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2336a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2337a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2338a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2339a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2340f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2341a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23420654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 23430654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2344a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2345a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2346a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2347a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2348a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2349a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2351a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2352a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2353a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 23542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2355a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23560654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 23570654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2358a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 23590654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2360a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2361a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23621590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 23631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 23643c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 23653c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 23660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr); 23671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 23684943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 23690654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 23700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 23710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2372687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 23731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 23741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 23751590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 23761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 23773c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 23780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 23793c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 23803c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 23810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 23823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 23831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2384c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2385c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2386c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2387c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 23883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 23893c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 23903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2391bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2392a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 23930654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 23943c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2395687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 23963c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service0); 23973c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1); 23981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 23991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2400e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2401e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 24020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 24030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 24040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 24053c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 24060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 24073c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24083c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 24093c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 24113c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2412687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 24130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2414687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2415687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2416687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2417687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2418687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2419687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2420687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2421687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2422687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2423687350531096cacc379c209e39e63e5316eee5c0Paul Stewart Mock::VerifyAndClearExpectations(ipconfig); 2424687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24254eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 24264eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 24278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 24288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24293c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 24300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 24328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24333c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 24340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 24360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24378a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24388a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 243949c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 244049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 244149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ::DBus::Path bss_path; 244249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 244349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 24440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, &bss_path)); 244549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 24460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 244749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 244849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 244949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 245049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 245149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 245249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 245349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 245449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 245549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 24560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 245849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 245949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 246049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 24618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 24628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 24643c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 24678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 24694a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 24700654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 24719d97b7deda3ae604d718873207a951f62d418b34Paul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) && 24720654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 24734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 24744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 24754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 24764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 24773c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 24780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2479a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 24810654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 24824d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 24834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 24844d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 24854a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 24864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 24873c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 24880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2489a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 24903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 24914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 24924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 24934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 24944a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 24954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2496f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 24974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 24984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 24994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25003c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 25013c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 25023c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25030654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 25044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 25074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 25083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 25093c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 25103c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25124a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25140654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 25204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 25214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 25250654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 25264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25283c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 25293c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25304a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25330654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 25394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25415c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 25425c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 25430654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 25445c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 25453c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25465c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 25473c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 25485c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 25495c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 25505c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 25510654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25525c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 25535c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2556c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2557c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 25583c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 25590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 2560c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2561c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2562c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2563c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2564c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2565c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 2566c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal Mock::VerifyAndClearExpectations(service); 2567c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2568c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2569c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2570c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 25713c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 25720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 25738f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2574c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 25758f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 25768f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 25770654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 25785519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 25793c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 25803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 25813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 25828f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 25838f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 25845519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 25855519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 25863c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 25873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 25883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 25890654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2590c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2591c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2592b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2593b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2594b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2595b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2596b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2597b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 2598b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2599b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2600b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2601b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2602b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2603b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2604b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 2605b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 2606b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 2607b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 2608b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 26093c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 26100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 26110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 26123c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2613b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 2614b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 2615b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 2616b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2617b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 26185c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 26195c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 26205c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 26215c05b2920be742d518829972127172481722058dmukesh agrawal 26225c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 26235c05b2920be742d518829972127172481722058dmukesh agrawal 26245c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 26255c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 26265c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 26273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 26285c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 26295f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1); 26302f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 26315c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 26325c05b2920be742d518829972127172481722058dmukesh agrawal} 26335c05b2920be742d518829972127172481722058dmukesh agrawal 26345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 2636b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2637b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2638b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2639b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2640b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26427de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 26430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2644b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 2645b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2646b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2647b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2648b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2649b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 26515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 26525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 26545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 26555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 26560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 26595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 26605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2664b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 2665b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2666b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2667b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2668b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2669b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2670b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 2671b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 2672b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 26735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2674b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2675b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2676b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2677b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2678b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2679b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 2680b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2681b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 26823c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 26830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr); 2684b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2685b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2686b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2687b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 26885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2689b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2690b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2691b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2692b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2693b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 2695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2698b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 2700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2703b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 2704b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 2713b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 27215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 27225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 27235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 27255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 27265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 27275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 2728a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 27295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 27315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 27325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 27335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 27345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 27365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 2738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 27410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2742df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 27433c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 27443c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 27453c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 2746a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 27473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27483c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 27495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 27500654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2751b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2752b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2754b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 2755b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2756b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2758b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2759df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 27603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27613c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 27620654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2763b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2764b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2765b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27663c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 27673c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 27682ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 27692ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 27703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 27712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 27723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 27733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 27743c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 27752ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 27762ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 27772ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 27783c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 27793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 2780daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 27813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 27822ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 27832ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 27842ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 27852ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 27862ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 27872ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 27882ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 27892ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 27902ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 27912ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 27922ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 27932ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 27943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 2795daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 2796daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1); 27973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 27983c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 27993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 28003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 2801cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 2802f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2803bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 28040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2805cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2806cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2807bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 2808f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 28090654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2810bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2811bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 2812bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 28130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 28141369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2815bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 28161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 2817cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2818cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2819f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 2820f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 2821f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 2822f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 2823a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 2824f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 2825f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 2826f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2827f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 2828f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 2829f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 2830f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2831f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2832b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2833f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 2834f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 2835f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2836f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2837f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2838f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2839f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 2840f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2841f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2842f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 2843f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 2844f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 2845f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 2846f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2847f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2848f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 2849f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 2850f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2851f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2852f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 2853f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 2854f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 28550d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 28560d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 28570d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2858f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2859f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2860f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2861f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 2862f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 2863f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2864f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 28650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 28660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 28670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2868f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2869f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2870f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2871f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 2872f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 2873f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2874f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 2875f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 28760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 28770d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 28780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2879f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2880f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 2881f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 28821369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 2883f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2884735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2885735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2886735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 2887735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2888735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2889bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 28900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2891bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2892bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2893bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 28941369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2895bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 28961369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 2897bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2898bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2899bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2901bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2902bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2903bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2904bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 29050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29061369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29071369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29081369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 2909f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 2910cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 29110654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2912cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2913a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 2914bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2915f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 29164943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2917735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2918cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2919f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 29200654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 29211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29231369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 2924f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 29251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 29261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 2927735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2928735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 29294943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2930735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 2931735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 2932735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 2933735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2934735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2935bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2936735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 29371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 293839a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 2939735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 29400654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2941cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2942cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2943e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 2944e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 29451aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 2946e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 29471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 2948e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2949e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 2950e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 2951e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2952e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 2953e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 2954e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 29551aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 2956e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 2957e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 2958e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 2959e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2960e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 2961e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 2962e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 2963e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 2964e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 2965e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 2966e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 2967e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 2968e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 2969e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 2970e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2971e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2972e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 2973e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 2974e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2975e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 2976e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2977e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 2978e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 2979e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 2980e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2981e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 2982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 2983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 2984e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 2985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 2986e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 29871aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 29880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 2989e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 2990e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 2991e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2992e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2993e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 2994e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 2995e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2996e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 2997e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2998e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 2999e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3006e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30071aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 30081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 30091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30103c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 30110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 30121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 30191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 30251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 30331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 30351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30367cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 30377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 30387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 30417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 30427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 30430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 30447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 30457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30475412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 30487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 30497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 30507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 30527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 30530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 30547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 30557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 30577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 30587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 30597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 30607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 30617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 30637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 30647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 30657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 30667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 30677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 30687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 30697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 30727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 30737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 30745412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 30757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 30777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 30787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 30797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 30807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 30817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 30827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 30837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3084baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3085baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3086baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3087baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 30887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 30897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 30907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 30917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 30927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 30937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 30947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 30957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 30967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 30977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 30987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3099baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 31007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3101baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3102baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3103baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3104baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3105baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3106baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3107baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3108baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3109baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3110baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3111baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3112baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3113baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3114baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3115baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3116baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3117baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3118baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3119baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3120baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3121baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3122baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3123baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3124baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3125baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3126baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3127baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3128baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3129baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3130baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3131baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3132baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3133baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3134baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3135baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3136baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3137baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3138baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3139baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3140baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3141baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3142baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3143baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3144baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3145baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3146baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3147baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3148baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 31497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 31507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 31527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 31538e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 31547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 31557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 31567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3157baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3158baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3159baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3160baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3161baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3162baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3163baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3164baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3165baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3166baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3167baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3168baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3169baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3170baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3171baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3172baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3174baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3175baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3176baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3177baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3178baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3179baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3180baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3181baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3182baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3183baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3184e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3185e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3186e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3187e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3188e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3189e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3190e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3191e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3192e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3193e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3194e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3195e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3196e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3197e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3198e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3199e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3200e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3201e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3202e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3203e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3204e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3205e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3206e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3207e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3208e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3209e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3210e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3211e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3212e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3213e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3214e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3215e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3216e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3217e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3218e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3219e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3220e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 32218e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 32228e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3223e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3224e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3225e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3226e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3227e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3228e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 32297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 32307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3231bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3232f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3233bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3234bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3235bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3236bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3237bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 3238bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3239bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3240bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3241bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3242bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3243bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3244bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3245bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 32467fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 32470654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 3248bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3249bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3250bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3251bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3252bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3253bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3254bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 32550654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 3256bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 3257bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3258bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3259db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3260db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3261db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 326211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3263db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3264db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3265735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3266735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3267735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3268735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3269db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3270db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3271db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3272f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3273db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3274735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3275db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3276735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3277735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(service); 3278735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3279db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3280735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3281735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3282735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 32830d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 32840d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 32850d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3286735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 328711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 328811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 328911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 329011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 329111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 329211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 329311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 329411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 329511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 329611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 329711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 32980d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 32990d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33000d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 330111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 330211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 330311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 330411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 330511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 330611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 330711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 330811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 33090d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 331011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 331111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 331211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 331311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 331411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3315bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3316bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3317c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3318c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3319c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3320c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3321c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3322c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3323c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3324c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3325c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3326c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3327c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3328c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 33296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 33306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 33316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 33326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 33336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 33347fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 33356d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 33366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 33376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33386d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 33396d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 33406d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 33416d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 33426d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 33436d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 33446d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 33456d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 33466d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 33476d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 33486d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 33496d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 33506d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 33516d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33526d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 33536d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 33546d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 33556d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 33566d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 33576d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33586d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 33596d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 33606d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 33616d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 33626d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 33636d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 33646d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 33657347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 33667347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 33676d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 33685581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 33695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 33705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 33715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 33725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 33735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 33745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 33755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 33765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 33775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 33785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 33795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 33800654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 33815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 33825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 33835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 33845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 33855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 33865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 33875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 33880654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 33890654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 33900654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 33910654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 33920654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 33930654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 33940654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 33950654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 33965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 33975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 33985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 33995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 34085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 34095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34100654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 34110654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 34125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 34135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 34175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 34185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34190654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 34200654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 34215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 34225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 34265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 34275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34280654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 34290654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 34305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 34355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 34365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 34385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 34415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 344250cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 344350cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 344450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 344550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 344650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 3447bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 3448bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 3449bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 3450bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 3451bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3452bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 34537fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 3454bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3455bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3456bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3457bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3458bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3459bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3460bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3461bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3462bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 3463bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3464bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 34657fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 3466bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3467bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3468bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3469bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3470bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3471bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3472bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3473bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3474bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 3475bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3476bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3477bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 3478bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3479bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3480bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 3481bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 34820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 34830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 34840cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 34859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 34860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 3487a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3488a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3489a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3490a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3491a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 34920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 34930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 34947de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 34950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 34960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 34970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 34980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 34990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35020cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 35039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 35040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 35050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 35069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 35079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 35089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 35090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35100cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3511a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 35120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 35180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 35190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35250cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 35269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 35270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 35280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 35299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 35309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 35310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 35340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3535a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3537a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 35400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 35410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 3547df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 35489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3549df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 35509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 35519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 3552df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3553df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 3554a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3555a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 3556a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 35579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3558df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3559df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3560df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3561df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 3562df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 3563df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 3564df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 3565df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3566df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3567df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3568df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3569df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3570b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 3571b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3572b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 3573df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 3574b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 3575b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3576df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 3577df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3578df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 3579df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3580a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3581df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3582b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 3583b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 3584b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 3585b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3586df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 3587df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3588df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3589df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 3590df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3591a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3592df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3593df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3594df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3595df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 3596df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3597df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3598df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 35990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 3600df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 36019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3602df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3603df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 3604a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3605a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3606df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 36070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3608df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 3609df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3610df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 3611a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3612a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 36139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3614df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3615df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3616df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3617df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 3618df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 3619df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 36200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3621df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3622df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3623df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 36240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 3625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3626a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3627a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 3628df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3629df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3630df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 36319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3633a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3634df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 3635df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 3636df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 3637df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 3638df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 3639df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3640df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3641df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3642f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 3643f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3644a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 3645df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 3646df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 3648df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3649df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3650df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 36510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 36520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 36530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 3654df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 36559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3656df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 3658df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 3659a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3660a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3661f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 3663df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3665df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 3666a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3667df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3668df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3669df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3670df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3671df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3672df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3674df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 3675df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 3676f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 3677a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 3678a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 36792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 3680df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 3681a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 3682a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3683a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3684a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3685df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 3686df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 3687a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 3690a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3691df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3692df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 3694a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3698df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 3699df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3700df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 3701df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 3702df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 3703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 3705a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 3706df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 3707df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 3708df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3709df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3711df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3712df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 37133bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 37143bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 37150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 37163bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 37173bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37183bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 37192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 37203bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 37213bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 37223bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37233bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 37247de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 37253bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 37263bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 37273bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 37283bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 37302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 37312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 37332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 37342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 37352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 37362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 37372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 37382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 37402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 37412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 37422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 37432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 37452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 37462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 37482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 37492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 37502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 37512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 37522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 37532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 37542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 37552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 37562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 37572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 37582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 3759c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 3760df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 3761df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 3762df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3763df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3764df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3765df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3766df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3767df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3768df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3769df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 3770df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 3771df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3772df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3773df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3774df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3775df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3776df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3777df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3778df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3779df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 3780df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 3781df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3782df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3783df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 3784df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3785df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 3786df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3787df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3788df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3789df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3790df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 3791df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 3792df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3793df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3794df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3795df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3796df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3797df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3798df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3799df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3800df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 3801df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 3802df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3803df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 3804df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3805c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 3806c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 3807c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kPeer[] = "00:11:22:33:44:55"; 3808c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3809c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3810c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3811c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 3812c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3813c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3814c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3815c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3816c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3817c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error)); 3818c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // This is not a valid IP address nor is it a MAC address. 3819c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3820c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3821c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3822c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kAddress[] = "192.168.1.1"; 3823c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3824c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3825c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3826c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // The provided IP address is not local. 3827c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3828c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(false)); 3829c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3830c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3831c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3832c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3833c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3834c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3835c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3836c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3837c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // If the MAC address of the peer is in the ARP cache, we should 3838c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // perform the TDLS operation on the resolved MAC. 3839c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kResolvedMac[] = "00:11:22:33:44:55"; 3840c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const ByteString kMacBytes( 3841c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac)); 3842c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3843c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(true)); 3844c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _)) 3845c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true))); 3846c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 3847c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart TDLSDiscover(StrEq(kResolvedMac))); 3848c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3849c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3850c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3851c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3852c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3853c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3854c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3855c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3856c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 3857c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 3858c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3859c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3860c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3861c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3862c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3863c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3864c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3865c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3866c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3867c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3868c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3869c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3870c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3871c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3872c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3873c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3874c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3875c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3876c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3877c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3878c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3879c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3880c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3881c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3882c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3883c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3884c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3885c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3886c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3887c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3888c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3889c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3890c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3891c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3892c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3893c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3894c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3895c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 3896c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 3897c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 3898c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 3899c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 3900c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 3901c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 3902c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3903c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 3904c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3905c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 3906c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3907c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 3908c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3909c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3915c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3916c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3917c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3918c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3919c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3920c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3921c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3922c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3923c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3924c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3925c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3926c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3927c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3928c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3929c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3930c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3931c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3932c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3933c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 3934c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3935c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3936c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3937c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3938c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 3939c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3940c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3941c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 3942c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 39433946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 39443946da840142cd386d628c0e879459f8976bd86dmukesh agrawal Nl80211Message new_wiphy_message( 39453946da840142cd386d628c0e879459f8976bd86dmukesh agrawal NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString); 39463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 39473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal CreateStringAttribute(Nl80211AttributeWiphyName::kName, 39483946da840142cd386d628c0e879459f8976bd86dmukesh agrawal Nl80211AttributeWiphyName::kNameString); 39493946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 39503946da840142cd386d628c0e879459f8976bd86dmukesh agrawal SetStringAttributeValue(Nl80211AttributeWiphyName::kName, 39513946da840142cd386d628c0e879459f8976bd86dmukesh agrawal "test-phy"); 39523946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 39533946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 39543946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // TODO(quiche): We should test the rest of OnNewWiphy, which parses 39553946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // out frequency information. 39563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 39573946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 39583946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 39593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 39603946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 39613946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 39623946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 39633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 39643946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 39653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 39663946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 3967397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, AddRemoveWakeOnPacketConnection) { 3968397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const string ip_string1("192.168.0.19"); 3969397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const string ip_string2("192.168.0.55"); 3970397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const string ip_string3("192.168.0.74"); 3971397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddress ip_addr1(ip_string1); 3972397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddress ip_addr2(ip_string2); 3973397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan IPAddress ip_addr3(ip_string3); 3974397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan Error e; 3975397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 39769c73d221484fbd719072261ff288373ce866693fSamuel Tan // Add and remove operations will fail if WiFi device does not support 39779c73d221484fbd719072261ff288373ce866693fSamuel Tan // pattern matching. 39789c73d221484fbd719072261ff288373ce866693fSamuel Tan AddWakeOnPacketConnection(ip_addr1, &e); 39799c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kNotSupported); 39809c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 39819c73d221484fbd719072261ff288373ce866693fSamuel Tan "Wake on IP address patterns not supported by this WiFi device"); 39829c73d221484fbd719072261ff288373ce866693fSamuel Tan RemoveAllWakeOnPacketConnections(&e); 39839c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kNotSupported); 39849c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 39859c73d221484fbd719072261ff288373ce866693fSamuel Tan "Wake on IP address patterns not supported by this WiFi device"); 39869c73d221484fbd719072261ff288373ce866693fSamuel Tan RemoveWakeOnPacketConnection(ip_addr2, &e); 39879c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kNotSupported); 39889c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 39899c73d221484fbd719072261ff288373ce866693fSamuel Tan "Wake on IP address patterns not supported by this WiFi device"); 39909c73d221484fbd719072261ff288373ce866693fSamuel Tan 39919c73d221484fbd719072261ff288373ce866693fSamuel Tan // Add operation will fail if pattern matching is supported but the max number 39929c73d221484fbd719072261ff288373ce866693fSamuel Tan // of IP address patterns have already been registered. 39939c73d221484fbd719072261ff288373ce866693fSamuel Tan GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kIPAddress); 39949c73d221484fbd719072261ff288373ce866693fSamuel Tan *GetWakeOnWiFiMaxPatterns() = 0; 39959c73d221484fbd719072261ff288373ce866693fSamuel Tan AddWakeOnPacketConnection(ip_addr1, &e); 39969c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_EQ(e.type(), Error::kOperationFailed); 39979c73d221484fbd719072261ff288373ce866693fSamuel Tan EXPECT_STREQ(e.message().c_str(), 39989c73d221484fbd719072261ff288373ce866693fSamuel Tan "Max number of IP address patterns already registered"); 39999c73d221484fbd719072261ff288373ce866693fSamuel Tan 40009c73d221484fbd719072261ff288373ce866693fSamuel Tan *GetWakeOnWiFiMaxPatterns() = 50; 4001397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan GetWakeOnPacketConnections()->Clear(); 4002397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 4003397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr1, &e); 4004397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 4005397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4006397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4007397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4008397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4009397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr2, &e); 4010397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4011397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4012397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4013397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4014397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4015397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr3, &e); 4016397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 3); 4017397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4018397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4019397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4020397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4021397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveWakeOnPacketConnection(ip_addr2, &e); 4022397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4023397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4024397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4025397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4026397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 40279c73d221484fbd719072261ff288373ce866693fSamuel Tan // Remove fails if no such address is registered. 4028397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveWakeOnPacketConnection(ip_addr2, &e); 4029397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(e.type(), Error::kNotFound); 4030397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_STREQ(e.message().c_str(), 40319c73d221484fbd719072261ff288373ce866693fSamuel Tan "No such IP address match registered to wake device"); 4032397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4033397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4034397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveWakeOnPacketConnection(ip_addr1, &e); 4035397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 4036397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4037397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4038397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4039397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4040397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan AddWakeOnPacketConnection(ip_addr2, &e); 4041397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 4042397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4043397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4044397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4045397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4046397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RemoveAllWakeOnPacketConnections(&e); 4047397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 0); 4048397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 4049397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 4050397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 4051397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4052397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4053397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RequestWakeOnPacketSettings) { 4054397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL( 4055397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan netlink_manager_, 4056397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4057397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan GetWakeOnPacketConnMessage::kCommand), 4058397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan _, _, _)).Times(1); 4059397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RequestWakeOnPacketSettings(); 4060397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4061397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 40625f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettings) { 4063397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan ScopedMockLog log; 4064397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan const uint8_t kResponseNoIPAddresses[] = { 4065397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 4066397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00}; 40675f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan const uint8_t kResponseIPV40WakeOnDisconnect[] = { 40685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x50, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 40695f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x75, 0x00, 40705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x04, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 40715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 40725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40735f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40745f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00}; 40755f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request 40765f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // indicating that there are no wake-on-packet rules programmed into the NIC. 40775f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan scoped_ptr<uint8_t[]> message_memory1( 4078397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan new uint8_t[sizeof(kResponseNoIPAddresses)]); 40795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan memcpy(message_memory1.get(), kResponseNoIPAddresses, 4080397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan sizeof(kResponseNoIPAddresses)); 40815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan nlmsghdr *hdr1 = reinterpret_cast<nlmsghdr *>(message_memory1.get()); 40825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnMessage msg1; 40835f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan msg1.InitFromNlmsg(hdr1); 4084397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan // Successful verification. 4085397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 4086397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4087397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified"))); 40885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan VerifyWakeOnWiFiSettings(msg1); 4089397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan // Unsuccessful verification. 4090397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1")); 40915f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 40925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected"))); 40945f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan VerifyWakeOnWiFiSettings(msg1); 40955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 40965f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request 40975f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // indicating that that the NIC wakes on packets from 192.168.10.20 and on 40985f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // disconnects. 40995f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->Clear(); 41005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->clear(); 41015f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan scoped_ptr<uint8_t[]> message_memory2( 41025f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan new uint8_t[sizeof(kResponseIPV40WakeOnDisconnect)]); 41035f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan memcpy(message_memory2.get(), kResponseIPV40WakeOnDisconnect, 41045f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan sizeof(kResponseIPV40WakeOnDisconnect)); 41055f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan nlmsghdr *hdr2 = reinterpret_cast<nlmsghdr *>(message_memory2.get()); 41065f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnMessage msg2; 41075f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan msg2.InitFromNlmsg(hdr2); 41085f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Successful verification. 41095f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->AddUnique(IPAddress("192.168.10.20")); 41105f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 41115f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect); 41125f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41135f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified"))); 41145f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan VerifyWakeOnWiFiSettings(msg2); 41155f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Unsuccessful verification. 41165f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->erase(WakeOnWiFi::kDisconnect); 4117397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4118397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected"))); 41195f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan VerifyWakeOnWiFiSettings(msg2); 4120397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4121397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4122397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RetrySetWakeOnPacketConnections) { 4123397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan ScopedMockLog log; 4124397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan *GetNumSetWakeOnPacketRetries() = WiFi::kMaxSetWakeOnPacketRetries - 1; 4125397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL( 4126397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan netlink_manager_, 4127397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4128397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SetWakeOnPacketConnMessage::kCommand), 4129397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan _, _, _)).Times(1); 4130397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RetrySetWakeOnPacketConnections(); 4131397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(*GetNumSetWakeOnPacketRetries(), 4132397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan WiFi::kMaxSetWakeOnPacketRetries); 4133397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4134397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 4135397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4136397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached"))); 4137397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan RetrySetWakeOnPacketConnections(); 4138397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_EQ(*GetNumSetWakeOnPacketRetries(), 0); 4139397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4140397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 41415f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, ApplyWakeOnWiFiSettings) { 41425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Disable wake on wifi if there are no wake on wifi triggers registered. 41435f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL( 41445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan netlink_manager_, 41455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 41465f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SetWakeOnPacketConnMessage::kCommand), 41475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan _, _, _)).Times(0); 4148397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(netlink_manager_, 41495f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 41505f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan ApplyWakeOnWiFiSettings(); 41515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 41525f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // Otherwise, program the NIC. 41535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan IPAddress ip_addr("1.1.1.1"); 41545f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->AddUnique(ip_addr); 41555f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 41565f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_FALSE(GetWakeOnPacketConnections()->Empty()); 41575f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL( 41585f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan netlink_manager_, 41595f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 41605f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SetWakeOnPacketConnMessage::kCommand), 41615f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan _, _, _)).Times(1); 41625f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 41635f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 41645f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan ApplyWakeOnWiFiSettings(); 41655f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan} 4166397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 41675f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiSettingsAppliedBeforeSuspend) { 41685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // When wake_on_packet_connections_ is empty, disable wake on WiFi. 41695f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL( 41705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan netlink_manager_, 41715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 41725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SetWakeOnPacketConnMessage::kCommand), 41735f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan _, _, _)).Times(0); 4174397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL(netlink_manager_, 41755f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 41765f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan OnBeforeSuspend(); 41775f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 41785f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 41795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan // When wake_on_packet_connections_ is not empty, program NIC to wake on 41805cce42f7250f04fd114c6312d456a7d6d3aa055fSamuel Tan // IP address patterns. 41815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan IPAddress ip_addr("1.1.1.1"); 41825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnPacketConnections()->AddUnique(ip_addr); 4183397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan EXPECT_CALL( 4184397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan netlink_manager_, 4185397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4186397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan SetWakeOnPacketConnMessage::kCommand), 4187397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan _, _, _)).Times(1); 41885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 41895f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 41905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan OnBeforeSuspend(); 41915f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_FALSE(GetWakeOnWiFiTriggers()->empty()); 41925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kIPAddress) != 41935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->end()); 41945f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan} 41955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan 41965f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiDisabledAfterResume) { 41975f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect); 41985f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress); 41995f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_CALL(netlink_manager_, 42005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 42015f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan OnAfterResume(); 42025f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 4203397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan} 4204397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan 4205853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4206