wifi_unittest.cc revision 050c073a14d89a426f3e5cfa09ec11d0f12e7757
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 5d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/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> 10ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu#include <netlink/attr.h> 115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h> 12f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1711c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h> 187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.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" 30397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h" 317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 32b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 33853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 35084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h" 36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 37c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 38f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h" 39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h" 4011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 41e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 42687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h" 433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 44cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 452ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 463426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 4710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 48af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h" 49a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 5002e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h" 518d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h" 5202e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h" 538d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h" 548d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h" 5502e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h" 5602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h" 5702e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h" 58dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 60da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h" 61da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h" 62da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h" 63da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h" 64da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h" 65da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h" 6685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 67af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h" 68d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h" 69d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h" 70d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wake_on_wifi.h" 71d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_provider.h" 72d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h" 73d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/scan_session.h" 74d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wake_on_wifi.h" 75d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h" 76d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_service.h" 77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 780e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 79a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf; 80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set; 82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 83ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr; 84853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 873c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 89a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 90cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 93b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 94549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 100dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 101d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 10211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref; 103853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 104af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew; 105ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 106ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 108a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 109a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 110853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 1113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1128ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 114853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 115853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 122c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234; 123125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhuconst char kSupplicantNameOwner[] = "9999"; 124ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiuconst char kNl80211AttrWiphyNameStr[] = "NL80211_ATTR_WIPHY_NAME"; 1255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 1275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 129853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 1303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 1310afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan : metrics_(nullptr), 1323946da840142cd386d628c0e879459f8976bd86dmukesh agrawal device_( 1333946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new WiFi(control_interface(), dispatcher(), &metrics_, 1343946da840142cd386d628c0e879459f8976bd86dmukesh agrawal manager(), "wifi", "", kInterfaceIndex)) { 135853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 1363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 137853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 138853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 1393946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMetrics metrics_; 1408abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 141853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 142853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 144f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_TRUE(device_->store().Contains(kNameProperty)); 145de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 146853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 147853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 149a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 150a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1516bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 152de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 153f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanSignalThresholdProperty, 154a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 155a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 156a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 157a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 158a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1596bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(), 160f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanIntervalProperty, 1616bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kUint16V, 1626bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 163a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 164853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 165a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 166a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1676bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(), 168f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanningProperty, 1696bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kBoolV, 1706bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 171bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise 1729d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 173a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 174853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1776bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 1784d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 179f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 1804d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant( 1810654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodSimple), 1824d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1844d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1864d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1876bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty( 1884d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 189f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 1904d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant("not a real scan method"), 1914d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1924d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1934d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 1944d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1954a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 1960654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 1978abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 1984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 1994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 201e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 202e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 203f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 2050654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 2068abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2078abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal ::DBus::Error error; 2086bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 2098abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), 210f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 211f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn), 2128abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 2130654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 214e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 215f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2160654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 2178abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2188abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal EXPECT_TRUE(DBusAdaptor::ClearProperty( 219f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan device_->mutable_store(), kBgscanMethodProperty, &error)); 220e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 221f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 2234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 2248abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 2258abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2263c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 2273c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 2283c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 2293c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 2303c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 2313c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 2323c5040174273386868cc8dea8044d22c465885d8Paul Stewart 2335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 234e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 2353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 236bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie explicit WiFiObjectTest(EventDispatcher *dispatcher) 237e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 2380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan metrics_(nullptr), 2390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan manager_(&control_interface_, nullptr, &metrics_, &glib_), 240e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 241fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_, 242fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan kDeviceName, kDeviceAddress, kInterfaceIndex)), 2433c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 244fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan mac80211_monitor_(new StrictMock<MockMac80211Monitor>( 245fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold, 246fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan base::Closure(), &metrics_)), 247084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_service_proxy_(new MockDBusServiceProxy()), 248dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 249af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()), 250af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)), 251084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_(new DBusManager()), 2520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 253735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 2543c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 255af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new NiceMock<MockSupplicantInterfaceProxy>()) { 2563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->mac80211_monitor_.reset(mac80211_monitor_); 2575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 258fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan InstallMockWakeOnWiFi(); 259e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan ::testing::DefaultValue<::DBus::Path>::Set("/default/path"); 260c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2613946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_)) 2623946da840142cd386d628c0e879459f8976bd86dmukesh agrawal .Times(AnyNumber()); 2633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 264b108318d9554032feee1249d51c961e4f90f4561Paul Stewart ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)) 265af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(Return(dhcp_config_)); 266af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true)); 267af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan 268af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateDBusServiceProxy()) 269af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_)); 270af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _)) 271af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_)); 272af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _)) 273af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_)); 274af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _)) 275af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_)); 276af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)) 277af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnNew<NiceMock<MockSupplicantNetworkProxy>>()); 278318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 279ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 280735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 281735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart manager_.dbus_manager_.reset(dbus_manager_); 282735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 2832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 2843c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 2855c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 286bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 2875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 2880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 2895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 2915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 2925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 2935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 2945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 2953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 2965c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2975c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 2983ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 2993ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 300d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 301084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->proxy_factory_ = &proxy_factory_; 302ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = &proxy_factory_; 3030951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko static_cast<Device *>(wifi_.get())->rtnl_handler_ = &rtnl_handler_; 3045c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 3053c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_)); 3062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber()); 307b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 3085c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 3095c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 3105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 3113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 3120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillRepeatedly(Return(nullptr)); 3130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SelectService(nullptr); 314b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 315b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 316b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 3173946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 3180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->proxy_factory_ = nullptr; 3193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 3203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 3213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 3220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Stop(nullptr, ResultCallback()); 3230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->set_dhcp_provider(nullptr); 324084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Stop(); 3250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan dbus_manager_->proxy_factory_ = nullptr; 3263ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 3273ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 328d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 329f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 330f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 331549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 332549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 3333946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 3340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(false); // Stop(nullptr, ResultCallback()); 335549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 336549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 337c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // Needs to be public since it is called via Invoke(). 338c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley void ThrowDBusError() { 339c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley throw DBus::Error("SomeDBusType", "A handy message"); 340c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley } 34117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 3420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 34317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 344c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 3455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 3465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 3475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 3575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 3585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 3615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 3625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 3655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 3665f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<uint16_t> available_frequencies; 3675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 3685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 3695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 3705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 3715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 3725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 3735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 3755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 377f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 3780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr); 3795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 3805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 382fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan void InstallMockWakeOnWiFi() { 383fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_, 38466bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan &metrics_); 385fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_->wake_on_wifi_.reset(wake_on_wifi_); 386fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan } 387fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan 3885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 3895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 3905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 3915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3937347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie void OnTriggerScanResponse(const Nl80211Message &message) { 3945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 3955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 397b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 398b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 399b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie const char *reason) { 400b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 401b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 402b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 4040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 4050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 4060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 4070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 4087fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetRoamThresholdMember(uint16_t threshold) { 409227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie wifi_->roam_threshold_db_ = threshold; 410227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 411227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 4127fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetRoamThreshold(uint16_t threshold) { 413227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->SetRoamThreshold(threshold, nullptr); 414227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 415227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 4167fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t GetRoamThreshold() const { 417227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->GetRoamThreshold(nullptr); 418227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 419227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 4203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 4217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 4227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 4232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Simulate the course of events when the last endpoint of a service is 4243c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 4253c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 426bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 427bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service) 428bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 429bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 430bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 431bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 432bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiEndpointConstRefPtr &endpoint) { 433bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 434bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 435bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4373c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 4383c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart EndpointRemovalHandler *MakeEndpointRemovalHandler( 443bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiServiceRefPtr &service) { 4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 446b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 447b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 448b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char *mode, 4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *ssid, 4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *path, 4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *bssid) { 4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 460a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *ssid = StringPrintf("ssid%d", bss_counter_); 4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 462a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *path = StringPrintf("/interface/bss%d", bss_counter_); 463a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_); 4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) { 4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart const string &ssid, const string &bssid, const string &mode) { 4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 4750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0); 4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t> ssid, const std::string &security) { 4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 486f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kModeManaged, 4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4903c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string &security) { 4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength, 4947fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr *service_ptr) { 4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5163c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path AddEndpointToService( 5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 5207fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr) { 5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 5370951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->ConnectTo(service.get()); 5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 5400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFrom(service.get()); 5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 542d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein void InitiateDisconnectIfActive(WiFiServiceRefPtr service) { 5430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFromIfActive(service.get()); 544d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein } 5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectingService( 5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5493c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 5503c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5513c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path(MakeNewEndpointAndService( 5523c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, &endpoint, &service)); 553a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart if (!network_path.empty()) { 554a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 555a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)) 556a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart .WillOnce(Return(network_path)); 5578e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 5588e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetHT40Enable(network_path, true)); 559a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 560a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 5630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path; 5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5833c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 5893c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 5910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 5923c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 594bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 595b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 597a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 5980654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 5990951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 6003c5040174273386868cc8dea8044d22c465885d8Paul Stewart 6013c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 6023c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 6031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 604d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 605b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 606b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 607b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 6092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 6100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kFullScan, nullptr, __func__); 6112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 6120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kProgressiveScan, nullptr, __func__); 6132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 614c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 6151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetCurrentService() { 6161590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 6171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 618bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void SetCurrentService(const WiFiServiceRefPtr &service) { 619bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 620bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 6213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 622165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 6233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6241590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetPendingService() { 6251590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 6261590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 6272b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &GetPendingTimeout() { 6282b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 6292b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 6301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart const base::CancelableClosure &GetReconnectTimeoutCallback() { 631446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 632446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 6332ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal const ServiceRefPtr &GetSelectedService() { 6342ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal return wifi_->selected_service(); 6352ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal } 6367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const string &GetSupplicantBSS() { 6377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 6387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void SetSupplicantBSS(const string &bss) { 6407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 6417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 6431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 6441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 645b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal const base::CancelableClosure &GetScanTimer() { 646b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 647b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 649e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 6503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 6513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 6523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 6533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() { 6558a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal return dynamic_cast<MockSupplicantInterfaceProxy *>( 6568a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 6573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 6593c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 6603c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 6613c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 6623c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() { 6633c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi(); 6643c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 6653c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 6667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal const string &GetSupplicantState() { 6677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 6687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 669835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart void ClearCachedCredentials(const WiFiService *service) { 670835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 671835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6720427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) { 6730427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 6740427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 675381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan bool RemoveNetwork(const ::DBus::Path &network) { 676381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 677381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 678050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart map<string, ::DBus::Variant> CreateBSSProperties(const string &ssid, 679050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 680050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 681050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 682050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode); 683261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 6843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 6853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 6863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 6873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 6887fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 6893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 690c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 6913c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, true); 6923c3c36a37a885d0a2e180998587af8390744f757Samuel Tan } 6933c3c36a37a885d0a2e180998587af8390744f757Samuel Tan void ReportIPConfigCompleteGatewayArpReceived() { 6943c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, false); 695c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 696050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 697050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Calls the delayed version of the BSS methods. 698050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart void BSSAdded(const ::DBus::Path &bss_path, 699050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const map<string, ::DBus::Variant> &properties) { 700050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAdded(bss_path, properties); 701050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 702050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart void BSSRemoved(const ::DBus::Path &bss_path) { 703050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSRemoved(bss_path); 704050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 705050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 706787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void ReportIPv6ConfigComplete() { 707787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnIPv6ConfigUpdated(); 708787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 709f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 710f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 711f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 712f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 713f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 714f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 715f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 716f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 717f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 7183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 7195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 7205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 7215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 7225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 7235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 7245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 726dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 7273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 7291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 7301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 7317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 7327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 7337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 7345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 7355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 7365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 7377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 7387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 7397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 7407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 7417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 7427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 743baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 7440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 745baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 746cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 747df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 748cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 74911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 75011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const WiFiServiceRefPtr &service, const string &rpcid) { 75111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 75211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 7533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan bool RpcIdByServiceIsEmpty() { 7543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan return wifi_->rpcid_by_service_.empty(); 7553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 756bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 757bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 758b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 759e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 7600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 761e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 7622b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 763a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 764a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 765a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 766a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 767a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 768a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 769a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 770a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 771a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 772a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 773a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 774a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 775a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 7765412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 777a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 778125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu StringCallback supplicant_name_owner_callback; 779125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 780125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu EXPECT_CALL(*dbus_service_proxy_.get(), 781125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu GetNameOwner(WPASupplicant::kDBusAddr, _, _, _)) 782125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated), 783125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu SaveArg<2>(&supplicant_name_owner_callback))); 784125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu 785084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Start(); 7862b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 7870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 788125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 7890951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko // Mimic the callback from |dbus_service_proxy_->GetNameOwner|. 790125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error()); 7913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 7932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 7942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7952f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 796787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnAfterResume()); 7972f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 7982f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7992f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 800fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ResultCallback callback( 801fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 802fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->OnBeforeSuspend(callback); 8032f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 804787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void OnDarkResume() { 805787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ResultCallback callback( 806787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 807787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnDarkResume(callback); 808787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 8093fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void RemoveSupplicantNetworks() { 8103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->RemoveSupplicantNetworks(); 8113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 8123fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void InitiateScan(Device::ScanType scan_type, bool do_passive_scan) { 8133fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->InitiateScan(scan_type, do_passive_scan); 8143fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 8153fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void TriggerPassiveScan() { 8163fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->TriggerPassiveScan(); 8173fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 8182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 819084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7"); 8202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 8212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 8222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 823084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr); 8242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 8252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 8262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 8272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 8282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 829687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 830687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 831687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 832687350531096cacc379c209e39e63e5316eee5c0Paul Stewart void SetIPConfig(const IPConfigRefPtr &ipconfig) { 833687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 834687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 8354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 8364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 8374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 8384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 839f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 8404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 8414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 8424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 8444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 8454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 8464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 8474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 849bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 850bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 851bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 85210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 853db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 854db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 855db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 856db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 857e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 858e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 859e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 860e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 8611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 8621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 8631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 8661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 8671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8693c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 8703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 8713c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 873bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 8741369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 8751369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 8761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 8771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 8783c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 8793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 8803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 8828e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu void OnUnreliableLink() { 8838e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu wifi_->OnUnreliableLink(); 8848e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu } 8858e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 8867fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanShortInterval(const uint16_t &interval, Error *error) { 887bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 888bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 889bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 8907fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) { 891bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 892bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 893bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 894df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 895df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 896df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 897df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 898df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 899df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 900df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 901df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 902df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 903df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 904df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 905df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 906df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 907df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 908df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 909df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 915c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 916df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 917df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 918df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 919df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 9203946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void OnNewWiphy(const Nl80211Message &new_wiphy_message) { 9213946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 9223946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 9233946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 924787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService() { 925787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan return wifi_->IsConnectedToCurrentService(); 926787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 927787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 92810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 92910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 93010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 93110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 93285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 93385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 93485aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 93585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 9363239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 9373239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 9383239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 939d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 940d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 941d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 942d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 943d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 944d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 945d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 946d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 947d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 9483239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 9493239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 9503239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 9513239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 952af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory *proxy_factory() { 953b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 954b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 955b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 9563c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 9573c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 9583c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9593c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9603946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor() { 9613946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 9623946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 9633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 9641964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake() { 9651964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan wifi_->ReportConnectedToServiceAfterWake(); 9661964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan } 9671964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 968fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan MOCK_METHOD1(SuspendCallback, void(const Error &error)); 969fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 970e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 9715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 972fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan MockWakeOnWiFi *wake_on_wifi_; // Owned by |wifi_|. 9735c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 9745c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 9753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 977dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 9783426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 979f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 9802ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 981c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 9823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 9833c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 9843c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 9853946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor_; // Owned by |wifi_|. 9863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 9883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 9893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 9903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 991626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 9923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 9933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 994446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 995446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 9967fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 9973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 998ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockDBusServiceProxy> dbus_service_proxy_; 999ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 1000ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 1001f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 1002f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 1003084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan DBusManager *dbus_manager_; 1004735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 1005735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 1006735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 10070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 1008735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 1009bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 10103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1012ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 1013af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 10143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 10153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1016e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1017e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1018e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1020446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1021446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 10227fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 1025b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1026261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1027261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1028050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartmap<string, ::DBus::Variant> WiFiObjectTest::CreateBSSProperties( 1029050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &ssid, 1030050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1031050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1032050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1033050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode) { 10343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 10353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 10373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 10383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1042a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 10433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 10443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 10463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 10473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10480654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 1049e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 10500654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 1051e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 10520654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 1053050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1054050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart return bss_properties; 1055050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 1056050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1057050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 1058050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &ssid, 1059050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1060050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1061050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1062050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode) { 1063050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAddedTask( 1064050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bss_path, 1065050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode)); 10663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 10673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1068e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1069e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1070e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1071e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1072e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1073e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1074a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1075a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1076a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1077a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 10782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1079a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1080a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 10839f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 10849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1086f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1087a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 10882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 10892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 10902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 10949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 10979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 10989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 10999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 11009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 11019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 11029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 11039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 11049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 11059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 11069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 11079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 11089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 11119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 11129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 11139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 11149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 11159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 11169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 11179f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 11189f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 11199f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 11202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 11222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1123a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 11252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 11262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 11282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1129f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1137f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1142a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1143a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1144a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1145a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1146a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1147a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1148a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1149a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1150a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1151a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1152a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1153a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1154a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1155a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1156a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1157a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1158a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1159a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1160a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1161e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1162e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1163e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 11643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 11650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 11673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 11700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 11713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 11723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11732b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 11742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 11752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1177227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1178227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1179227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1180227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1181227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1184227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1185227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1186227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1187227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1188227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1189227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1190227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1191227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1192227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1193227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1194227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1195227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11962b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 11970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 12000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1202227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1203227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1204227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1205227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1206227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1207227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1208227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1209227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 12102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 12129cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 12139cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 12149cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 12159cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 12169cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 12179cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 12182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12202b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 12210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12259cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 12269cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 12279cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 12289cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12299cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 12302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12322b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 12330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 12360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 12372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 12402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 12412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12442b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 12452b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1251549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 12523c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 12533c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 12543c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 12550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 1256549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1257549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1258c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1259549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1260549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1261549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1262ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 12633c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 12653c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 12663c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 12673c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1268549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1269549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 12700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1271549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1272549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 12783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 12793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 12803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 12813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1282b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 12833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 12843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 12853239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1286b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 12873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 12883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 12895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 12905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 12935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 12965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 12975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 12985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 13005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 13025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1304835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1306835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 13070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 13083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 13090951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko ClearCachedCredentials(service.get()); 1310835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1311835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 13120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 13130427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 13140427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 13150427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 13160427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 13170427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 13180427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1319381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1320381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1321381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 13223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1323381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1324381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1325381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1326381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1327381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1329381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1330381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1331381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1332381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1333381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1334381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1335381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1336381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1337ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1338316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1339316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1340316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1341316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1342b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1343316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1344316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1345316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1346316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1347316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1348316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1349316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1350316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1351316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1352b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1353ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1354ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 13550951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 1356316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1357316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1358316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1359316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 1360b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false)) 1361316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1362316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1363ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1364ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1365381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1366381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13673c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1368381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1369381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1370381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1371381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1372381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1373381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1374381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1375381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1376381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1377381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1379381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1380381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1381381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1382381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1383381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1384381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1385381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1386381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 13875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 13885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 13893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 13913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 13942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 13953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 13963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13983239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 13993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 14015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 14025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 14035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 14045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 14055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 14065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 14075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 14085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 14105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 14125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 14133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 14143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 14153c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 14163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 14173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 14195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 14202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 14212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 14223c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1426f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 14292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1431c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1433c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1434c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14350951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1445c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1446c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14470951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1449c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 14502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 14520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1453c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 14543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1455c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1457c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1458c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1461c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 14622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 14632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 14642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1466c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1467c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14680951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1473c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1474c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 14755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 14772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 14782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1480f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 14832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 14855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14880951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 14992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 15005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 15022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 15032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 15045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 15052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 15062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 15070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 15085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 15095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 15102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 15112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 15135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15140951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 15152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 15162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 15172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 15182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 15195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 15202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15230951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 15242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 15255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 15285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1530ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1531ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15323c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15335c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1534ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1535ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 15362f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1537ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1538ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1539ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 15415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 15465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 15490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 15500cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 15510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15553a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) { 15563a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan StartWiFi(); 15573a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 15583a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15593a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ReportScanDone(); 15603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan CancelScanTimer(); 15613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 15623a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ASSERT_TRUE(wifi()->IsIdle()); 15633a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 15643a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan OnAfterResume(); 15653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(GetScanTimer().IsCancelled()); 15663a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan InstallMockScanSession(); 15673a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan SetCurrentService(MakeMockService(kSecurityNone)); 15683a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15693a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 15703a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan} 15713a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan 15725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 15735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1575ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1576ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15773c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1578ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1579ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1581ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1582ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1583ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 15855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 15935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 15975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1599ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1600ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 16013c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 16030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 16043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 16053c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 16063ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 16070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1608ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 16092f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1610ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1611ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1612ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 16135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 16145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 16155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 16165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 16190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 16205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 16215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 16225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 16230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 16245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 16265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 16275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 16295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 16308e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 16318e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 163270068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 16338e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 16348e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 16358e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 16368e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16378e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 16388e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 16393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 16413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1642e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 16433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1644e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 16453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1646e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 16473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1648e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 16497fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 1650e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1651e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1652e41a72d0737488d561a4158019409d5785dad61bThieu Le 1653e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 1654e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1655e41a72d0737488d561a4158019409d5785dad61bThieu Le 1656e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1657e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1658e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1659e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1660e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1661e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1662e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1663e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1664e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1665e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1666e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1667e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 16683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 16713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16723c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 16763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 16793c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 16803c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16813c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 16823c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16833c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 16843c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 16863c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 1689b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 16900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 1691e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 1692b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1693e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 1694e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 16958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 16968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 16978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 16988a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 16993c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 17003c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 17013c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 1703ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 17088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17093c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 1710261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1711261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1712261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 1713261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 17143c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 17153c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 17163c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 17173c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 17183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 17190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 17203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17213c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 17223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1724835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 1725835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 17263c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 17270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 1728835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1729835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 17303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1731835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 17323c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17333c5040174273386868cc8dea8044d22c465885d8Paul Stewart 17343c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 17350654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1736835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1737835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 1738a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 1739a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 17403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 17413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 1742835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 1743835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1744835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 17450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 17460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17473c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 17480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 17503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17514943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 17524943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17534943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17544943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 17554943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 17560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17574943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 17584943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17594943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 17604943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 17614943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 17620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17634943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 17644943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17654943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17683c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 17690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 17730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17743c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 17750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 17763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 17770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 17803c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 17813c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 17823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17833c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 17840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 17853c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 17893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 17923c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 17930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 17950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 17960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 17980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17992b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 18000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 18010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 18020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 18033c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18043c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 18050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18074943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 18080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 18090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 18100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 18110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 18120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 1813835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1814835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 1815ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 1816af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 1817af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 1818af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 1819af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 1820835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 1821735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 18223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 18234943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 18244943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18254943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18274943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18284943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 18294943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18304943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 18314943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 18324943822214f823c2437aa32b0376414b3e60388dPeter Qiu ::DBus::Path kPath("/fake/path"); 18330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18344943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18354943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 18364943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18374943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 18384943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 18394943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 18404943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18414943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 1842ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 18434943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 18444943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 18454943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 18464943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 18474943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)); 18484943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 18494943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 18504943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 18514943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18520654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18543c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 18560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 1857c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 18583c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18593c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 18600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 1862c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 18633c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1864c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 1865c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 1866c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 1867c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 18680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 1870c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 1871c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 18720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 18730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 18744943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18764943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), 18770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 18810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 18820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 18830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18852b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 18864943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18874943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18884943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 18894943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18902b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 18912b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 18921aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 18931aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 18941aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal DBus::Path kPath("/fake/path"); 18950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18961aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18971aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 18981aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 18991aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 19001aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 19011aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 19021aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 19031aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 19041aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 19051aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 19061aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 19070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 19080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 19091aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 19101aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 19111aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19121aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 19131aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1918d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1923d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1926d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 19280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1933d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 1934d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1935d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1937d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1938d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(), 19390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1940d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1942d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1943d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1944d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1945d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 1946d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 1947d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1948d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 1949d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1950d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1951d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 19520951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 1953d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1954d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1955d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1956d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1957d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 1958d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1959d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 19610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 1962d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 1963d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1964d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1965d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1966d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1967d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1968d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 1969d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1970d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1971d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 1972d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1973d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1974d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 19750951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 1976d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1977d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1978d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1979d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 198017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 19819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 198217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 198317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 19849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 19859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 198644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 198744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 198817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 198917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 199017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 19910d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 19920d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 19930d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 199417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 199517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 199617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 199733a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 199817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 19990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 200044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 2001a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 200244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 2003a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 2004a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2005a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 20060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 20070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 20080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 200917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 20100cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 201133a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 201233a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 20130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 20140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 20150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 20160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 201717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 201817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 201917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 20202b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 20212b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 20222b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 20233c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 20252b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 20262b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 202717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 202817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 20290d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 20300d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 20310d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 203217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 203317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 203417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 203517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 20370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 20380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 20410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 20423c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 20430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 20450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 20493c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20503c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 20510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 20530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 20540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 20550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 20560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 20580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 20600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20625c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2063c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 20660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 20673c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 20680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 20693c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 20710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 20730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2075c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2076b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2077c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 20785c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 20795c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2080549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 20813c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20823c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20833c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 20840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 2085ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20863c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20883c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20893c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2091549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 20920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2093549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2094549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2095446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 20963c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20973c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 21001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 21010654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 21021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 21030654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 21041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 21050654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 21061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2107446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 21081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 21090654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 21101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 21113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 21133c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2115446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2116446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 21175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2118a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 21190654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 2120ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 2121ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2122ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2123ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2124ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 2125ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 2126ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 2127ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2128ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2129ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2130ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 21313c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 21323c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21333c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 21353c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 21360654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 2138ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2139ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 21405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21423c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 21433c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 21443c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 21453c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21463c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 21473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 21485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 21495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 21503c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 21513c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21523c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 21565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 21615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 21625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 21635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2165ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 21665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21675412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 21685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 21725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 21765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 21775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 21835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21883c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 21895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21915412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2192ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2193ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2194ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2195fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2196fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2197fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2198fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2199fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 22003c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 22015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2202fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2203fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2204fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 2205fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2206fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2207fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2208fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 22091e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 22101e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 22111e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 22121e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22131e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 22141e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 22151e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal .WillOnce(Throw(DBus::Error("don't care", "don't care"))); 22161e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 22171e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 22181e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22191e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 22201e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 22225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 22255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22279f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22287de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 22322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2238f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2242f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 22435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 22445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 22475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 22485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 22495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 22505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 22525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 22555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 22565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 22575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 22585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 225944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 226044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 226144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 226244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 22635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 22682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22697de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 22755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 22765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 22775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 22785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 22805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 22820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 22835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 22855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2286a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2287a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 22885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 22900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 22940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 22962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 22972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 22982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 22995412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 23002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 23015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 23022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 23032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 23045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 23055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 23060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 23075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 23085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 23090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 23102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 23110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 23122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 23130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 23145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 23155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 23167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 23177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 23187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 23217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 23220654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 23230654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 23247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 23277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 23287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2330f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 23317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 23330654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 23347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23367ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2337d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 23387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 23417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 23427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 2343b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2344d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 23457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2347f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2348bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2349bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2350bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 23517ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23520654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 23530654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 23540654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 23557ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 23567ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23580951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 23593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 23607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2362a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2363a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2364a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2365a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2366f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2367a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2368a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2369a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2370a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2371a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2372a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2373a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2374a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2375a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2376a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2377a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2378a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2379a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2380a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2381a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2382f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2383a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23840654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 23850654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2386a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2387a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2388a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2389a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2390a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2391a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2393a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2394a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2395a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 23962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2397a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23980654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 23990654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2400a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 24010654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2402a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2403a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 24041590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 24051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 24063c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24073c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 24080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr); 24091590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 24104943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 24110654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 24120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2414687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 24161590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 24171590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 24181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 24193c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 24200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 24213c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 24223c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 24230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 24243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 24251590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2426c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2427c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2428c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2429c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 24303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 24313c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 24323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2433bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2434a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 24350654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2437687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24380951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 24390951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service1.get()); 24401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 24411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2442e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2443e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 24440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 24450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 24460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 24473c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 24480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24503c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 24513c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 24523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 24533c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2454687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 24550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2456687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2457687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2458687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2459687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2460687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2461687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2462687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2463687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2464687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24650951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(ipconfig.get()); 2466687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24674eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 24684eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 24698a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 24708a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24713c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 24720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 24748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24753c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 24760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 24780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24808a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 248149c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 248249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 248349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ::DBus::Path bss_path; 248449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 248549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 24860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, &bss_path)); 248749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 24880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 248949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 249049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 249149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 249249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 249349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 249449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 249549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 249649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 249749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 24980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 250049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 250149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 250249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 25038a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 25048a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 25058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 25063c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 25070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 25088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 25098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 25108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 25114a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 25120654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 25139d97b7deda3ae604d718873207a951f62d418b34Paul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) && 25140654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 25154d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 25164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 25174d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 25184d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 25193c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 25200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2521a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 25223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 25230654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 25244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 25254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 25264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 25274a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 25284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 25293c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 25300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2531a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 25323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 25334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2538f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 25394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 25414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25423c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 25430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 25440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25450654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 25464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 25494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 25503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 25510951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 25520951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25560654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 25624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 25634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 25670654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 25684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25700951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 25710951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25734a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25750654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25764a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25774a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 25814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25835c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 25845c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 25850654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 25865c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 25873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25885c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 25890951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25905c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 25915c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 25925c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 25930654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25945c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 25955c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 25964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2598c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2599c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 26003c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 26010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 2602c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2603c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2604c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2605c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2606c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2607c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 26080951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2609c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2610c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2611c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2612c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 26133c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 26140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 26158f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2616c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 26178f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 26188f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 26190654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 26205519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 26213c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 26223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 26233c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 26248f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 26258f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 26265519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 26275519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 26283c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 26293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 26303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 26310654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2632c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2633c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2634b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2635b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2636b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2637b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2638b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2639b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 2640b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2641b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2642b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2643b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2644b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2645b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2646b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 2647b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 2648b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 2649b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 2650b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 26513c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 26520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 26530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 26543c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2655b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 2656b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 2657b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 2658b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2659b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 26605c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 26615c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 26625c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 26635c05b2920be742d518829972127172481722058dmukesh agrawal 26645c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 26655c05b2920be742d518829972127172481722058dmukesh agrawal 26665c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 26675c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 26685c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 26693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 26705c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 26712f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 26725c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 26735c05b2920be742d518829972127172481722058dmukesh agrawal} 26745c05b2920be742d518829972127172481722058dmukesh agrawal 2675402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) { 2676402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan StartWiFi(); 2677402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 2678402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we 0 2679402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // auto-connectable services. 2680402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 2681402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 2682402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 2683d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _)); 2684402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 2685402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 2686402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If we have 1 or more auto-connectable services, do not call 2687402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 2688402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 2689402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(1)); 2690402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 2691402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _)) 2692402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 2693402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 2694402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 2695402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If the WiFi device is not Idle, do not call 2696402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 2697402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan SetCurrentService(MakeMockService(kSecurityWep)); 2698402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_FALSE(wifi()->IsIdle()); 2699402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 2700402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 2701402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _)) 2702402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 2703402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 2704402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan} 2705402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 27065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 27075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 2708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2713b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27147de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 27150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 27235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 27245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 27265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 27275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 27280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2729df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 27305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 27315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 27325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 27345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 27355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2736b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 2737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2740b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2741b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2742b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 2743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 2744b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 27455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2746b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2747b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2748b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2749b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2750b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2751b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 2752b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27543c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 27550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr); 2756b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2757b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2758b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2759b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 27605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2761b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2762b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2763b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2764b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2765b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2766b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 2767b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2768b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2769b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2770b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 2772b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2773b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2774b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2775b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 2776b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2777b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2778b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2779b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2780b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2781b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2782b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 2785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2786b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2787b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 2789b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2790b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2791b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 27935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 27945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 27955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 27975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 27985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 27995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 2800a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 28015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 28025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 28035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 28045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 28055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 28065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 28075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 28085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2809b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 2810b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2811b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 28125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 28130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2814df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 28153c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 28163c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 28173c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 2818a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 28193c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 28203c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 28215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 28220654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2823b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2824b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2825b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2826b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 2827b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2828b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 28290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2830b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2831df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 28323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 28333c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 28340654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2835b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2836b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2837b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 28383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 28393c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 28402ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 28412ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 28423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 28432ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 28443c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 28453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 28463c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 28472ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28482ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 28492ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 28503c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 28513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 2852daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 28533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 28542ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28552ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28562ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 28572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 28582ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 28592ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 28602ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 28612ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 28622ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28632ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28642ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 28652ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 28663c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 2867daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 2868daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1); 28693c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 28703c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28713c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 28723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 28738e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 28748e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 287570068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 28768e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 28778e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 28788e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 28798e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28808e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 28818e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 2882cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 2883f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2884bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 28850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2886cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2887cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2888bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 2889f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 28900654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2891bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2892bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 2893bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 28940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 28951369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2896bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 28971369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 2898cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2899cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2900f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 2901f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 2902f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 2903f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 2904a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 2905f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 2906f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 2907f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2908f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 2909f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 2910f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 2911f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2912f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2913b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2914f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 2915f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 2916f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2917f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2918f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2919f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2920f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 29210951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2922f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2923f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 2924f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 2925f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 2926f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 2927f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2928f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2929f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 2930f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 2931f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2932f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2933f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 2934f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 2935f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 29360d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 29370d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29380d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2939f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 29400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2941f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2942f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 2943f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 2944f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2945f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 29460d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 29470d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2949f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 29500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2951f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2952f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 2953f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 2954f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2955f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 2956f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 29570d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 29580d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29590d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2960f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2961f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 2962f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 29631369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 2964f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2965735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2966735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2967735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 2968735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2969735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2970bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29720951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2973bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2974bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 29751369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2976bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 29771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 29780951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2979bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2980bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29820951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2983bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2984bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2985bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 29860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29871369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29881369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29891369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 2990f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 2991cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 29920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2993cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2994a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 2995bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2996f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 29974943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2998735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2999cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3000f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 30010654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 30021369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 30031369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 30041369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 3005f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 30061369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 30071369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 3008735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3009735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 30104943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3011735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 3012735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 3013735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 3014735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3015735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3016bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3017735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 30181369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 301939a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 3020735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 30210654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3022cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3023cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 30241964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) { 30251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(*wake_on_wifi_, 30261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(IsConnectedToCurrentService())); 30271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(); 30281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 30291964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3030e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 3031e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 30321aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 3033e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 30341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 3035e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3036e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 3037e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 3038e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3039e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 3040e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 3041e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30421aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 3043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 3044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 3045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 3046e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3047e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3048e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3049e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3050e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3051e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3052e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3053e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3054e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3055e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3056e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3057e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3058e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3059e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3060e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3061e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3062e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3063e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3064e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3065e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3066e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3067e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3068e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3069e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3070e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3071e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3072e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3073e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30741aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 307566bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer. 307666bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3078e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3079e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3080e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3081e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3082e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3083e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3084e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3085e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3086e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3087e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3088e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3089e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3090e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3091e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3092e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3093e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3094e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3095e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30961aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 30971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 30981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30993c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 31000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 31011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 31031aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 31051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 31061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 31081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 31091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 31111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 31121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 31141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 31151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 31171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 31181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 31201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 31221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 31231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 31241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 31257cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 31267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 31277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 31287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 31307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 31317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 31320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 31337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 31347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31365412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 31377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 31387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 31397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 31417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 31420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 31437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 31467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 31477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 31487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 31497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 31527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 31537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 31547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 31557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 31567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 31587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 31617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 31627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 31635412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 31647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 31667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 31677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 31707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 31717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 31727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3174baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3175baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3176baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 31777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 31787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 31797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 31807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 31817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 31827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 31837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 31847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 31857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 31867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 31877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3188baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 31897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3190baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3191baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3192baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3193baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3194baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3195baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3196baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3197baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3198baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3199baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3200baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3201baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3202baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3203baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3204baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3205baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3206baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3207baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3208baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3209baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3210baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3211baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3212baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3213baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3214baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3215baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3216baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3217baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3218baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3219baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3220baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3221baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3222baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3223baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3224baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3225baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3226baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3227baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3228baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3229baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3230baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3231baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3232baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3233baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3234baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3235baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3236baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3237baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 32387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 32397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 32407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 32417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 32428e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 32437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 32447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 32457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3246baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3247baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3248baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3249baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3250baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3251baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3252baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3253baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3254baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3255baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3256baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3257baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3258baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3259baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3260baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3261baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3262baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3263baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3264baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3265baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3266baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3267baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3268baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3269baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3270baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3271baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3272baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3273e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3274e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3275e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3276e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3277e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3278e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3279e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3280e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3281e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3282e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3283e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3284e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3285e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3286e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3287e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3288e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3289e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3290e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3291e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3292e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3293e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3294e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3295e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3296e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3297e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3298e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3299e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3300e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3301e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3302e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3303e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3304e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3305e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3306e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3307e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3308e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3309e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 33108e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 33118e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3312e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3313e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3314e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3315e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3316e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3317e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 33187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 33197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 33201964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) { 33211964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 33221964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 33231964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan StartWiFi(); 33241964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SetupConnectedService(DBus::Path(), nullptr, nullptr); 33251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 33261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan mock_dispatcher_, 33271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds)); 33281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan OnAfterResume(); 33291964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 33301964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3331bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3332f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3333bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3334bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3335bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3336bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3337bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 3338bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3339bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3340bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3341bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3342bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3343bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3344bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3345bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 33467fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 33470654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 3348bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3349bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3350bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3351bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3352bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3353bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3354bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 33550654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 3356bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 3357bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3358bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3359db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3360db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3361db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 336211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3363db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3364db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3365735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3366735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3367735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3368735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3369db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3370db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3371db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3372f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3373db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3374735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3375db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3376735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 33770951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3378735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3379db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3380735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3381735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3382735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 33830d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 33840d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33850d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3386735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 338711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 338811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 338911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 339011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 339111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 339211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 339311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 339411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 339511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 339611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 339711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 33980d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 33990d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 34000d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 340111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 340211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 340311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 340411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 340511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 340611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 340711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 340811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 34090d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 341011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 341111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 341211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 341311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 341411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3415bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3416bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3417c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3418c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3419c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3420c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3421c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3422c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3423c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3424c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3425c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3426c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3427c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3428c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 34296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 34306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 34316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 34326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 34336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 34347fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 34356d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 34366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 34376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34386d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 34396d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 34406d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 34416d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 34426d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 34436d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 34446d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 34456d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 34466d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 34476d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 34486d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 34496d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 34506d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 34516d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34526d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 34536d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 34546d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 34556d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 34566d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 34576d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34586d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 34596d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 34606d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 34616d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 34626d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 34636d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 34646d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 34657347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 34667347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 34676d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34685581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 34695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 34705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 34725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 34735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 34745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 34785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 34795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34800654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 34815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 34835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 34865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 34875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34880654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 34890654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 34900654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 34910654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 34920654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 34930654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 34940654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 34950654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 34965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 35065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 35075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 35085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 35095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 35100654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 35110654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 35125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 35135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 35155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 35165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 35175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 35185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 35190654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 35200654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 35215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 35225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 35245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 35255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 35265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 35275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 35280654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 35290654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 35305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 35315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 35345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 35355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 35365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 35375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 35385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 35415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 354250cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 354350cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 354450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 354550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 354650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 3547bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 3548bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 3549bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 3550bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 3551bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3552bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 35537fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 3554bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3555bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3556bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3557bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3558bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3559bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3560bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3561bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3562bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 3563bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3564bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 35657fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 3566bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3567bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3568bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3569bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3570bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3571bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3572bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3573bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3574bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 3575bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3576bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3577bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 3578bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3579bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3580bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 3581bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 35820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 35830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35840cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 35859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 35860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 3587a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3588a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3589a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3590a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3591a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 35947de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 35950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 35960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 36000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 36010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36020cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 36039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 36040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 36050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 36069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 36079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 36089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 36090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36100cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3611a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 36120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3613a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3614a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3615a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 36160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 36170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 36180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 36190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 36200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 36220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 36230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 36240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36250cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 36269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 36270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 36280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 36299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 36309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 36310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3633a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 36340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3635a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3636a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3637a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 36380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 36390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 36400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 36410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 36420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 36440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 36450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 36460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 36489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3649df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 36509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 36519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 3652df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3653df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 3654a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3655a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 3656a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 36579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3658df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3659df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3660df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3661df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 3663df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 3665df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3666df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3667df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3668df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3669df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3670b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 3671b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3672b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 3673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 3674b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 3675b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3676df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 3677df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3678df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 3679df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3680a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3681df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3682b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 3683b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 3684b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 3685b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3686df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 3687df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 3690df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3691a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3692df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3694df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3698df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 36990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 3700df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 37019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3702df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 3704a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3705a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3706df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 37070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3708df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 3709df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 3711a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3712a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 37139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3714df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3715df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3716df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3717df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 3718df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 3719df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 37200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3721df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3722df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3723df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 37240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 3725df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3726a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3727a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 3728df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3729df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3730df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 37319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3732df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3733a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3734df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 3735df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 3736df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 3737df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 3738df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 3739df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3740df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3741df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3742f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 3743f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3744a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 3745df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 3746df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3747df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 3748df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3749df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3750df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 37510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 37520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 37530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 3754df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 37559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3756df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3757df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 3758df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 3759a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3760a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3761f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3762df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 3763df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3764df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3765df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 3766a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3767df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3768df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3769df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3770df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3771df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3772df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3773df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3774df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 3775df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 3776f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 3777a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 3778a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 37792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 3780df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 3781a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 3782a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3783a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3784a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3785df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 3786df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 3787a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3788df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3789df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 3790a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3791df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3792df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 3793df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 3794a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3795df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3796df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3797df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3798df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 3799df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3800df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 3801df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 3802df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 3803df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3804df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 3805a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 3806df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 3807df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 3808df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3809df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3810df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3811df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3812df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 38133bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 38143bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 38150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 38163bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 38173bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 38183bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 38192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 38203bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 38213bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 38223bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 38233bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 38247de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 38253bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 38263bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 38273bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 38283bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 38292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 38302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 38312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 38332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 38342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 38352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 38362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 38372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 38382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 38402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 38412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 38422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 38432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 38452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 38462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 38482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 38492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 38502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 38512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 38522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 38532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 38552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 38562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 38572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 38582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 3859c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 3860df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 3861df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 3862df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3863df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3864df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3865df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3866df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3867df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3868df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3869df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 3870df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 3871df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3872df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3873df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3874df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3875df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3876df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3877df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3878df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3879df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 3880df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 3881df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3882df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3883df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 3884df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3885df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 3886df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3887df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3888df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3889df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3890df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 3891df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 3892df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3893df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3894df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3895df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3896df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3897df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3898df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3899df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3900df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 3901df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 3902df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3903df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 3904df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3905c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 3906c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 3907c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kPeer[] = "00:11:22:33:44:55"; 3908c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3909c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 3912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3915c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3916c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3917c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error)); 3918c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // This is not a valid IP address nor is it a MAC address. 3919c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3920c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3921c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3922c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kAddress[] = "192.168.1.1"; 3923c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3924c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3925c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3926c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // The provided IP address is not local. 3927c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3928c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(false)); 3929c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3930c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3931c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3932c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3933c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3934c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3935c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3936c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3937c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // If the MAC address of the peer is in the ARP cache, we should 3938c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // perform the TDLS operation on the resolved MAC. 3939c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kResolvedMac[] = "00:11:22:33:44:55"; 3940c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const ByteString kMacBytes( 3941c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac)); 3942c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3943c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(true)); 3944c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _)) 3945c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true))); 3946c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 3947c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart TDLSDiscover(StrEq(kResolvedMac))); 3948c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3949c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3950c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3951c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3952c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3953c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3954c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3955c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3956c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 3957c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 3958c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3959c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3960c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3961c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3962c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3963c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3964c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3965c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3966c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3967c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3968c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3969c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3970c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3971c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3972c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3973c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3974c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3975c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3976c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3977c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3978c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3979c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3980c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3981c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3982c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3983c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3984c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3985c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3986c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3987c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3988c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3989c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3990c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3991c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3992c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3993c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3994c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3995c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 3996c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 3997c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 3998c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 3999c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 4000c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 4001c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 4002c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4003c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 4004c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4005c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 4006c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4007c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 4008c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 4009c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4010c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4011c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4012c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4013c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4014c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4015c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4016c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4017c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4018c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4019c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4020c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 4021c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4022c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4023c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4024c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4025c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 4026c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4027c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4028c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4029c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4030c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4031c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4032c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4033c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4034c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4035c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4036c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4037c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4038c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4039c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4040c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4041c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 4042c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 40433946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 40443946da840142cd386d628c0e879459f8976bd86dmukesh agrawal Nl80211Message new_wiphy_message( 40453946da840142cd386d628c0e879459f8976bd86dmukesh agrawal NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString); 40463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 4047ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu CreateStringAttribute(NL80211_ATTR_WIPHY_NAME, 4048ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu kNl80211AttrWiphyNameStr); 40493946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 4050ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu SetStringAttributeValue(NL80211_ATTR_WIPHY_NAME, 40513946da840142cd386d628c0e879459f8976bd86dmukesh agrawal "test-phy"); 40523946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 40533946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 40543946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // TODO(quiche): We should test the rest of OnNewWiphy, which parses 40553946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // out frequency information. 40563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 40573946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40583946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 40593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 40603946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 40613946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 40623946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 40643946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 40653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 40663946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40673c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) { 4068787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopedMockLog log; 4069787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4070787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 40714bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 4072787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained"))); 4073787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4074787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 4075787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPConfigComplete(); 4076787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4077787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained"))); 4078787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4079787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPv6ConfigComplete(); 4080787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 40813c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was 40823c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // triggered by a gateway ARP. 40833c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received"))); 40843c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0); 40853c3c36a37a885d0a2e180998587af8390744f757Samuel Tan ReportIPConfigCompleteGatewayArpReceived(); 40863c3c36a37a885d0a2e180998587af8390744f757Samuel Tan 4087787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4088787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4089787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4090787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4091787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) { 4092c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan EXPECT_CALL( 4093c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan *wake_on_wifi_, 4094d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)); 4095787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnBeforeSuspend(); 4096787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4097787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4098787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) { 4099787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, 4100d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)); 4101787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnDarkResume(); 41023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41033fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41043fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) { 41053fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan StartWiFi(); 41063fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x); 41073fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x); 41083fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId1[] = "/service/network/rpcid1"; 41093fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId2[] = "/service/network/rpcid2"; 41103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path1(kNetworkRpcId1); 41113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path2(kNetworkRpcId2); 41123fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service1, kNetworkRpcId1); 41133fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service2, kNetworkRpcId2); 41143fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_FALSE(RpcIdByServiceIsEmpty()); 41153fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1)); 41163fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2)); 41173fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan RemoveSupplicantNetworks(); 41183fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(RpcIdByServiceIsEmpty()); 41193fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41203fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41213fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) { 41223fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 41233fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const bool do_passive_scan = true; 41243fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 41253fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 41263fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(1); 41273fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 41283fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetPendingService(service); 41293fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 41303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL( 41323fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan log, 41333fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 41343fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41353fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41363fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 41373fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41383fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41393fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle_PassiveScan) { 41403fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 41413fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const bool do_passive_scan = true; 41423fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 41433fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 41443fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41453fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("TriggerPassiveScan"))); 41463fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41473fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle_ActiveScan) { 41503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 41513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Device::ScanType scan_type = Device::kFullScan; 41523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const bool do_passive_scan = false; 41533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 41543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]"))); 41563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan scan_type = Device::kProgressiveScan; 41593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 41603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]"))); 41613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan) { 41653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(netlink_manager_, 41663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 41673fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerScanMessage::kCommand), 41683fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan _, _, _)); 41693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerPassiveScan(); 4170787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4171787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4172050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) { 4173050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // This test essentially performs ReportBSS(), but ensures that the 4174050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // WiFi object successfully dispatches events in order. 4175050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart StartWiFi(); 4176050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4177050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss0", 4178050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0, 4179050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4180050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4181050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss1", 4182050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0, 4183050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4184050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSRemoved("bss0"); 4185050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4186050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss2", 4187050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0, 4188050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4189050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4190050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00"); 4191050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 4192050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 4193050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4194050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart InSequence seq; 4195050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))); 4196050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))); 4197050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiServiceRefPtr null_service; 4198050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0))) 4199050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart .WillOnce(Return(null_service)); 4200050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))); 4201050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart dispatcher_.DispatchPendingEvents(); 4202050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 4203050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4204050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 4205050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_EQ(2, endpoints_by_rpcid.size()); 4206050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 4207050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4208853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4209