wifi_unittest.cc revision d70ecdf36c94516b71cca8212caeb71da8c63d02
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 } 678261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 6793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 6803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 6813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 6823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 6837fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 6843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 685c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 6863c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, true); 6873c3c36a37a885d0a2e180998587af8390744f757Samuel Tan } 6883c3c36a37a885d0a2e180998587af8390744f757Samuel Tan void ReportIPConfigCompleteGatewayArpReceived() { 6893c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, false); 690c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 691787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void ReportIPv6ConfigComplete() { 692787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnIPv6ConfigUpdated(); 693787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 694f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 695f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 696f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 697f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 698f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 699f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 700f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 701f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 702f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 7033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 7045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 7055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 7065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 7075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 7085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 711dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 7123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 7141590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 7151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 7167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 7177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 7187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 7195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 7205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 7215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 7227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 7237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 7247cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 7257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 7267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 7277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 728baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 7290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 730baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 731cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 732df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 733cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 73411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 73511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const WiFiServiceRefPtr &service, const string &rpcid) { 73611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 73711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 7383fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan bool RpcIdByServiceIsEmpty() { 7393fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan return wifi_->rpcid_by_service_.empty(); 7403fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 741bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 742bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 744e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 7450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 746e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 7472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 748a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 749a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 750a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 751a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 752a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 753a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 754a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 755a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 756a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 757a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 758a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 759a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 760a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 7615412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 762a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 763125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu StringCallback supplicant_name_owner_callback; 764125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 765125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu EXPECT_CALL(*dbus_service_proxy_.get(), 766125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu GetNameOwner(WPASupplicant::kDBusAddr, _, _, _)) 767125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated), 768125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu SaveArg<2>(&supplicant_name_owner_callback))); 769125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu 770084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Start(); 7712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 7720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 773125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 7740951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko // Mimic the callback from |dbus_service_proxy_->GetNameOwner|. 775125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error()); 7763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 7782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 7792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 781787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnAfterResume()); 7822f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 7832f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7842f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 785fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ResultCallback callback( 786fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 787fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->OnBeforeSuspend(callback); 7882f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 789787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void OnDarkResume() { 790787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ResultCallback callback( 791787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 792787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnDarkResume(callback); 793787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 7943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void RemoveSupplicantNetworks() { 7953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->RemoveSupplicantNetworks(); 7963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 7973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void InitiateScan(Device::ScanType scan_type, bool do_passive_scan) { 7983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->InitiateScan(scan_type, do_passive_scan); 7993fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 8003fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void TriggerPassiveScan() { 8013fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->TriggerPassiveScan(); 8023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 8032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 804084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7"); 8052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 8062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 8072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 808084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr); 8092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 8102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 8112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 8122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 8132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 814687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 815687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 816687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 817687350531096cacc379c209e39e63e5316eee5c0Paul Stewart void SetIPConfig(const IPConfigRefPtr &ipconfig) { 818687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 819687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 8204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 8214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 8224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 8234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 824f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 8254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 8264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 8274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 8294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 8304a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 8314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 8324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 8334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 834bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 835bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 836bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 83710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 838db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 839db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 840db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 841db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 842e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 843e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 844e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 845e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 8461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 8471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 8481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 8511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 8521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 8553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 8563c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8573c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 858bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 8591369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 8601369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 8611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 8621369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 8633c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 8643c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 8653c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8663c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 8678e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu void OnUnreliableLink() { 8688e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu wifi_->OnUnreliableLink(); 8698e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu } 8708e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 8717fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanShortInterval(const uint16_t &interval, Error *error) { 872bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 873bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 874bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 8757fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) { 876bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 877bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 878bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 879df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 880df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 881df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 882df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 883df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 884df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 885df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 886df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 887df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 888df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 889df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 890df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 891df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 892df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 893df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 894df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 895c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 896c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 897c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 898c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 899c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 900c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 901df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 902df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 903df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 904df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 9053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void OnNewWiphy(const Nl80211Message &new_wiphy_message) { 9063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 9073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 9083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 909787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService() { 910787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan return wifi_->IsConnectedToCurrentService(); 911787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 912787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 91310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 91410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 91510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 91610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 91785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 91885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 91985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 92085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 9213239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 9223239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 9233239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 924d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 925d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 926d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 927d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 928d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 929d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 930d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 931d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 932d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 9333239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 9343239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 9353239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 9363239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 937af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory *proxy_factory() { 938b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 939b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 940b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 9413c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 9423c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 9433c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9443c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9453946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor() { 9463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 9473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 9483946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 9491964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake() { 9501964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan wifi_->ReportConnectedToServiceAfterWake(); 9511964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan } 9521964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 953fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan MOCK_METHOD1(SuspendCallback, void(const Error &error)); 954fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 955e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 9565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 957fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan MockWakeOnWiFi *wake_on_wifi_; // Owned by |wifi_|. 9585c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 9595c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 9603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 962dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 9633426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 964f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 9652ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 966c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 9673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 9683c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 9693c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 9703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor_; // Owned by |wifi_|. 9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 9753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 976626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 9773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 9783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 979446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 980446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 9817fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 9823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 983ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockDBusServiceProxy> dbus_service_proxy_; 984ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 985ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 986f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 987f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 988084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan DBusManager *dbus_manager_; 989735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 990735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 991735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 9920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 993735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 994bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 9953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 997ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 998af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 9993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 10003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1005446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1006446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 10077fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 10083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 1010b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1011261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1012261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 10143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 10153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 10163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 10177fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 10183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode) { 10193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 10203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 10273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1028a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 10293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 10303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 10323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 10333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10340654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 1035e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 10360654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 1037e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 10380654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 1039b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSAddedTask(bss_path, bss_properties); 10403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1046e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1047e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1048a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1049a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1051a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 10522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1053a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1054a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 10559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 10569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 10579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 10589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1060f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1061a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 10622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 10632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 10642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 10659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 10669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 10689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 10719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 10729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 10739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 10749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 10759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 10769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 10799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 10809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1083a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1084a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 10859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 10869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 10879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 10889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 10909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1095a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 10962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1097a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1098a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 10992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 11002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1101a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 11022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1103f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1104a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1105a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1108a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1111f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1119a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1122a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1123a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1125a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1126a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1135e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1136e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1137e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 11383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 11390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 11413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 11440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 11453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 11463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 11472b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 11492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1151227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1152227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1153227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1154227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1155227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1156227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1157227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1158227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1159227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1160227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1161227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1162227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1163227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1164227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1165227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1166227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1167227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1168227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1169227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11702b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 11710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 11740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1176227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1177227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1178227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1179227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1180227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1181227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 11869cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 11879cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 11889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 11899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 11909cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 11919cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 11922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11942b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 11950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 11999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 12009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 12019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 12029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 12042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12062b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 12070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 12082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 12100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 12112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 12142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 12152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 12182b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 12202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 12212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 12222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 12232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 12242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1225549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 12263c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 12273c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 12283c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 12290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 1230549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1231549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1232c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1233549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1234549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1235549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1236ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 12373c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 12383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 12393c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 12403c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 12413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1242549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1243549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 12440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1245549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1246549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 12475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 12485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 12523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 12533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 12543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 12553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1256b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 12573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 12583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 12593239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1260b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 12613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 12623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 12635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 12645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 12675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 12685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 12695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 12725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 12765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 12775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1278835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 12793c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1280835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 12810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 12823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 12830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko ClearCachedCredentials(service.get()); 1284835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1285835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 12860427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 12870427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 12880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 12890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 12900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 12910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 12920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1293381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1294381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1295381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 12963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1297381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1298381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1299381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1300381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1301381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1303381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1304381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1305381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1306381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1307381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1308381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1309381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1310381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1311ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1312316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1313316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1314316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1315316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1316b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1317316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1318316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1319316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1320316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1321316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1322316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1323316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1324316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1325316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1326b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1327ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1328ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 13290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 1330316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1331316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1332316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1333316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 1334b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false)) 1335316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1336316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1337ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1338ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1339381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1340381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1342381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1343381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1344381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1345381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1346381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1347381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1348381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1349381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1350381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1351381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 13523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1353381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1354381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1355381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1356381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1357381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1358381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1359381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1360381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 13615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 13625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 13633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 13653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 13663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 13682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 13703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13723239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 13733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 13765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 13775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 13785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 13795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 13805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 13815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 13825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 13835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 13883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 13893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 13942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 13952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 13963c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1400f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 14032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1405c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1407c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1408c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14090951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1419c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1420c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14210951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1423c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 14260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1427c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 14283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1429c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1431c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1432c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14330951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1435c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 14372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1440c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1441c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14420951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 14452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1447c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1448c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 14495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 14502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 14512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 14522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1454f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 14552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 14562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 14572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 14595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14620951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 14662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 14672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 14682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14750951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 14802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 14810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 14825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 14835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 14842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14880951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 14935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14970951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 14982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 15025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1504ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1505ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15063c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15075c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1508ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1509ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 15102f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1511ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1512ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1513ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 15155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 15205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 15230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 15240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 15250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15293a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) { 15303a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan StartWiFi(); 15313a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 15323a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15333a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ReportScanDone(); 15343fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan CancelScanTimer(); 15353fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 15363a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ASSERT_TRUE(wifi()->IsIdle()); 15373a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 15383a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan OnAfterResume(); 15393fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(GetScanTimer().IsCancelled()); 15403a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan InstallMockScanSession(); 15413a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan SetCurrentService(MakeMockService(kSecurityNone)); 15423a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15433a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 15443a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan} 15453a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan 15465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 15475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1549ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1550ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15513c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1552ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1553ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15542f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1555ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1556ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1557ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 15595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 15645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 15665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 15675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 15715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 15723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1573ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1574ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 15753c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 15770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 15783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 15793c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 15803ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 15810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1582ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 15832f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1584ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1585ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1586ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 15875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 15885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 15905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 15930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 15945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 15955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 15965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 15970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 15985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1599df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 16005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 16015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 16035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 16048e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 16058e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 160670068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 16078e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 16088e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 16098e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 16108e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16118e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 16128e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 16133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 16143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 16153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1616e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 16173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1618e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 16193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1620e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 16213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1622e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 16237fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 1624e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1625e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1626e41a72d0737488d561a4158019409d5785dad61bThieu Le 1627e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 1628e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1629e41a72d0737488d561a4158019409d5785dad61bThieu Le 1630e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1631e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1632e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1633e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1634e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1635e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1636e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1637e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1638e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1639e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1640e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1641e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 16423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 16453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16483c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 16493c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 16503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 16513c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 16523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 16543c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 16553c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16573c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 16593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart 16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 1663b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 16640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 1665e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 1666b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1667e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 1668e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 16698a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 16708a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 16718a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 16728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16763c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 1677ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16803c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16813c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16833c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 1684261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1685261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1686261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 1687261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 16923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 16943c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 16953c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 16963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1698835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 1699835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 17003c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 17010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 1702835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1703835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1705835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart 17083c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 17090654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1710835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1711835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 1712a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 1713a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 17143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 17153c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 1716835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 1717835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1718835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 17190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 17200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17213c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 17220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17233c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 17243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17254943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 17264943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17274943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17284943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 17294943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 17300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17314943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 17324943822214f823c2437aa32b0376414b3e60388dPeter Qiu 17334943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 17344943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 17354943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 17360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 17374943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 17384943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17394943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 17403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17423c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 17430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 17440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 17470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17483c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 17490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 17503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 17510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17533c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 17543c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 17553c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 17563c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17573c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 17580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 17593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 17633c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 17670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 17690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 17700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 17710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 17720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 17732b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 17740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 17773c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 17783c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 17790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 17803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17814943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 17820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 17850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 17860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 1787835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1788835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 1789ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 1790af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 1791af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 1792af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 1793af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 1794835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 1795735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 17963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 17974943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 17984943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 17994943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18014943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18024943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 18034943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18044943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 18054943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 18064943822214f823c2437aa32b0376414b3e60388dPeter Qiu ::DBus::Path kPath("/fake/path"); 18070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18084943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18094943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 18104943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18114943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 18124943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 18134943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 18144943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18154943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 1816ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 18174943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 18184943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 18194943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 18204943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 18214943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)); 18224943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 18234943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 18244943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 18254943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18260654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18283c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 18300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 1831c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 18323c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18333c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 18340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 1836c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 18373c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1838c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 1839c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 1840c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 1841c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 18420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 1844c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 1845c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 18460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 18470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 18484943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18504943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), 18510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 18520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 18550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 18560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 18570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 18580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 18592b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 18604943822214f823c2437aa32b0376414b3e60388dPeter Qiu 18614943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 18624943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 18634943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 18642b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 18652b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 18661aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 18671aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 18681aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal DBus::Path kPath("/fake/path"); 18690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 18701aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18711aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 18721aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 18731aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 18741aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18751aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18761aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 18771aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 18781aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18791aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 18801aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 18810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 18820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 18831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 18841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 18851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 18871aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 1888d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 1889d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1890d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 18910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1892d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1893d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1894d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1895d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1896d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1897d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1898d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 1899d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1900d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1901d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 19020951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 1903d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1904d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 1908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1909d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1911d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1912d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(), 19130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1917d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1918d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 1923d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 19260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1928d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 1933d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 19340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 19350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 1936d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 1937d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 1938d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1939d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 1940d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 1941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 1942d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 1943d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 1944d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 1945d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 1946d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 1947d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 1948d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 19490951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 1950d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 1951d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1952d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 1953d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 195417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 19559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 195617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 195717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 19589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 19599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 196044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 196144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 196217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 196317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 196417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 19650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 19660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 19670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 196817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 196917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 197017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 197133a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 197217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 19730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 197444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 1975a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 197644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 1977a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 1978a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1979a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 19800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 19820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 198317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 19840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 198533a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 198633a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 19870951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 19880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 19890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 19900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 199117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 199217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 199317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 19942b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 19952b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 19962b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 19973c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 19980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 19992b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 20002b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 200117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 200217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 20030d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 20040d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 20050d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 200617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 200717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 200817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 200917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20103c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 20110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 20120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 20150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 20163c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 20170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 20183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 20190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 20233c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20243c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 20250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 20263c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 20270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 20280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 20290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 20300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 20313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 20320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 20340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 20350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 20365c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2037c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 20393c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 20400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 20413c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 20420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 20433c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 20450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20463c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 20470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2049c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2050b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2051c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 20525c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 20535c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2054549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 20553c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 20580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 2059ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20603c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20623c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2065549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 20660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2067549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2068549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2069446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 20713c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 20720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 20733c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 20741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20750654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 20770654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 20781aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20790654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2081446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 20821aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 20830654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 20841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 20853c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 20873c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2089446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2090446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 20915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2092a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 20930654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 2094ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 2095ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2096ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2097ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2098ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 2099ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 2100ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 2101ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2102ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2103ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2104ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 21053c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 21063c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 21093c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 21100654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 21113c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 2112ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2113ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 21145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 21155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21163c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 21173c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 21213c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 21225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 21235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 21263c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 21305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 21355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 21365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 21375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2139ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 21405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21415412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 21505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 21515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 21525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 21535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 21545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 21555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 21565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 21575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 21595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 21605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 21613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 21623c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 21635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 21645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 21655412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2166ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2167ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2168ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2169fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2170fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2171fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2172fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2173fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 21743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 21755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2176fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2177fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2178fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 2179fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2180fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2181fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2182fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 21831e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 21841e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 21851e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 21861e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 21871e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 21881e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 21891e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal .WillOnce(Throw(DBus::Error("don't care", "don't care"))); 21901e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 21911e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 21921e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 21931e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 21941e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 21955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 21965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 21975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 21985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 21995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22027de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 22062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2212f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2213df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2214df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2216f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 22175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 22185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 22205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 22225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 22265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 22295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 22305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 22325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 223344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 223444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 223544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 223644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 22389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 22395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 22422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 22437de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 22445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 22495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 22505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 22515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 22525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 22535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 22545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 22550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 22560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 22575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 22595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2260a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2261a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 22625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 22630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 22640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 22680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 22702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 22712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 22722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 22735412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 22742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 22755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 22772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 22785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 22800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 22815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 22830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 22842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 22850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 22862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 22870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 22885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 22895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 22907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 22917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 22927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 22937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 22947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 22957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 22960654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 22970654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 22987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 22997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 23017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 23027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2304f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 23057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 23070654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 23087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2311d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 23127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 23147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 23157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 23167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 2317b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2318d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 23207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2321f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2322bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2323bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2324bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 23257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 23260654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 23270654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 23280654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 23297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 23307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 23317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 23320951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 23333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 23347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 23357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2336a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2337a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2338a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2339a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2340f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2341a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2342a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2343a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2344a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2345a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2346a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2347a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2348a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2349a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2350a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2351a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2352a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2353a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2354a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2355a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2356f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2357a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23580654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 23590654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2360a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2361a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2362a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2363a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2364a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2365a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2367a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2368a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2369a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 23702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2371a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 23720654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 23730654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2374a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 23750654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2376a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2377a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 23781590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 23791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 23803c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 23813c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 23820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr); 23831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 23844943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 23850654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 23860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 23870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2388687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 23891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 23901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 23911590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 23921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 23933c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 23940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 23963c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 23970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 23983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 23991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2400c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2401c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2402c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2403c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 24043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 24053c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 24063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2407bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2408a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 24090654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2411687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24120951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 24130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service1.get()); 24141590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 24151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2416e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2417e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 24180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 24190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 24200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 24213c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 24220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 24233c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24243c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 24253c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 24263c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 24273c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2428687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 24290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2430687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2431687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2432687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2433687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2434687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2435687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2436687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2437687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2438687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24390951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(ipconfig.get()); 2440687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 24414eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 24424eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 24438a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 24448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24453c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 24460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 24488a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 24500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24513c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 24520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 245549c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 245649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 245749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ::DBus::Path bss_path; 245849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 245949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 24600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, &bss_path)); 246149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 24620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 246349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 246449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 246549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 246649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 246749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 246849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 246949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 247049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 247149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 24720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 247449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 247549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 247649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 24778a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 24788a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 24798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 24838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 24848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 24854a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 24860654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 24879d97b7deda3ae604d718873207a951f62d418b34Paul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) && 24880654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 24894d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 24904d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 24914d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 24924d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 24933c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 24940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2495a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 24963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 24970654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 24984d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 24994d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 25004d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 25014a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 25024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 25033c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 25040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2505a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 25063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 25074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 25084a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 25104a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 25114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2512f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 25134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 25154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 25170951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 25180951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25190654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 25204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 25234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 25243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 25250951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 25260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25300654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 25404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 25410654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 25424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 25450951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 25474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 25484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 25490654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 25514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 25524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 25534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 25554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 25564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 25575c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 25585c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 25590654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 25605c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 25613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 25625c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 25630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 25645c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 25655c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 25665c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 25670654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 25685c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 25695c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 25704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 25714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2572c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2573c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 25743c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 25750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 2576c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2577c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2578c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2579c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2580c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2581c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 25820951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2583c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2584c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2585c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2586c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 25873c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 25880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 25898f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2590c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 25918f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 25928f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 25930654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 25945519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 25953c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 25963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 25973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 25988f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 25998f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 26005519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 26015519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 26023c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 26033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 26043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 26050654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2606c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2607c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2608b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2609b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2610b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2611b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2612b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2613b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 2614b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2615b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2616b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2617b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2618b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2619b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2620b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 2621b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 2622b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 2623b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 2624b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 26253c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 26260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 26270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 26283c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2629b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 2630b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 2631b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 2632b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2633b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 26345c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 26355c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 26365c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 26375c05b2920be742d518829972127172481722058dmukesh agrawal 26385c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 26395c05b2920be742d518829972127172481722058dmukesh agrawal 26405c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 26415c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 26425c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 26433c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 26445c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 26452f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 26465c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 26475c05b2920be742d518829972127172481722058dmukesh agrawal} 26485c05b2920be742d518829972127172481722058dmukesh agrawal 2649402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) { 2650402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan StartWiFi(); 2651402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 2652402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we 0 2653402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // auto-connectable services. 2654402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 2655402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 2656402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 2657d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _)); 2658402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 2659402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 2660402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If we have 1 or more auto-connectable services, do not call 2661402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 2662402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 2663402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(1)); 2664402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 2665402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _)) 2666402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 2667402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 2668402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 2669402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If the WiFi device is not Idle, do not call 2670402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 2671402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan SetCurrentService(MakeMockService(kSecurityWep)); 2672402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_FALSE(wifi()->IsIdle()); 2673402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 2674402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 2675402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _)) 2676402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 2677402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 2678402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan} 2679402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 26805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 26815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 2682b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2683b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2684b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2685b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2686b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2687b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26887de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 26890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2690b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 2691b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2692b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2693b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 26965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 26975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 26985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 27005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 27015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 27020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 27045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 27055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 27065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 27085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 27095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2713b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 2718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 27195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2722b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2724b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2725b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 2726b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2727b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27283c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 27290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr); 2730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2731b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2732b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2733b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 27345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2735b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2736b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2740b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 2741b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2742b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2744b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 2746b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2747b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2748b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2749b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 2750b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2751b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2752b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2754b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2755b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2756b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2757b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2758b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 2759b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2760b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2761b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 2763b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2764b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2765b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 27665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 27675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 27685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 27695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 27715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 27725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 27735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 2774a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 27755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 27775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 27785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 27795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 27805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 27815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 27825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 2784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 27865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 27870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2788df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 27893c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 27903c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 27913c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 2792a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 27933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 27943c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 27955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 27960654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2797b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2798b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2799b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2800b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 2801b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2802b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 28030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 2804b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2805df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 28063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 28073c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 28080654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2809b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2810b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2811b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 28123c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 28133c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 28142ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 28152ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 28163c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 28172ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 28183c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 28193c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 28203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 28212ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28222ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 28232ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 28243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 28253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 2826daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 28273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 28282ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28292ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28302ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 28312ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 28322ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 28332ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 28342ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 28352ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 28362ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28372ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 28382ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 28392ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 28403c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 2841daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 2842daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1); 28433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 28443c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 28463c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 28478e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 28488e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 284970068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 28508e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 28518e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 28528e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 28538e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 28548e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 28558e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 2856cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 2857f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2858bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 28590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 2860cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2861cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2862bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 2863f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 28640654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2865bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2866bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 2867bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 28680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 28691369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2870bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 28711369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 2872cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2873cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2874f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 2875f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 2876f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 2877f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 2878a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 2879f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 2880f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 2881f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2882f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 2883f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 2884f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 2885f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2886f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2887b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2888f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 2889f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 2890f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2891f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2892f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2893f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2894f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 28950951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2896f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2897f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 2898f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 2899f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 2900f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 2901f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2902f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2903f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 2904f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 2905f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2906f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2907f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 2908f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 2909f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 29100d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 29110d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29120d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2913f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 29140951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2915f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2916f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 2917f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 2918f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2919f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 29200d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 29210d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2923f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 29240951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2925f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2926f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 2927f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 2928f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2929f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 2930f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 29310d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 29320d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 29330d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 2934f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2935f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 2936f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 29371369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 2938f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2939735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2940735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2941735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 2942735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2943735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2944bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29460951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2947bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2948bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 29491369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2950bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 29511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 29520951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2953bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2954bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 29550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29560951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2957bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2958bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2959bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 29600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 29611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29621369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29631369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 2964f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 2965cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 29660654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2967cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2968a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 2969bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2970f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 29714943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2972735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2973cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2974f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 29750654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 29761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 29771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 29781369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 2979f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 29801369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 29811369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 2982735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2983735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 29844943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 2985735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 2986735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 2987735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 2988735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2989735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2990bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2991735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 29921369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 299339a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 2994735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 29950654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2996cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2997cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 29981964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) { 29991964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(*wake_on_wifi_, 30001964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(IsConnectedToCurrentService())); 30011964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(); 30021964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 30031964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 3005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 30061aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 3007e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 30081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 3009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3010e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 3011e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 3012e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 3014e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 3015e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30161aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 3017e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 3018e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 3019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 3020e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3021e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3022e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3023e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3025e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3026e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3027e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3028e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3029e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3030e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3031e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3032e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3033e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3034e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3035e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3036e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3037e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3038e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3039e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3040e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3041e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3046e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3047e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30481aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 304966bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer. 305066bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3052e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3053e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3054e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3055e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3056e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3057e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3058e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3059e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3060e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3061e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3062e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3063e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3064e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3065e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3066e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3067e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3068e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3069e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 30701aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 30711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 30721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 30733c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 30740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 30751aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30771aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30781aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 30821aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30831aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30851aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 30881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30891aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30901aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 30911aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30921aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 30931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 30951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 30961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 30971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 30981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 30997cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 31007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 31017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 31027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 31047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 31057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 31060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 31077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 31087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31105412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 31117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 31127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 31137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 31157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 31160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 31177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 31207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 31217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 31227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 31237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31247cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 31267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 31277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 31287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 31297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 31307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 31327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 31337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 31357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 31367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 31375412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 31387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 31397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 31407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 31417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 31427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 31437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 31447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 31457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 31467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3147baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3148baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3149baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3150baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 31517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 31527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 31537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 31547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 31557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 31567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 31577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 31587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 31597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 31607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 31617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3162baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 31637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3164baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3165baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3166baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3167baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3168baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3169baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3170baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3171baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3172baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3174baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3175baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3176baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3177baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3178baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3179baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3180baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3181baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3182baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3183baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3184baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3185baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3186baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3187baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3188baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3189baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3190baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3191baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3192baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3193baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3194baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3195baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3196baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3197baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3198baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3199baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3200baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3201baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3202baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3203baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3204baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3205baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3206baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3207baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3208baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3209baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3210baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3211baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 32127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 32137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 32147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 32157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 32168e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 32177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 32187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 32197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3220baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3221baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3222baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3223baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3224baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3225baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3226baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3227baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3228baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3229baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3230baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3231baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3232baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3233baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3234baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3235baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3236baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3237baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3238baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3239baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3240baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3241baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3242baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3243baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3244baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3245baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3246baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3247e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3248e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3249e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3250e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3251e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3252e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3253e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3254e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3255e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3256e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3257e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3258e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3259e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3260e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3261e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3262e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3263e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3264e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3265e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3266e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3267e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3268e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3269e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3270e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3271e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3272e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3273e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3274e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3275e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3276e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3277e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3278e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3279e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3280e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3281e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3282e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3283e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 32848e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 32858e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3286e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3287e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3288e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3289e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3290e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3291e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 32927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 32937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 32941964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) { 32951964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 32961964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 32971964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan StartWiFi(); 32981964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SetupConnectedService(DBus::Path(), nullptr, nullptr); 32991964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 33001964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan mock_dispatcher_, 33011964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds)); 33021964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan OnAfterResume(); 33031964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 33041964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3305bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3306f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3307bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3308bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3309bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3310bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3311bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 3312bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3313bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3314bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3315bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3316bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3317bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3318bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3319bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 33207fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 33210654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 3322bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3323bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3324bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3325bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3326bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3327bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3328bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 33290654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 3330bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 3331bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3332bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3333db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3334db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3335db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 333611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3337db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3338db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3339735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3340735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3341735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3342735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3343db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3344db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3345db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3346f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3347db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3348735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3349db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3350735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 33510951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3352735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3353db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3354735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3355735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3356735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 33570d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 33580d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33590d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3360735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 336111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 336211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 336311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 336411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 336511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 336611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 336711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 336811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 336911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 337011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 337111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 33720d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 33730d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33740d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 337511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 337611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 337711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 337811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 337911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 338011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 338111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 338211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 33830d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 338411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 338511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 338611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 338711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 338811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3389bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3390bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3391c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3392c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3393c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3394c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3395c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3396c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3397c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3398c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3399c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3400c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3401c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3402c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 34036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 34046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 34056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 34066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 34076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 34087fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 34096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 34106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 34116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 34136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 34146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 34156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 34166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 34176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 34186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 34196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 34206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 34216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 34226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 34236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 34246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 34256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 34276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 34286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 34296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 34306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 34316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 34336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 34346d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 34356d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 34366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 34376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 34386d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 34397347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 34407347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 34416d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 34425581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 34435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 34445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 34465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 34475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 34485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 34525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 34535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34540654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 34555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 34575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 34605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 34615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34620654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 34630654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 34640654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 34650654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 34660654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 34670654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 34680654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 34690654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 34705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 34715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 34825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 34835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34840654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 34850654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 34865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 34875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 34885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 34915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 34925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 34930654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 34940654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 34955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 34965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 34975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 34985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 34995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 35005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 35015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 35020654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 35030654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 35045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 35055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 35085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 35095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 35105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 35115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 35125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 35135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 35145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 35155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 351650cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 351750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 351850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 351950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 352050cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 3521bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 3522bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 3523bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 3524bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 3525bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3526bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 35277fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 3528bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3529bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3530bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3531bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3532bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3533bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3534bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3535bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3536bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 3537bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3538bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 35397fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 3540bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3541bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3542bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3543bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3544bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3545bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3546bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3547bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3548bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 3549bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3550bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3551bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 3552bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3553bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3554bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 3555bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 35560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 35570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35580cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 35599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 35600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 3561a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3562a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3563a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3564a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3565a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 35687de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 35690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 35700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35760cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 35779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 35780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 35790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 35809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 35819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 35829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 35830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3585a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 35860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3587a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3588a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3589a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 35900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 35910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 35920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 35930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 35940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 35960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 35970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 35980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 35990cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 36009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 36010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 36020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 36039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 36049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 36050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3607a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 36080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3609a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3610a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3611a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 36120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 36130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 36140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 36150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 36160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 36170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 36180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 36190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 36200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 3621df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 36229f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3623df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 36249f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 36259f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 3626df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3627df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 3628a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3629a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 3630a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 36319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3633df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3634df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3635df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 3636df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 3637df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 3638df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 3639df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3640df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3641df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3642df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3643df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3644b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 3645b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3646b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 3648b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 3649b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3650df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 3651df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3652df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 3653df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3654a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3655df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3656b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 3657b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 3658b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 3659b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3660df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 3661df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3663df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3665a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3666df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3667df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3668df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3669df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 3670df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3671df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3672df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 36730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 3674df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 36759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3676df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3677df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 3678a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3679a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3680df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 36810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3682df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 3683df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3684df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 3685a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3686a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 36879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3690df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3691df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 3692df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 36940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 36980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 3699df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3700a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3701a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 3702df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 37059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3706df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3707a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3708df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 3709df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 3711df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 3712df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 3713df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3714df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3715df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3716f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 3717f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3718a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 3719df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 3720df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3721df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 3722df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3723df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3724df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 37250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 37260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 37270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 3728df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 37299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3730df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3731df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 3732df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 3733a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3734a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3735f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3736df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 3737df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3738df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3739df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 3740a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3741df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3742df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3743df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3744df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3745df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3746df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3747df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3748df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 3749df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 3750f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 3751a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 3752a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 37532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 3754df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 3755a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 3756a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3757a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3758a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3759df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 3760df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 3761a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3762df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3763df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 3764a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3765df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3766df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 3767df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 3768a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3769df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3770df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3771df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3772df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 3773df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3774df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 3775df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 3776df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 3777df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3778df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 3779a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 3780df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 3781df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 3782df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3783df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3784df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3785df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3786df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 37873bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 37883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 37890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 37903bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 37913bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37923bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 37932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 37943bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 37953bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 37963bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 37973bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 37987de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 37993bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 38003bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 38013bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 38023bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 38032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 38042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 38052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 38072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 38082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 38092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 38102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 38112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 38122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 38142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 38152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 38162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 38172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 38192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 38202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 38222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 38232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 38242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 38252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 38262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 38272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 38282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 38292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 38302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 38312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 38322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 3833c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 3834df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 3835df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 3836df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3837df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3838df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3839df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3840df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3841df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3842df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3843df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 3844df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 3845df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3846df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3847df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3848df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3849df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3850df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3851df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3852df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3853df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 3854df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 3855df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3856df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3857df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 3858df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3859df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 3860df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3861df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3862df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3863df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3864df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 3865df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 3866df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3867df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3868df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3869df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3870df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3871df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3872df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3873df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3874df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 3875df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 3876df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3877df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 3878df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3879c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 3880c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 3881c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kPeer[] = "00:11:22:33:44:55"; 3882c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3883c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3884c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3885c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 3886c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3887c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3888c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3889c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3890c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3891c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error)); 3892c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // This is not a valid IP address nor is it a MAC address. 3893c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3894c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3895c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3896c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kAddress[] = "192.168.1.1"; 3897c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3898c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3899c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3900c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // The provided IP address is not local. 3901c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3902c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(false)); 3903c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3904c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3905c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3906c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3907c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3908c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3909c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3910c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 3911c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // If the MAC address of the peer is in the ARP cache, we should 3912c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // perform the TDLS operation on the resolved MAC. 3913c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kResolvedMac[] = "00:11:22:33:44:55"; 3914c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const ByteString kMacBytes( 3915c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac)); 3916c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 3917c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(true)); 3918c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _)) 3919c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true))); 3920c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 3921c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart TDLSDiscover(StrEq(kResolvedMac))); 3922c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 3923c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 3924c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 3925c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3926c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 3927c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3928c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 3929c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 3930c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 3931c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 3932c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3933c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3934c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3935c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3936c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3937c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3938c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3939c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3940c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3941c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3942c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3943c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3944c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3945c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3946c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3947c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3948c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3949c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3950c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3951c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3952c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3953c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3954c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3955c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3956c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3957c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3958c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3959c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3960c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3961c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3962c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3963c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3964c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3965c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3966c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3967c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3968c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3969c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 3970c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 3971c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 3972c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 3973c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 3974c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 3975c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 3976c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3977c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 3978c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3979c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 3980c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3981c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 3982c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3983c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3984c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3985c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3986c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3987c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3988c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3989c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3990c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3991c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3992c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3993c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3994c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3995c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3996c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3997c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3998c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3999c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 4000c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4001c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4002c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4003c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4004c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4005c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4006c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4007c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4008c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4009c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4010c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4011c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4012c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4013c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4014c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4015c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 4016c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 40173946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 40183946da840142cd386d628c0e879459f8976bd86dmukesh agrawal Nl80211Message new_wiphy_message( 40193946da840142cd386d628c0e879459f8976bd86dmukesh agrawal NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString); 40203946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 4021ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu CreateStringAttribute(NL80211_ATTR_WIPHY_NAME, 4022ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu kNl80211AttrWiphyNameStr); 40233946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new_wiphy_message.attributes()-> 4024ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu SetStringAttributeValue(NL80211_ATTR_WIPHY_NAME, 40253946da840142cd386d628c0e879459f8976bd86dmukesh agrawal "test-phy"); 40263946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 40273946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 40283946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // TODO(quiche): We should test the rest of OnNewWiphy, which parses 40293946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // out frequency information. 40303946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 40313946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40323946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 40333946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 40343946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 40353946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 40363946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40373946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 40383946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 40393946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 40403946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 40413c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) { 4042787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopedMockLog log; 4043787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4044787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4045787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(2); 4046787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained"))); 4047787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4048787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 4049787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPConfigComplete(); 4050787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4051787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained"))); 4052787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4053787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPv6ConfigComplete(); 4054787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 40553c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was 40563c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // triggered by a gateway ARP. 40573c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received"))); 40583c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0); 40593c3c36a37a885d0a2e180998587af8390744f757Samuel Tan ReportIPConfigCompleteGatewayArpReceived(); 40603c3c36a37a885d0a2e180998587af8390744f757Samuel Tan 4061787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4062787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4063787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4064787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4065787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) { 40663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan FireScanTimer(); 4067c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan EXPECT_CALL( 4068c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan *wake_on_wifi_, 4069d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)); 4070787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnBeforeSuspend(); 40713fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 4072787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4073787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4074787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) { 40753fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan FireScanTimer(); 4076787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, 4077d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)); 4078787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnDarkResume(); 40793fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 40803fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 40813fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 40823fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) { 40833fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan StartWiFi(); 40843fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x); 40853fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x); 40863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId1[] = "/service/network/rpcid1"; 40873fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId2[] = "/service/network/rpcid2"; 40883fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path1(kNetworkRpcId1); 40893fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path2(kNetworkRpcId2); 40903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service1, kNetworkRpcId1); 40913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service2, kNetworkRpcId2); 40923fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_FALSE(RpcIdByServiceIsEmpty()); 40933fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1)); 40943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2)); 40953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan RemoveSupplicantNetworks(); 40963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(RpcIdByServiceIsEmpty()); 40973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 40983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 40993fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) { 41003fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 41013fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const bool do_passive_scan = true; 41023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 41033fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 41043fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(1); 41053fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 41063fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetPendingService(service); 41073fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 41083fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41093fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL( 41103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan log, 41113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 41123fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41133fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41143fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 41153fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41163fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41173fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle_PassiveScan) { 41183fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 41193fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const bool do_passive_scan = true; 41203fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 41213fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 41223fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41233fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("TriggerPassiveScan"))); 41243fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41253fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41263fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41273fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle_ActiveScan) { 41283fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 41293fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Device::ScanType scan_type = Device::kFullScan; 41303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const bool do_passive_scan = false; 41313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 41323fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41333fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]"))); 41343fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41353fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41363fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan scan_type = Device::kProgressiveScan; 41373fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 41383fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]"))); 41393fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan InitiateScan(scan_type, do_passive_scan); 41403fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 41413fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 41423fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan) { 41433fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(netlink_manager_, 41443fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 41453fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerScanMessage::kCommand), 41463fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan _, _, _)); 41473fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerPassiveScan(); 4148787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4149787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4150853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4151