wifi_unittest.cc revision c6fbad96f565fda1caae9cd80569314685c99b90
18a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Use of this source code is governed by a BSD-style license that can be 3853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// found in the LICENSE file. 4853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/wifi.h" 6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h> 85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h> // Needs typedefs from sys/socket.h. 95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h> 105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h> 11f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 12853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1660ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov#include <base/file_util.h> 177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h> 18dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h> 193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h> 204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov#include <base/string_split.h> 213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h> 225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <base/stringprintf.h> 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h> 257156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h> 262ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h> 27853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 28853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 318ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h" 327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov#include "shill/mock_dbus_manager.h" 37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 38c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h" 40f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h" 4111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 42e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.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" 47bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h" 4810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 495c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h" 505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h" 51a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 52b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h" 53735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h" 543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h" 55835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h" 563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h" 575c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h" 583c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h" 597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h" 605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h" 61dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h" 63853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h" 655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h" 6685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h" 683239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h" 69ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h" 70853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 71ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 720e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 73853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 74853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 783c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 80a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 81cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 84b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 85549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 91dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 92d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 9311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref; 94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 95ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 96ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 97a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 98a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 99a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 100853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 1013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1028ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 103853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 104853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 105853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 1125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 1145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 116853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 1173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 1183426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le : device_(new WiFi(control_interface(), 1193c5040174273386868cc8dea8044d22c465885d8Paul Stewart NULL, NULL, manager(), "wifi", "", 0)) { 120853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 1213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 122853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 123853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 1248abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 125853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 126853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 128f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_TRUE(device_->store().Contains(kNameProperty)); 129de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 130853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 131853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1326bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 133a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 134a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1356bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 136de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 137f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanSignalThresholdProperty, 138a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 139a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 140a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 141a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 142a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1436bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(), 144f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanIntervalProperty, 1456bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kUint16V, 1466bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 147a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 148853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 149a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 150a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 1516bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(), 152f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanningProperty, 1536bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kBoolV, 1546bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 155bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise 1569d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 157a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 158853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1594d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1604d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1616bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 1624d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 163f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 1644d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant( 1650654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodSimple), 1664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1674d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1684d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1694d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 1704d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 1716bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty( 1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 173f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 1744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant("not a real scan method"), 1754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 1764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 1774d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 1784d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 1794a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 1800654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 1818abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 1824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 1834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 1844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 185e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 186e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 187f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 1884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 1890654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 1908abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 1918abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal ::DBus::Error error; 1926bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 1938abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), 194f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 195f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn), 1968abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 1970654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 198e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 199f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2000654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 2018abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2028abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal EXPECT_TRUE(DBusAdaptor::ClearProperty( 203f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan device_->mutable_store(), kBgscanMethodProperty, &error)); 204e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 205f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 2064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 2074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 2088abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 2098abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 2103c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 2113c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 2123c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 2133c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 2143c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 2153c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 2163c5040174273386868cc8dea8044d22c465885d8Paul Stewart 2175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 218e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 2193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 220bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie explicit WiFiObjectTest(EventDispatcher *dispatcher) 221e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 2226c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le metrics_(NULL), 223e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart manager_(&control_interface_, NULL, &metrics_, &glib_), 224e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 225626719f89881a949d8b5a8fa808beb924496489fChris Masone wifi_(new WiFi(&control_interface_, 226e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart dispatcher, 2273426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le &metrics_, 228626719f89881a949d8b5a8fa808beb924496489fChris Masone &manager_, 229626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceName, 230626719f89881a949d8b5a8fa808beb924496489fChris Masone kDeviceAddress, 231626719f89881a949d8b5a8fa808beb924496489fChris Masone 0)), 2323c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 233dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 234b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal supplicant_bss_proxy_( 235b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal new NiceMock<MockSupplicantBSSProxy>()), 236f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal dhcp_config_(new MockDHCPConfig(&control_interface_, 237d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart kDeviceName)), 2382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov dbus_manager_(new NiceMock<MockDBusManager>()), 2390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 240735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 2413c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 2429413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart new NiceMock<MockSupplicantInterfaceProxy>()), 2432f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal proxy_factory_(this) { 2445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 2453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ::testing::DefaultValue< ::DBus::Path>::Set("/default/path"); 246c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 24775a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _, _)). 248c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal WillByDefault(Return(dhcp_config_)); 249c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ON_CALL(*dhcp_config_.get(), RequestIP()). 250c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal WillByDefault(Return(true)); 251835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)). 252835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart WillByDefault(InvokeWithoutArgs( 253835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart this, &WiFiObjectTest::CreateSupplicantNetworkProxy)); 254318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 255ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 256735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 257735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart manager_.dbus_manager_.reset(dbus_manager_); 258735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 2592b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 2603c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 2615c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 262bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 2635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 2640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 2655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 2675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 2685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 2695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 2705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 2713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 2725c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2735c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 2743ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 2753ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 276d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 277ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = &proxy_factory_; 2785c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_; 2795c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 2803c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_)); 2812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber()); 282b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2835c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 2845c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2855c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 2863c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 2873c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL))); 2889a24553461df7036755060423f90804011612249Eric Shienbrood wifi_->SelectService(NULL); 289b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 290b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 291b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 292ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = NULL; 2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 2943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 2953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 2969a24553461df7036755060423f90804011612249Eric Shienbrood wifi_->Stop(NULL, ResultCallback()); 2975c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(NULL); 2983ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 2993ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 300d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 301f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 302f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 303549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 304549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 305549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart wifi_->SetEnabled(false); // Stop(NULL, ResultCallback()); 306549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 307549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 308c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // Needs to be public since it is called via Invoke(). 309c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley void ThrowDBusError() { 310c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley throw DBus::Error("SomeDBusType", "A handy message"); 311c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley } 31217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 31317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart SetPendingService(NULL); 31417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 315c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 3165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 3175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 3185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 3215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 3225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 3235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 3265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 3275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 3285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 3295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 3325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 3335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 3365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 3375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie std::set<uint16_t> available_frequencies; 3385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 3395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 3405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 3415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 3425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 3435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 3445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 3465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 3475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 348f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 349f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie NULL); 3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3587347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie void OnTriggerScanResponse(const Nl80211Message &message) { 3595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 3615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 362b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 363b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 364b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie const char *reason) { 365b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 366b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 367b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 3690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 3700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 3710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 3720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 373227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie void SetRoamThresholdMember(uint16 threshold) { 374227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie wifi_->roam_threshold_db_ = threshold; 375227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 376227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 377227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie bool SetRoamThreshold(uint16 threshold) { 378227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->SetRoamThreshold(threshold, nullptr); 379227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 380227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 381227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie uint16 GetRoamThreshold() const { 382227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->GetRoamThreshold(nullptr); 383227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 384227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 3853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 3867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 3877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 3883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal class TestProxyFactory : public ProxyFactory { 3893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 390e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart explicit TestProxyFactory(WiFiObjectTest *test); 3913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy( 3931830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal const char */*dbus_path*/, const char */*dbus_addr*/) { 394dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal return test_->supplicant_process_proxy_.release(); 3953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 3963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 3973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy( 398196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart SupplicantEventDelegateInterface */*delegate*/, 3991830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal const DBus::Path &/*object_path*/, 4001830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal const char */*dbus_addr*/) { 401dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal return test_->supplicant_interface_proxy_.release(); 4023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 4033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 404b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MOCK_METHOD3(CreateSupplicantBSSProxy, 405b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal SupplicantBSSProxyInterface *( 406b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal WiFiEndpoint *wifi_endpoint, 407b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const DBus::Path &object_path, 408b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const char *dbus_addr)); 409b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 410835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart MOCK_METHOD2(CreateSupplicantNetworkProxy, 411835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart SupplicantNetworkProxyInterface *( 412835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart const DBus::Path &object_path, 413835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart const char *dbus_addr)); 414835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 4153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 416b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal( 417b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal WiFiEndpoint */*wifi_endpoint*/, 418b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const DBus::Path &/*object_path*/, 419b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal const char */*dbus_addr*/) { 420b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return test_->supplicant_bss_proxy_.release(); 421b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 422b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 423e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiObjectTest *test_; 4243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal }; 4253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 4262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Simulate the course of events when the last endpoint of a service is 4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 429bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 430bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service) 431bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 432bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 433bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 434bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 435bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiEndpointConstRefPtr &endpoint) { 436bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 437bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 438bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart 4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart EndpointRemovalHandler *MakeEndpointRemovalHandler( 446bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiServiceRefPtr &service) { 4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 449b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 450b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 451b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char *mode, 4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *ssid, 4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *path, 4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *bssid) { 4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart *ssid = base::StringPrintf("ssid%d", bss_counter_); 4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart *path = base::StringPrintf("/interface/bss%d", bss_counter_); 4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_); 4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) { 4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart const string &ssid, const string &bssid, const string &mode) { 4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart &proxy_factory_, NULL, ssid, bssid, mode, 0, 0); 4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t> ssid, const std::string &security) { 4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 489f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kModeManaged, 4903c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string &security) { 4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength, 4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart uint16 frequency, 4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr *service_ptr) { 5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5163c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path AddEndpointToService( 5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart uint16 frequency, 5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr) { 5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 540a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart wifi_->ConnectTo(service); 5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->DisconnectFrom(service); 5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 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)); 557a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 558a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path; 5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5833c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 5883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 5893c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5913c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 592bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 59375a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _, _)) 59475a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart .Times(AnyNumber()); 5953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 596a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 5970654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 5983c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 5993c5040174273386868cc8dea8044d22c465885d8Paul Stewart 6003c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 6013c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 6021590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 603b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 604b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 605b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 6072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 6082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie wifi_->Scan(Device::kFullScan, NULL, __func__); 6092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 6102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie wifi_->Scan(Device::kProgressiveScan, NULL, __func__); 6112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 612c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 6131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetCurrentService() { 6141590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 6151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 616bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void SetCurrentService(const WiFiServiceRefPtr &service) { 617bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 618bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 6193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 620165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 6213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetPendingService() { 6231590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 6241590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 6252b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &GetPendingTimeout() { 6262b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 6272b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 6281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart const base::CancelableClosure &GetReconnectTimeoutCallback() { 629446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 630446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 6317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const string &GetSupplicantBSS() { 6327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 6337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void SetSupplicantBSS(const string &bss) { 6357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 6367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 6371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 6391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 640b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal const base::CancelableClosure &GetScanTimer() { 641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 642b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 6433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 644e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 6453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 6463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 6483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6493c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() { 6508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal return dynamic_cast<MockSupplicantInterfaceProxy *>( 6518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 6523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6533c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 6553c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 6563c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 6573c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() { 6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi(); 6593c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 6603c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 661835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() { 662835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return new NiceMock<MockSupplicantNetworkProxy>(); 663835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal const string &GetSupplicantState() { 6657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 6667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 667835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart void ClearCachedCredentials(const WiFiService *service) { 668835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 669835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 6700427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) { 6710427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 6720427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 673381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan bool RemoveNetwork(const ::DBus::Path &network) { 674381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 675381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 676261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 6773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 6793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 6803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 681e41a72d0737488d561a4158019409d5785dad61bThieu Le uint16 frequency, 6823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 683c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 68479d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov wifi_->OnIPConfigUpdated(dhcp_config_, true); 685c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 686f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 687f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 688f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 689f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 690f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 691f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 692f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 693f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 694f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 6953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 7005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 7015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 703dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 7043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 7061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 7071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 7087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 7097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 7107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 7115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 7125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 7135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 7147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 7157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 7167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 7177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 7187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 7197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 720baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 721baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart return wifi_->GetLinkStatistics(NULL); 722baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 723cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 724df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 725cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 72611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 72711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const WiFiServiceRefPtr &service, const string &rpcid) { 72811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 72911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 730bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 731bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 732b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 733e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 734e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart return wifi_->GetScanInterval(NULL); 735e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 7362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 737a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 738a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 739a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 740a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 741a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 742a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 743a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 745a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 746a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 747a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 748a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 749a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 750a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _)); 751a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 7522b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->SetEnabled(true); // Start(NULL, ResultCallback()); 7543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 7552b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 7562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 7572b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7582f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 7592f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 7602f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7612f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 7622f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnBeforeSuspend(); 7632f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 7642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 7652b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->OnSupplicantAppear(":1.7"); 7662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 7672b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 7692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->OnSupplicantVanish(); 7702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 7712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 7732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 7742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 7754a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 7764a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 7774a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 7784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 779f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 7804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 7814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 7824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 7834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 7844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 7854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 7864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 7874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 7884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 789bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 790bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 791bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 79210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 793db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 794db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 795db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 796db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 797e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 798e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 799e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 800e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 8011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 8021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 8031aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 8061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 8071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 8081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 8093c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 8103c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 8113c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8123c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 813bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 8141369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 8151369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 8161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 8171369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 8183c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 8193c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 8203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 8213c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 822bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetBgscanShortInterval(const uint16 &interval, Error *error) { 823bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 824bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 825bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 826bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetBgscanSignalThreshold(const int32 &threshold, Error *error) { 827bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 828bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 829bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 830df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 831df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 832df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 833df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 834df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 835df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 836df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 837df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 838df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 839df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 840df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 841df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 842df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 843df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 844df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 845df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 846c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 847c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 848c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 849c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 850c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 851c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 852df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 853df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 854df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 855df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 85610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 85710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 85810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 85910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 86085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 86185aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 86285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 86385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 8643239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 8653239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 8663239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 867d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 868d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 869d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 870d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 871d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 872d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 873d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 874d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 875d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 8763239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 8773239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 8783239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 8793239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 880b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal TestProxyFactory *proxy_factory() { 881b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 882b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 883b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 8843c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 8853c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8873c5040174273386868cc8dea8044d22c465885d8Paul Stewart 888e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 8895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 8905c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 8915c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 8923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 8933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 894dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 8953426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 896f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 8972ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 898c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 8993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 9003c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 9023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 9043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 9053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 9063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 907626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 9083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 9093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 910446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 911446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 912227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16 kRoamThreshold; 9133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 914dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 915b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 916f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 917f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 918735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 919735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 920735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 921735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockDBusManager *dbus_manager_; 9220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 923735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 924bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 9253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 9273c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 928835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart NiceMock<TestProxyFactory> proxy_factory_; 9293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 9303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 931e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 932e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 933e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 934e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 935446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 936446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 937227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrieconst uint16 WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 9383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 939e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 940b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 941261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 942261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 943e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 9443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 9453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 9463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 947e41a72d0737488d561a4158019409d5785dad61bThieu Le uint16 frequency, 9483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode) { 9493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 9503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 9523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 9533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 9543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 9563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 9573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 9583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal RemoveChars(bssid, ":", &bssid_nosep); 9593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 9603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 9613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 9623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 9633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9640654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 965e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 9660654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 967e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 9680654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 969b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSAddedTask(bss_path, bss_properties); 9703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 972e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test) 973b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal : test_(test) { 974b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber()); 975b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _)) 976b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal .WillByDefault( 977b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal))); 978b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 979b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 980e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 981e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 984e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 986a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 987a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 988a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 989a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 9902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 991a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 992a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 9939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 9949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 9959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 9969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 9979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 998f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 999a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 10002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 10012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 10022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 10039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 10049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 10069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 10099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 10109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 10119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 10129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 10139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 10149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 10179f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 10189f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 10199f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10209f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1021a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1022a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 10239f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 10249f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 10259f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 10269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 10279f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 10289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 10309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 10319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 10322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1033a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 10342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1035a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1036a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 10372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 10382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1039a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 10402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1041f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1042a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1043a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1044a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1045a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1046a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1047a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1048a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1049f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1051a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1052a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1053a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1054a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1055a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1056a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1057a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1058a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1059a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1060a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1061a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1062a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1063a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1064a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1065a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1066a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1067a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1068a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1069a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1070a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1071a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1072a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1073e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1074e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1075e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 10763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 10773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 10783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL); 10793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 10813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 10823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL); 10833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 10843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 10852b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 10862b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 10872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 10882b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1089227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1090227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1091227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1092227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1093227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1094227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1095227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1096227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1097227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1098227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1099227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1100227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1101227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1102227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1103227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1104227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1105227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1106227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1107227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11082b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 11092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 11102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11110654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*dbus_manager_, WatchName(WPASupplicant::kDBusAddr, _, _)); 11122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 11132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 11142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1115227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1116227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1117227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1118227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1119227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1120227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1121227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1122227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 11232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 11259cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 11269cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 11279cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 11289cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 11299cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 11309cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 11312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11332b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 11342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 11352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 11389cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 11399cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 11409cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 11419cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 11429cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 11432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11452b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 11462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantProcessProxy() == NULL); 11472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 11492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantProcessProxy() == NULL); 11502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 11512b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11522b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 11532b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 11542b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 11552b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 11572b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 11582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 11592b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 11602b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 11612b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 11622b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 11632b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1164549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 11653c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 11663c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 11673c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 11683c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, NULL)); 1169549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1170549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1171c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1172549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1173549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1174549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 11753c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 11763c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 11773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 11783c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 11793c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 11803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1181549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1182549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 1183549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_TRUE(GetCurrentService() == NULL); 1184549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1185549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 11865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 11875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 11883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 11893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 11903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 11913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 11923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 11933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 11943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 11963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 11973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 11983239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 12003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 12013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 12025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 12035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 12045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 12055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 12065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 12075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 12085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 12095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 12105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 12115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 12125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 12135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 12145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 12155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 12165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1217835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 12183c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1219835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 12203c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL)); 12213c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1222835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart ClearCachedCredentials(service); 1223835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1224835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 12250427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 12260427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 12270427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 12280427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 12290427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 12300427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 12310427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1232381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1233381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1234381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 12353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1236381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1237381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1238381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1239381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1240381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 12413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1242381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1243381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1244381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1245381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1246381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1247381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1248381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1249381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1250ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 125175a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true, false)) 1252ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1253ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1254ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1255ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1256381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1257381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 12583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1259381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1260381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1261381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1262381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1263381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1264381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1265381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1266381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1267381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1268381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 12693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1270381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1271381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1272381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1273381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1274381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1275381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1276381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1277381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 12785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 12795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 12803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 12813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 12823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 12833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 12843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 12852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 12863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 12873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 12883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 12893239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 12903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 12913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 12925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 12935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 12965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 12975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 12985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 12995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 13005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 13015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 13035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 13043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 13063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 13073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 13083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 13093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 13112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 13122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 13133c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1317f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 13182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 13192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 13202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1322c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 13232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1324c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1325c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13263c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 13272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 13292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 13302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 13312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 13322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 13342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 13352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1336c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1337c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13383c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 13392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1340c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 13412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1343c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetPendingService(NULL); 1344c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 13453c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1346c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 13472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1348c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1349c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13503c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 13512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1352c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 13532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 13542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 13552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 13562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1357c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1358c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 13593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 13602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 13622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1364c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1365c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 13665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 13672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 13682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 13692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1371f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 13722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 13732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 13742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 13765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 13772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 13785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 13802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 13812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 13832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 13842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 13852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 13862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 13882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 13892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 13902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 13915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 13925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 13932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 13942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 13955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 13962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 13972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 13985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(NULL); 13995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 14005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 14012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 14022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 14082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 14092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 14105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 14112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 14135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(service); 14152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 14165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 14175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 14185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 14195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 14203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1421ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1422ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 14233c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14245c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1425ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1426ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 14272f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1428ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1429ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1430ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 14315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 14325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 14345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 14375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 14385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 14400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_TRUE(scan_session_ != NULL); 14410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 14420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 14455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 14465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 14475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 14483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1449ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1450ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 14513c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1452ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1453ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14542f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1455ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1456ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1457ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 14585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 14595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 14615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 14645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 14665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 14675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 14695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 14705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 14715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 14723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1473ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1474ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 14753c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14763c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL)); 14773c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 14783c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 14793ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 14800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1481ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 14822f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1483ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1484ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1485ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 14865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 14875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 14895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 14905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 14915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL)); 14925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 14935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 14945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 14950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 14965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1497df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 14985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 14995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 15005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 15015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 15023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 15043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1505e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 15063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1507e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 15083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1509e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 15103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1511e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 1512e41a72d0737488d561a4158019409d5785dad61bThieu Le const uint16 frequency = 2412; 1513e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1514e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1515e41a72d0737488d561a4158019409d5785dad61bThieu Le 1516e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 1517e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1518e41a72d0737488d561a4158019409d5785dad61bThieu Le 1519e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1520e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1521e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1522e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1523e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1524e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1525e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1526e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1527e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1528e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1529e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1530e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 15313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 15323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 15343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 15353c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 15363c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 15373c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 15393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 15403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 15413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 15423c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 15433c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 15443c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 15453c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 15463c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 15473c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 15483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 15493c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 15503c5040174273386868cc8dea8044d22c465885d8Paul Stewart 15513c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 1552b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1553e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with SSIDs that start with NULL should be filtered. 1554e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 1555b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 1556e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 1557e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 15588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 15598a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 15608a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 15618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 15623c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 15633c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 15643c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 15653c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 15663c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 15673c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 15683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 15693c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 15703c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 15718a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 15723c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 1573261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1574261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1575261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 1576261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 15773c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 15783c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 15793c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 15803c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 15813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 15823c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 15833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 15843c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 15853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 15863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1587835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 1588835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 15893c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 1590a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 1591835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1592835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 15933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1594835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 15953c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 15963c5040174273386868cc8dea8044d22c465885d8Paul Stewart 15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 15980654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 1599835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1600835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 1601a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 1602a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 16033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 16043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 1605835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 1606835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1607835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 16080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 16090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 16103c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 16113c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 16123c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 16133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 16150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 16163c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 16170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_TRUE(GetPendingService() == NULL); 16180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 16190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 16210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 16223c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 16233c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL)); 16243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 16253c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetPendingService().get()); 16260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16273c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 16283c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 16293c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 16303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 16313c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 16323c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService("/new/path", NULL, NULL)); 16333c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 16360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 16410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 16430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 16440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 16450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetPendingService().get()); 16472b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 16480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 16490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 16513c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16523c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 16543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 16550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 16560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 16580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 16590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 1660835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 1661835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 1662835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy(); 1663835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy( 16640654ece95920696c530ce1c0344365eb741f7efePaul Stewart kPath, WPASupplicant::kDBusAddr)) 1665835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart .WillOnce(Return(network_proxy)); 1666835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 1667735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 16683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 16690654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetCurrentService().get()); 16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 16720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 16730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 1674c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16763c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 1679c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 16803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1681c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 1682c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 1683c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 1684c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 1685c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_EQ(NULL, GetCurrentService().get()); 1686c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_EQ(NULL, wifi()->selected_service().get()); 1687c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 1688c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 16890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 16900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL)); 16923c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL)); 16930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 16940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 16953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 16960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 16970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 16980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 16990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 17002b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 17012b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 17022b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 170317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 17049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 170517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 170617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 17079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 17089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 170944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 171044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 171117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 171217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 171317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 171417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _)) 171517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 171617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 171717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 171817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(0); 171917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 172144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 1722a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 172344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 1724a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 1725a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1726a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 17270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 17280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 17290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 173017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 17310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 173217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart Mock::VerifyAndClearExpectations(service); 17330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 17340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 17350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 173617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 173717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 173817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 17392b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 17402b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 17412b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 17423c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 17433c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 17442b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 17452b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 174617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 174717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 17483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _)); 174917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 175017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 175117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 175217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 17533c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 175417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(NULL, GetPendingService().get()); 17550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 17580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 17593c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 17603c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service); 17613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 17620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 17673c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 17683c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL)); 17693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 17700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 17710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 17720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 17730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 17743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 17750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 17763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetCurrentService().get()); 17770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 17780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 17795c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 1780c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 17813c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 17823c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 17833c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL)); 17843c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 17853c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL); 17863c5040174273386868cc8dea8044d22c465885d8Paul Stewart 17873c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 17883c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 17893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 17903c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 17913c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 1792c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 1793b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 1794c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 17955c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 17965c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 1797549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 17983c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 17993c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 18003c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 18013c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, NULL)); 18023c5040174273386868cc8dea8044d22c465885d8Paul Stewart scoped_ptr<EndpointRemovalHandler> handler( 18033c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 18043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 18053c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 18063c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 18073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 1808549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 1809549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_TRUE(GetCurrentService() == NULL); 1810549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1811549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 1812446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 18133c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 18153c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL)); 18163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 18171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 18180654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 18191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 18200654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 18211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 18220654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 18231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 1824446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 18251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 18260654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 18271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 18283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 18291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 18303c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 1832446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 1833446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 1834cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart 18355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 1836a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 18370654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 1838ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 1839ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 1840ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 1841ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 1842ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 1843ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 1844ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 1845ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 1846ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 1847ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 1848ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 18493c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 18503c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 18513c5040174273386868cc8dea8044d22c465885d8Paul Stewart 18525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 18533c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 18540654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 18553c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 1856ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 1857ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 18585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 18595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 18603c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 18613c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 18623c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 18633c5040174273386868cc8dea8044d22c465885d8Paul Stewart 18643c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 18653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 18665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 18675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 18683c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 18693c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 18703c5040174273386868cc8dea8044d22c465885d8Paul Stewart 18715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 18725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 18735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 18745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 18755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 18765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 18775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 18785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 18795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 18805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 18815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 1883ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 18845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 18857347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _)); 18865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 18905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 18915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 18925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 18935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 18945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 18955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 18995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 19005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 19015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 19025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 19035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 19045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 19053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 19063c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 19075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 19097347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _)); 1910ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 1911ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 1912ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 1913fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 1914fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 1915fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1916fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 1917fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 19183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 1920fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 1921fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 1922fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 1923fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 1924fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 1925fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 1926fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 19275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 19285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 19295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 19305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 19315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 19339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 19347de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 19355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 19365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 19382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 19395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 19415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 19425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 1944f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1945df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1946df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 1947df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1948f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 19495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 19505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 19525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 19535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 19555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 19565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 19585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 19615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 19625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 19635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 19645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 196544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 196644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 196744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 196844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 19695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 19709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 19715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 19725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 19742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 19757de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 19765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 19785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 19795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 19815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 19825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 19835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 19845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 19865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 19880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 19895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 19915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 1992a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1993a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 19945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 19950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 19960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 19975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 20000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 20010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 20022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 20032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 20042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 20052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _)); 20062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 20075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 20082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 20092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 20105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 20115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 20120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 20135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 20145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 20150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 20162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 20170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 20182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 20190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 20205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 20215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 20227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 20237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 20247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 20257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 20267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 20277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 20280654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 20290654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 20307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 20317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 20327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 20337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 20347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 20357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2036f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 20377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 20387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 20390654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 20407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 20417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 20427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2043d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 20447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 20457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 20467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 20477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 20487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 204975a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _, _)).Times(AnyNumber()); 2050d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 20517ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 20527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2053f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2054bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2055bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2056bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 20577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 20580654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 20590654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 20600654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 20617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 20627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 20637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 20667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 20677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2068a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2069a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2070a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2071a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2072f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2073a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2074a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2075a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2076a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2077a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2078a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2079a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2080a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2081a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2082a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2083a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2084a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2085a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2086a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2087a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2088f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2089a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 20900654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 20910654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2092a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2093a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2094a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2095a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2096a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2097a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2098a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetPendingService(NULL); 2099a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2100a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2101a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 21022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2103a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 21040654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 21050654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2106a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 21070654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2108a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2109a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 21101590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 21111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 21123c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 21133c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 21143c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, NULL); 21151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 21163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)); 21173c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown)); 21180654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 21191590839e44a0e922d4763003a35dbd493509b705mukesh agrawal EXPECT_EQ(NULL, GetCurrentService().get()); 21201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal EXPECT_EQ(NULL, GetPendingService().get()); 21211590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 21221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 21231590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 21241590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 21263c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 21273c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 21283c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 21293c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, NULL, &service1)); 21303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 21311590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2132c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2133c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2134c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2135c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 21363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 21383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2139bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2140a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 21410654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 21423c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 21433c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service0); 21443c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1); 21451590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 21461590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2147e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2148e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 21490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 21500cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 21510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 21523c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 21533c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 21543c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 21553c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 21563c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 21573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 21583c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 21590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 21604eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 21614eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 21628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 21638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 21643c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 21653c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 21663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 21678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21683c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 21693c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 21703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 21713c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(NULL, GetCurrentService().get()); 21728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 21738a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 21748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 21758a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 21768a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 21773c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 21783c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 21798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 21808a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 21818a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 21824a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 21830654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 21840654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 21854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 21864d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 21874d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 21884d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 21893c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 21903c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service); 2191a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 21923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 21930654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 21944d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 21954d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 21964d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 21974a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 21984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 21993c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 22003c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service); 2201a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 22023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 22034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 22044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 22054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 22064a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 22074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2208f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 22094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 22104a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 22114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 22123c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 22133c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 22143c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 22150654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 22164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 22174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 22184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 22194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 22203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 22213c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 22223c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 22234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 22244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 22254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 22260654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 22274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 22284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 22294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 22304a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 22314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 22324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 22334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 22344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 22354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 22364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 22370654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 22384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 22393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 22403c5040174273386868cc8dea8044d22c465885d8Paul Stewart AppendBgscan(service, ¶ms); 22413c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 22424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 22434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 22444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 22450654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 22464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 22474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 22484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 22494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 22504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 22514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 22524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 22535c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 22545c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 22550654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 22565c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 22573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 22585c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 22593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service); 22605c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 22615c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 22625c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 22630654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 22645c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 22655c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 22664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 22674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2268c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2269c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 22703c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 22713c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL)); 2272c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2273c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2274c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2275c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2276c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2277c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 2278c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal Mock::VerifyAndClearExpectations(service); 2279c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2280c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2281c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2282c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 22833c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 22843c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL)); 22858f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2286c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 22878f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 22888f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 22890654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 22905519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 22913c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 22933c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 22948f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 22958f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 22965519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 22975519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 22983c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22993c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 23003c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 23010654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2302c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2303c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2304b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2305b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2306b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2307b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2308b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2309b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 2310b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2311b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2312b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2313b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2314b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2315b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2316b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 2317b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 2318b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 2319b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 2320b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 23213c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 23223c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL)); 23233c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 23243c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL))); 23253c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2326b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 2327b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 2328b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 2329b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2330b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 23315c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 23325c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 23335c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 23345c05b2920be742d518829972127172481722058dmukesh agrawal 23355c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 23365c05b2920be742d518829972127172481722058dmukesh agrawal 23375c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 23385c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 23395c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 23403c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 23415c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 23422f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 23435c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 23445c05b2920be742d518829972127172481722058dmukesh agrawal} 23455c05b2920be742d518829972127172481722058dmukesh agrawal 23465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 23475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 2348b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2349b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2350b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2351b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2352b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2353b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 23547de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 23550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2356b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 2357b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2358b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2359b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2360b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2361b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 23625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 23635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 23645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 23655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 23665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 23675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 23680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 2369df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 23705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 23715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 23725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 23735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 23745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 23755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2376b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 2377b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2378b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2379b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2380b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2381b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2382b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 2383b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 2384b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 23855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2386b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2387b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2388b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2389b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2390b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2391b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 2392b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2393b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 23943c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(DBus::Path(), NULL, NULL); 2396b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2397b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2398b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2399b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 24005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2401b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 2402b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2403b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 2404b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2405b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2406b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 2407b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2408b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2409b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2410b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2411bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal SetScanInterval(1, NULL); 2412b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2413b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2414b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2415b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 2416b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2417b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 2418b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2419b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2420b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 2421b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2422b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2423b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2424b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 2425b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2426b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 2427b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2428bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal SetScanInterval(0, NULL); 2429b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2430b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2431b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 24325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 24335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 24345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 24355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 24365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetupConnectedService(DBus::Path(), NULL, NULL); 24375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 24385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 24395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 2440a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 24415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 24425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 24435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 24445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 24455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 24465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 24475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 24485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 2449b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 2450b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2451b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 24525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 24533c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 2454df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 24553c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 24573c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 2458a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 24593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 24603c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 24615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 24620654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2463b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2464b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2465b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 2466b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 2467b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 2468b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 24693c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 2470b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2471df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 24723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 24740654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2475b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 2476b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 2477b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 24783c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 24793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart StartWiFi(); 24803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 24813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 24823c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>(); 24833c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 24843c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 24853c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 24863c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 24873c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 24883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 24893c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0); 24903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 24913c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 24923c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("Called Reassociate()."))).Times(1); 24933c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1); 24943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 24953c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnSupplicantVanish(); 24963c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 24973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0); 24983c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 24993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("Cannot reassociate."))).Times(1); 25003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 25013c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 25023c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 2503cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 2504f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2505bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 2506bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 2507cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2508cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2509bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 2510f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 25110654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2512bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2513bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 2514bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 2515bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 25161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2517bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 25181369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 2519cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2520cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2521f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 2522f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 2523f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 2524f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 2525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 2526f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 2527f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 2528f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2529f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 2530f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 2531f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 2532f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2533f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 253475a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _, _)).Times(AnyNumber()); 2535f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 2536f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 2537f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2538f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2539f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2540f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2541f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 2542f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2543f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2544f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 2545f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 2546f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 2547f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 2548f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2549f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 2550f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 2551f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 2552f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 2553f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2554f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 2555f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 2556f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 2557f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _)); 2558f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2559f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2560f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2561f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 2562f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 2563f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2564f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 2565f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _)); 2566f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2567f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(service); 2568f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 2569f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 2570f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 2571f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2572f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 2573f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 2574f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart DisconnectWithFailure(Service::kFailureBadPassphrase, _)); 2575f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 2576f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 2577f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 25781369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 2579f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2580735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2581735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2582735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 2583735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 2584735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2585bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 2586bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 2587bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2588bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2589bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 25901369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 2591bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 25921369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 2593bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2594bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2595bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 2596bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 2597bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart Mock::VerifyAndClearExpectations(service); 2598bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 2599bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 2600bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 2601bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_FALSE(SuspectCredentials(service, NULL)); 26021369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 26031369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 26041369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 2605f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 2606cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 26070654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 2608cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2609a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 2610bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2611f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 261256e322015a6955035bae144917190c9eccbd90c6mukesh agrawal EXPECT_CALL(*service, SetFailureSilent(_)).Times(0); 261356e322015a6955035bae144917190c9eccbd90c6mukesh agrawal EXPECT_CALL(*service, SetState(_)).Times(0); 2614735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2615cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2616f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 26170654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 26181369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 26191369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 26201369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 2621f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 26221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 26231369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 2624735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 2625735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 26261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(*service, SetFailureSilent(_)).Times(0); 26271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(0); 2628735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 2629735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 2630735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 2631735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 2632735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 2633bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 2634735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 26351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 263639a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 2637735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 26380654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2639cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 2640cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 2641e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 2642e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 26431aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 2644e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 26451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 2646e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2647e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 2648e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 2649e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2650e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 2651e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 2652e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 26531aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 2654e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 2655e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 2656e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 2657e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2658e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 2659e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 2660e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 2661e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 2662e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 2663e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 2664e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 2665e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 2666e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 2667e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 2668e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2669e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2670e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 2671e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 2672e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2673e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 2674e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2675e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 2676e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 2677e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 2678e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2679e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 2680e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 2681e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 2682e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 2683e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 2684e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 26851aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 2686e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // This PostTask is a result of the call to Scan(NULL), and is meant to 2687e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 2688e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 2689e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2690e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2691e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 2692e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 2693e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2694e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 2695e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2696e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 2697e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 2698e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 2699e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 2700e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 2701e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 2702e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 2703e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 2704e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 27051aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 27061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 27071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 27083c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 27093c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 27101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 27111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 27121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 27131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 27141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 27151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 27161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 27171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 27181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 27191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 27201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 27211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 27221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 27231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 27241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 27251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 27261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 27271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 27281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 27291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 27301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 27311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 27321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 27331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 27347cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 27357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 27367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 27377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 27397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 27407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 27417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 27427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 27437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 27447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _)).Times(0); 27467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 27477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 27487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 27507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 27517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(NULL); 27527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 27537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 27557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 27567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 27577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 27587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 27597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 27617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 27627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 27637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 27647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 27657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 27667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 27677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 27687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 27707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 27717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 27727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _)); 27737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 27747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 27757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 27767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 27777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 27787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 27797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 27807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 27817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 2782baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 2783baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 2784baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 2785baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 27867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 27877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 27887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 27897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 27907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 27917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 27927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 27937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 27947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 27957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 27967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 2797baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 27987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 2799baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 2800baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 2801baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 2802baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 2803baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 2804baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 2805baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 2806baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 2807baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 2808baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 2809baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 2810baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 2811baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 2812baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 2813baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 2814baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 2815baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 2816baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 2817baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 2818baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 2819baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 2820baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 2821baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 2822baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 2823baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 2824baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 2825baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 2826baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 2827baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 2828baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 2829baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 2830baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 2831baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 2832baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 2833baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 2834baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 2835baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 2836baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 2837baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 2838baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 2839baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 2840baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 2841baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 2842baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 2843baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 2844baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 2845baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 2846baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 28477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 28487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 28497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 28507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 28517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 28527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 28537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 2854baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 2855baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 2856baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 2857baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 2858baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 2859baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 2860baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 2861baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 2862baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 2863baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 2864baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 2865baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 2866baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 2867baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 2868baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 2869baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 2870baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 2871baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 2872baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 2873baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 2874baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 2875baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 2876baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 2877baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 2878baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 2879baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 2880baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 28817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 28827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 2883bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 2884f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2885bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 2886bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2887bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 2888bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 2889bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 2890bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2891bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 2892bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2893bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 2894bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 2895bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2896bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 2897bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2898bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const uint32 kDepth = 123; 28990654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 2900bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2901bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 2902bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 2903bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2904bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 2905bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2906bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 29070654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 2908bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 2909bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 2910bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 2911db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 2912db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 2913db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 291411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 2915db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 2916db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 2917735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 2918735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 2919735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 2920735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 2921db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 2922db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2923db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 2924f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 2925db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 2926735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 2927db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 2928735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 2929735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(service); 2930735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 2931db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 2932735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 2933735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 2934735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 2935735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _)); 2936735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 293711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 293811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 293911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 294011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 294111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 294211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 294311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 294411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 294511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 294611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 294711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 294811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, _)); 294911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 295011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 295111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 295211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 295311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 295411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 295511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 295611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 295711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0); 295811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 295911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 296011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 296111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 296211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 2963bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 2964bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 2965c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 2966c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 2967c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 2968c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 2969c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 2970c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 2971c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 2972c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 2973c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 2974c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 2975c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 2976c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 29776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 29786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 29796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 29806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 29816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 29826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah uint16 frequency; 29836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 29846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 29856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 29866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 29876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 29886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 29896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 29906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 29916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 29926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 29936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 29946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 29956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 29966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 29976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 29986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 29996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 30006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 30016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 30026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 30036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 30046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 30056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 30066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 30076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 30086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 30096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 30106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 30116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 30126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 30137347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 30147347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 30156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 30165581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 30175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 30185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 30205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 30215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 30225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 30235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 30265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 30275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 30280654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 30295581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 30305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 30315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 30325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 30345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 30355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 30360654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 30370654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 30380654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 30390654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 30400654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 30410654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 30420654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 30430654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 30445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 30455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 30545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 30565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 30575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 30580654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 30590654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 30605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 30615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 30635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 30655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 30665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 30670654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 30680654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 30695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 30705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 30725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 30745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 30755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 30760654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 30770654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 30785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 30795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 30825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 30835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 30845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 30855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 30865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 30875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 30885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 30895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 309050cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 309150cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 309250cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 309350cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 309450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 3095bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 3096bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 3097bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 3098bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 3099bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3100bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3101bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const uint16 kKnownScanInterval = 4; 3102bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3103bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3104bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3105bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3106bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3107bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3108bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3109bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3110bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 3111bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3112bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3113bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const int32 kKnownSignalThreshold = 4; 3114bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3115bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3116bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3117bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 3118bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 3119bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3120bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3121bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 3122bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 3123bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3124bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 3125bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 3126bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 3127bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 3128bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 3129bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 31300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 31310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31320cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 31339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 31340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 3135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 31400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 31410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 31427de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 31440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 31450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 31470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 31480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 31490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31500cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 31519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 31520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 31530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 31549f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 31559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 31569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 31570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3159a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 31600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3161a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3162a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3163a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 31640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 31650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 31660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 31670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 31680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 31700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 31710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 31720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31730cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 31749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 31750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 31760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 31779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 31789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 31790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 3181a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 31820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 3183a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3184a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3185a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 31860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 31870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 31880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 31890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 31900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 31910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 31920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 31930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 31940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 3195df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 31969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 31989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 31999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 3200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 3202a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3203a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 3204a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 32059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3206df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3209df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 3210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 3211df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 3212df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 3213df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3214df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3216df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3218b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 3219b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3220b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 3221df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 3222b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 3223b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 3225df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3226df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 3227df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3228a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3230b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 3231b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 3232b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 3233b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 3234df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 3235df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3236df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 3237df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 3238df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3239a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 3240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 3241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3242df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3243df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 3244df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3245df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3246df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 3247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Test for SetPendingService(NULL), condition a) 3248df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 32499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3250df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3251df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 3252a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3253a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 3255df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), NULL, NULL)); 3256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 3257df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3258df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 3259a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3260a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 32619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 3262df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3264df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3265df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 3266df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 3267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 3268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), NULL, NULL)); 3269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3270df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3271df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 3272df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(NULL, GetCurrentService().get()); 3273df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3274a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3275a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 3276df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3277df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3278df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 32799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3280df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3281a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3282df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 3283df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 3284df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 3285df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 3286df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 3287df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3288df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3289df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3290f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 3291f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3292a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 3293df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 3294df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3295df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 3296df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3297df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3298df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 3299df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Test for SetPendingService(NULL), condition d) Disconnect while scanning. 3300df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 33019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 3302df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3303df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 3304df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 3305a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3306a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3307f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3308df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 3309df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 3310df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3311df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 3312a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3313df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 3314df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 3315df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3316df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3317df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3318df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3319df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3320df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 3321df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 3322f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 3323a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 3324a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 33252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 3326df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 3327a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 3328a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 3329a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 3330a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 3331df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 3332df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 3333a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3334df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3335df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 3336a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3337df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 3338df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 3339df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 3340a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 3341df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3342df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 3343df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3344df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 3345df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 3346df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 3347df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 3348df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 3349df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 3350df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 3351a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 3352df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 3353df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 3354df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 3355df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3356df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 3357df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 3358df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 33593bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 33603bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 33613bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart SetupConnectedService(DBus::Path(), NULL, NULL); 33623bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 33633bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 33643bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 33652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 33663bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 33673bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 33683bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 33693bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 33707de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 33713bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 33723bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 33733bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 33743bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 33752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 33762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 33772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 33782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 33792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 33802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 33812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 33822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 33832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 33842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 33852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 33862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 33872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 33882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 33892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 33902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 33912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 33922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 33932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 33942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 33952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 33962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 33972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 33982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 33992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 34002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 34012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 34022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 34032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 34042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 3405c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 3406df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 3407df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 3408df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3409df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3410df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3411df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3412df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3413df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3414df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3415df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 3416df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 3417df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3418df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3419df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3420df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3421df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3422df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3423df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3424df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3425df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 3426df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 3427df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3428df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3429df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 3430df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3431df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 3432df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3433df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3434df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3435df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3436df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 3437df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 3438df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3439df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3440df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3441df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 3442df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 3443df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 3444df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3445df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3446df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 3447df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 3448df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3449df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 3450df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 3451c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 3452c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 3453c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const char kPeer[] = "peer"; 3454c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3455c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3456c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3457c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 3458c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 3459c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3460c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3461c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 3462c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 3463c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 3464c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3465c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3466c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3467c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3468c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3469c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3470c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3471c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3472c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3473c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3474c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3475c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3476c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 3477c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3478c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3479c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3480c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3481c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 3482c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3483c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3484c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3485c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3486c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3487c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3488c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3489c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3490c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3491c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3492c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3493c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3494c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 3495c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3496c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3497c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3498c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3499c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3500c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 3501c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 3502c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 3503c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 3504c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 3505c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 3506c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 3507c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3508c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 3509c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3510c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 3511c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3512c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 3513c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3514c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3515c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3516c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3517c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3518c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 3519c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3520c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3521c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3522c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3523c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3524c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3525c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 3526c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3527c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3528c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3529c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3530c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 3531c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 3532c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 3533c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 3534c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 3535c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 3536c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3537c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3538c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 3539c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 3540c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3541c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 3542c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 3543c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 3544c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 3545c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 3546c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 3547c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 3548853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 3549